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就可以正常访问了。
🎉
参考文章
喝杯奶茶

