fnOS使用nginx反代后无法访问的问题解决
fnos自带了ddns,配置方便,用起来也很方便。但我不像把fnos暴露到公网,而且我在局域网中已经部署了一个虚拟机专门用来做反代,所以想把fnos的入口也整合到一起。
但是fnos用nginx做了反代以后会无法访问,具体表现就是卡在【加载中】
最后显示断开连接。
在网上搜索一番,看了官方论坛里的一些答疑,确认了是我的nginx配置中没有开启websocket的支持,只需要加上以下三行配置即可
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
配置说明
-
proxy_http_version 1.1;
- WebSocket 协议依赖 HTTP/1.1 的
Upgrade
机制,因此需要明确指定 Nginx 使用 HTTP/1.1 协议与后端服务器通信。 - 默认情况下,Nginx 可能使用 HTTP/1.0,而 HTTP/1.0 不支持
Upgrade
头,因此必须设置为1.1
。
- WebSocket 协议依赖 HTTP/1.1 的
-
proxy_set_header Upgrade $http_upgrade;
- 用途:将客户端发送的
Upgrade
请求头(如websocket
)转发到后端服务器。 - 作用:WebSocket 协议的建立需要客户端发送
Upgrade: websocket
请求头,告诉服务器需要切换协议。Nginx 作为反向代理,必须将这个头传递给后端,确保后端知道客户端请求的是 WebSocket 协议。 $http_upgrade
是 Nginx 的变量,表示客户端请求中Upgrade
头的值。如果没有Upgrade
头,$http_upgrade
为空。
- 用途:将客户端发送的
-
proxy_set_header Connection "upgrade";
- 用途:将客户端的
Connection
请求头设置为upgrade
,并转发到后端服务器。 - 作用:WebSocket 协议要求 HTTP 请求头中的
Connection: Upgrade
来指示协议切换。Nginx 需要显式设置Connection
头为"upgrade"
,以确保后端服务器能够正确识别 WebSocket 请求。 - 注意:这里直接设置为
"upgrade"
,而非使用变量$http_connection
,是因为 WebSocket 协议明确要求Connection
头值为upgrade
,无需动态获取。
- 用途:将客户端的
完整的nginx配置如下:
location /websocket_path {
proxy_pass http://backend_server;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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_set_header X-Forwarded-Proto $scheme;
}
修改配置后重启nginx即可,fnos就可以正常访问了。
🎉