起因是今天剛部署項目的時候小伙伴反應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