1. 程式人生 > 其它 >nginx下配置WebSocket連線錯誤Error:Unexpected response code 404

nginx下配置WebSocket連線錯誤Error:Unexpected response code 404

起因是今天剛部署專案的時候小夥伴反應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