【已解决】frp代理内网websocket,结合nginx使用
- 经验分享
- 时间:2023-08-13 18:16
- 3052人已阅读
🔔🔔🔔好消息!好消息!🔔🔔🔔
有需要的朋友👉:联系凯哥
A主机,带有公网ip,安装有nginx,ip解析到域名www.a.com
B主机是局域网内的一台主机,部署有一套前后端分离的项目,vue+springboot,安装有nginx
A主机中frps.ini配置参数如下:
[common] bind_addr = 0.0.0.0 bind_port = 7000 vhost_http_port = 6099 authentication_method = token token = 12345678 heartbeat_timeout = 90 user_conn_timeout = 10 tcp_mux = true
B主机中frpc.ini配置参数如下:
[common] server_addr = x.x.x.x # A主机IP server_port = 7000 authentication_method = token token = 12345678 protocol = tcp tcp_mux = true [web] type = http local_port = 80 # 这个端口是B主机上安装的nginx端口 custom_domains = www.a.com # A主机IP对应的解析域名 locations = /
A主机上nginx配置如下:
牵涉到80端口问题,所以配置的是nginx和frp共享80端口
server { listen 80; server_name www.a.com; location / { proxy_pass http://127.0.0.1:6099; # 监听的是frps中vhost_http_port配置的端口 proxy_redirect http://$host/ http://$http_host/; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; } }
B主机上nginx代理配置如下:
http { .... map $http_upgrade $connection_upgrade { default upgrade; '' close; } server { listen 80; server_name x.x.x.1; # B主机ip # 前端项目 location / { root /usr/local/nginx/html/; index index.html index.htm; if (!-e \$request_filename) { rewrite ^(.*)\$ /index.html?s=\$1 last; break; } } # 代理websocket location /websocket/ { proxy_pass http://127.0.0.1:8094/websocket/; proxy_read_timeout 300s; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; } # 代理后端项目 location /single { proxy_pass http://127.0.0.1:8094/; proxy_set_header Host single-system; proxy_set_header X-Real-IP \$remote_addr; proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; } }
目前遇到的问题:
在B主机上不开启frpc服务,通过浏览器访问B主机ip进而访问项目,一切正常,websocket也能正常通信使用
在B主机上开启frpc后,通过浏览器访问A主机ip解析的域名www.a.com进而访问项目,其他功能都正常,但是websocket无法跟服务端通信。
单独使用websocket客户端软件进行连接测试,
当地址是B主机IP的时候可以连接成功并进行通信。比如:ws://x.x.x.1/websocket/1111111
但是当把地址换成A主机IP解析的域名后进行通信,比如:ws://www.a.com/websocket/1111111,报错如下:
我的理解是在A主机的nginx上收到websocket的有关请求后,不知道如何处理才报错的。但是我这边不知道要咋配置这个请求处理。
如果在A主机的nginx上配置websocket有关的,就像B主机那样的,那B主机上的frpc是否还得再增加有关配置,增加啥样的配置?
实践操作:
上述理解是正确的,确实需要在A主机的nginx中配置websocket有关的。
配置后的结果如下:
# 跟原有相比,多个这个map $http_upgrade $connection_upgrade { default upgrade; '' close; } server { listen 80; server_name jdd.frptest.com; location / { proxy_pass http://127.0.0.1:6099; proxy_redirect http://$host/ http://$http_host/; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; } # 跟原有相比,多了这个,注意还是监听的vhost_http_port 6099端口,后面有路径 location /park-single/websocket/ { proxy_pass http://127.0.0.1:6099/park-single/websocket/; proxy_read_timeout 300s; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; } }
B主机的frpc中配置修改如下:
[web] type = http local_port = 80 # 这个端口是B主机上安装的nginx端口 custom_domains = www.a.com # A主机IP对应的解析域名 locations = /,/park-single/websocket/ # 多了这个路径
然后使用客户端测试,(实际跟上述说明的地址有些变动)