nginx下配置WebSocket連線錯誤Error:Unexpected response code 404
阿新 • • 發佈:2021-07-02
起因是今天剛部署專案的時候小夥伴反應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