frp 配置多个 web 项目,无需购买域名

简单配置,参考

前言:

网上也有很多教程包括官方文档,都需要购买域名,并且把 frpc.ini 中 [web]节配置的  custom_domains 的值解析到外网的服务器,多个web项目需要多个 custom_domains(每个web项目保证唯一),统统把这些 custom_domains 解析到外网服务器,然后就可以使用,使用方式就是 custom_domains:vhost_http_port,就可以实现多个web项目的访问。

下面的方法不需要购买域名和域名解析服务,也可以实现多个web项目内网穿透使用

提出解决方法依据的原理(想快速解决问题,请跳过)

疑问: frp软件尽管配置了 custom_domains,但是统统解析到了同一台外网服务器,那为什么可以实现请求统一端口(frps.ini common 中的vhost_http_port ) 来达到访问不同web项目的需求呢?

1. 首先,我们都知道浏览器输入一个 url 的访问过程,如果是使用域名访问,那么首先需要解析域名获得真实的IP地址然后,通过TCP报文来发送。那么神奇的地方就来了,我们在 frpc.ini 中把所有的 web 项目的 custom_domains 都解析到了同一个 IP地址,并且 frps.ini 提供web访问的端口只有一个(vhost_http_port),按照socket建立连接,我们有了(IP,Port)这个元组就可以唯一确定这个连接了,因此我们可以断定所有配置的内网的web项目全部使用这一个socket完成

2. 那使用一个socket链接如何区分不同的内网web项目呢?

回想 frpc.ini ,我们在这里配置了不同的 custom_domains, 这就是关键,fpr server只有通过这个标识才能分发不同的数据到不同的web项目。因此,在我们通过 custom_domains:vhost_http_port 来访问目的 web项目时候,必要要保证   custom_domains  被传递到了 frp server,这样才能被分发。frp软件采用http中host字段来保证这个事情,当我们使用浏览器请求目标网站,浏览器自动把目的RUL域名填到 http request header 的host字段。因此,当这个请求到达 frp server的时候,只要通过查找与 request header host 对应的 web项目即可,这样就实现了一个端口分发的问题。(类似于Nginx中端口分发,只不过那里使用的 url 前缀进行分发,这里使用的 request header host 字段)

3. 看到这里你就明白该怎么做了(笑)

我们只要配置本机的 host 文件,追加每个 custom_domains 到 公网服务器的解析即可

通过这样就可以达到,custom_domains 被顺利放在 请求的header host字段,并且也不需要购买域名实现本地解析。

=========== 实践派 ==============

一、配置  frpc.ini [common]server_addr = xx.xx.xx.xx


[common]
server_addr = xx.xx.xx.xx
server_port = 7000


[ssh_sx]
type = tcp
local_ip = 127.0.0.1
local_port =
remote_port = [web_9990]
type = http
local_ip = 127.0.0.1
local_port = 9990 #网站使用的端口
custom_domains = a.free.domain #随便写个域名保证唯一 [web_9991]
type = http
local_ip = 127.0.0.1
local_port = 9991 #网站使用的端口
custom_domains = b.free.domain
#随便写个域名保证唯一

二、配置服务器 frps.ini

[common]
bind_port =
vhost_http_port =

二、 重新启动客户端软件 ./frpc -c frpc.ini  重新启动服务端软件 ./frps -c frps.ini

三、配置本地host文件

windows : C:\Windows\System32\drivers\etc\hosts

linux:  /etc/hosts

追加

xx.xx.xx.xx  a.free.domain
xx.xx.xx.xx b.free.domain

xx.xx.xx.xx 是你的公网服务器IP 地址

刷新 host文件,使得新配置生效

windows: ipconfig.exe /flushdns

linux: systemctl restart nscd

四、打开浏览器

输入: a.free.domain:8080  即可访问 web项目 web_9990

输入: b.free.domain:8080  即可访问 web项目 web_9991

custom_domains

