除以下事項外,仍有一點需要注意:nginx 連接時長默認為60S 超過時間后自動斷開websocket,可在前臺進行輪詢(心跳)配合websocket實現(xiàn)長連接
要將客戶端和服務(wù)器之間的連接從HTTP / 1.1轉(zhuǎn)換為WebSocket,請使用HTTP / 1.1中提供的協(xié)議交換機制。
然而,有一個微妙之處:由于“升級”是?逐跳?標(biāo)頭,因此它不會從客戶端傳遞到代理服務(wù)器。通過轉(zhuǎn)發(fā)代理,客戶端可以使用該CONNECT?方法來規(guī)避此問題。但是,這不適用于反向代理,因為客戶端不知道任何代理服務(wù)器,并且需要在代理服務(wù)器上進行特殊處理。
從版本1.3.13開始,nginx實現(xiàn)了特殊的操作模式,如果代理服務(wù)器返回帶有代碼101(交換協(xié)議)的響應(yīng),則允許在客戶端和代理服務(wù)器之間建立隧道,并且客戶端要求通過請求中的“升級”標(biāo)頭。
如上所述,包括“升級”和“連接”的逐跳報頭不會從客戶端傳遞到代理服務(wù)器,因此為了讓代理服務(wù)器知道客戶端將協(xié)議切換到WebSocket的意圖,這些報頭必須明確傳遞:
location /chat/ {
? ? proxy_pass http://backend;
? ? proxy_http_version 1.1;
? ? proxy_set_header Upgrade $http_upgrade;
? ? proxy_set_header Connection "upgrade";
}
一個更復(fù)雜的示例,其中對代理服務(wù)器的請求中的“連接”標(biāo)頭字段的值取決于客戶端請求標(biāo)頭中是否存在“升級”字段:
http {
? ? map $http_upgrade $connection_upgrade {
? ? ? ? default upgrade;
? ? ? ? ''? ? ? close;
? ? }
? ? server {
? ? ? ? ...
? ? ? ? location /chat/ {
? ? ? ? ? ? proxy_pass http://backend;
? ? ? ? ? ? proxy_http_version 1.1;
? ? ? ? ? ? proxy_set_header Upgrade $http_upgrade;
? ? ? ? ? ? proxy_set_header Connection $connection_upgrade;
? ? ? ? }
? ? }
默認情況下,如果代理服務(wù)器在60秒內(nèi)未傳輸任何數(shù)據(jù),則將關(guān)閉連接。使用proxy_read_timeout指令可以增加此超時??;蛘撸矸?wù)器可以配置為定期發(fā)送WebSocket ping幀以重置超時并檢查連接是否仍然存在。
引自官網(wǎng)nginx代理websocket