nginx下配置WebSocket连接错误Error:Unexpected response code 404

时间:2024-03-06 09:58:09

起因是今天刚部署项目的时候小伙伴反应websocket连不上了,但是这个项目部署在其他服务器下是ok的,莫非玄学?也可能是缺什么东西

先wscat连接检查一下

显示连接Error:Unexpected response code 404

由于网络环境是内网,所以看下是不是网络问题,用ip+端口测试访问正常,那么我们可以断定是Nginx代理配置方面的问题

我的conf结构为:

server{
    listen  80;
    server_name 1.test.com;
     location /  {
        proxy_pass http://127.0.0.1:8888; 
     }
 }

查了一下有关websocket的nginx官方相关文档:http://nginx.org/en/docs/http/websocket.html

大概的意思是为了让升级的服务器了解客户端将协议切换到 WebSocket 的意图,必须明确传递这些标题

默认情况下,如果预接的服务器在 60 秒内不传输任何数据,则连接将关闭。此超时可以通过proxy_read_timeout指令增加。或者,可以配置已增殖的服务器,定期发送 WebSocket ping 帧来重置超时并检查连接是否仍然有效。

那么我们添加一下配置:

    location / {
     proxy_pass http://127.0.0.1:8888;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
         
        proxy_connect_timeout 4s; 
        proxy_read_timeout 7200s; 
        proxy_send_timeout 12s;

        proxy_set_header    Host             $host;#保留代理之前的host
        proxy_set_header    X-Real-IP        $remote_addr;#保留代理之前的真实客户端ip
        proxy_set_header    X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header    HTTP_X_FORWARDED_FOR $remote_addr;#在多级代理的情况下,记录每次代理之前的客户端真实ip
        proxy_set_header X-Forwarded-Proto $scheme; #表示客户端真实的协议(http还是https)
        proxy_redirect      default;#指定修改被代理服务器返回的响应头中的location头域跟refresh头域数值

    }

reload一下,就可以成功连接咯,无视用同一张图,xixi