frp 配置多个 web 项目,无需购买域名 (访问内网可视化界面,jupyter noterbook, visdom, tensorboard)的更多相关文章

  1. 一个tomcat服务器上部署多个Web项目,不同域名访问

    [参考]一个tomcat服务器上部署多个项目,不同域名访问 我们一个服务器只按装了一个tomcat服务器,现在有多个项目或者多个域名访问,下面来进行配置 在这里我们只需要修改conf下的server. ...

  2. tomcat发布web项目,支持域名

    首先需要安装JDK,不是Linux自带的OpenJDK,参考下面的文章: centos下 安装jdk 设置java环境变量:编辑这个/etc/profile文件: export JAVA_HOME=/ ...

  3. 关于idea中,web项目启动tomcat,访问资源报错404

    背景: web项目启动tomcat,访问相应的资源,报错404,前提资源路径是没错的. 原因: 1.确定是不是web项目 不是的话: 配置web-inf的路径和webroot(web根目录)的路径 2 ...

  4. 基于frp的内网穿透实例1-通过SSH访问内网机器

    原文地址:https://wuter.cn/1804.html/ 老母鸡终于到了,作为一个能运行linux系统的四核1G硬件,它还是比较小巧的. FRP 全名:Fast Reverse Proxy.F ...

  5. 一款带Web面板的轻量级、高性能内网穿透工具:nps使用教程

    说明:内网穿透工具之前已经介绍了不少了,比如Frp.lanproxy.Holer等,现在再介绍个带Web面板的穿透工具nps,之前叫easyProxy,只是改名了而已,该工具是一款使用go语言编写的轻 ...

  6. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  7. [笔记] 使用frp从外网访问内网

    之前尝试过otunnel,也记录过使用方法,见[笔记] 使用otunnel从外网访问内网,但是用了几天发现还是不够稳定. 然后尝试frp,发现性能稳定,够用,将过程及配置分享在这里吧. 需求 内网机器 ...

  8. 内网客户 通过 公网域名/ip 访问内网web服务器 出错

    在一内部局域网中, client  内网地址为 10.0.0.2     web  服务器内网地址为 10.0.0.1    外网地址为  211.6.15.1    域名为  xx.love.com ...

  9. p2p-tunnel 打洞内网穿透系列(三)TCP转发访问内网web服务

    系列文章 p2p-tunnel 打洞内网穿透系列(一)客户端配置及打洞 p2p-tunnel 打洞内网穿透系列(二)TCP转发访问远程共享文件夹 p2p-tunnel 打洞内网穿透系列(三)TCP转发 ...

随机推荐

  1. Zookeeper 集群的安装及高可用性验证已完成!

    安装包 kafka_2.12-0.10.2.0.tgz zookeeper-3.3.5.tar.gz Java 环境 Zookeeper 和 Kafka 的运行都需要 Java 环境,Kafka 默认 ...

  2. neo4j APOC与自定义存储过程环境搭建

    neo4j APOC与自定义存储过程环境搭建 主要参考资料:APOC官网https://neo4j-contrib.github.io/neo4j-apoc-procedures/APOC介绍 PPT ...

  3. Windows IIS7 下安装配置 PHP7.0

    确认Microsoft Visual C++版本 Microsoft Visual C++的版本至关重要,根据Microsoft Visual C++版本下载的PHP不同.        PHP官网的 ...

  4. 【目录】循序渐进学.Net Core Web Api开发系列

    当前标签: 循序渐进学.Net Core Web Api开发系列   循序渐进学.Net Core Web Api开发系列[16]:应用安全续-加密与解密 NET未来之路 2019-03-13 15: ...

  5. JUnit中Assert简单介绍

    junit中的assert方法全部放在Assert类中,总结一下junit类中assert方法的分类.1.assertTrue/False([String message,]boolean condi ...

  6. Groovy学习:第四章 Groovy特性深入

    作者:chszs 1. 断言 Java开发者常常使用JUnit或TestNG做单元测试,所以对断言是很清楚的.断言是用于验证假设的条件是否为真.在Groovy的断言中,如果假设的条件不为真,那么就会抛 ...

  7. Lock中使用Condition实现等待通知

    Condition类有很好的灵活性,可以实现多路通知功能,一个Lock对象中可以创建多个Condition对象实例,线程对象可以注册在指定的Condition中,进而有选择的进行线程通知,在调度线程上 ...

  8. shell 脚本文件类型.sh ,变量

    1. shell脚本编程的基本过程 (1)建立shell文件,以 .sh 结尾的文件 (2)赋予shell文件执行权限,chmod 0777 文件名 (3)执行shell文件, ./ 文件名 或者ba ...

  9. C基础学习记录

    函数 1:子函数定义的变量只在调用的时候才会分配空间,调用结束后会收回空间. 2:在调用子函数时只会向函数传递值,是单向传递的. 3.返回值的类型一般与函数的类型一致,如果不一致会以函数类型为准. 4 ...

  10. python字典拼接方法

    python的dict拼接有多种方法,其中一种很好用而且速度非常快: x = {**a, **b} 效果等价于: x = a.copy() x.update(b) 注意update()是没有返回值的 ...