fnos自带了ddns,配置方便,用起来也很方便。但我不像把fnos暴露到公网,而且我在局域网中已经部署了一个虚拟机专门用来做反代,所以想把fnos的入口也整合到一起。

但是fnos用nginx做了反代以后会无法访问,具体表现就是卡在【加载中】最后显示断开连接。

在网上搜索一番,看了官方论坛里的一些答疑,确认了是我的nginx配置中没有开启websocket的支持,只需要加上以下三行配置即可

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

配置说明

  1. proxy_http_version 1.1;

    • WebSocket 协议依赖 HTTP/1.1 的 Upgrade 机制,因此需要明确指定 Nginx 使用 HTTP/1.1 协议与后端服务器通信。
    • 默认情况下,Nginx 可能使用 HTTP/1.0,而 HTTP/1.0 不支持 Upgrade 头,因此必须设置为 1.1
  2. proxy_set_header Upgrade $http_upgrade;

    • 用途:将客户端发送的 Upgrade 请求头(如 websocket)转发到后端服务器。
    • 作用:WebSocket 协议的建立需要客户端发送 Upgrade: websocket 请求头,告诉服务器需要切换协议。Nginx 作为反向代理,必须将这个头传递给后端,确保后端知道客户端请求的是 WebSocket 协议。
    • $http_upgrade 是 Nginx 的变量,表示客户端请求中 Upgrade 头的值。如果没有 Upgrade 头,$http_upgrade 为空。
  3. 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就可以正常访问了。

🎉


参考文章

  1. nginx websocket配置
  2. 飞牛页面在Nginx反向代理下无法加载

喝杯奶茶