https://github.com/fatedier/frp 是一个款广受好评的反向代理工具,主要用来实现内网穿透。配置简单,照着官方事例几分钟就能学会,而且性能非常的好。可以把家里的主机、树莓派什么的,映射到公网 VPS 的 IP 上去。

具体的简要教程我就不赘述了,官方教程浅显易懂。这里我分享一点点自己的使用心得:

如何在 80 端口被其他服务占用的情况下,把多个域名解析到这台公网主机上,然后再反向代理到一台、或多台内网设备上

公网主机

在公网 IP 这台部署了 frps 服务的主机上,安装一个 nginx,再其中配置 N 个虚拟服务器,利用 proxy_pass 代理到 localhost 的同一个端口上:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
server {
listen 80;
server_name main.domain.com;

location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_buffering on;
proxy_pass http://localhost:8080;
}
}

server {
listen 80;
server_name main2.domain.com;

location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_buffering on;
proxy_pass http://localhost:8080;
}
}

与此同时,公网 VPS 上的 frps.ini 当中的 vhost_http_port 配置项,也要设置为 8080

内网主机

而内网的各个主机,frpc.ini 配置当中,需要把不同 http 服务名字区分开,切记不得重复。且同一主机上的 local_port 也不得重复,比如我用 docker 在内网某主机上部署了很多不同端口的 web 服务,只需要 docker 配置好宿主机的不同端口即可,同时在 frpc.ini 配置里也映射好 端口域名 的关系。

1
2
3
4
5
6
7
8
9
[web_main]
type = http
local_port = 8080
custom_domains = main.domain.com

[web_main2]
type = http
local_port = 8081
custom_domains = main2.domain.com