記錄一下Nginx代理WebSocket的配置
1 添加協議升級
在http模塊添加協議升級配置
http {
... // 省略其它
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
}
該配置用於將http協議升級為websocket協議
map說明:根據客戶端請求中$http_upgrade的值,設定$connection_upgrade的值。{}
內容是設定規則。即$connection_upgrade的值默認是upgrade;如果$http_upgrade為空字符串,則$connection_upgrade的值是close。
2 添加虛擬主機配置
server {
listen 8000;
server_name 127.0.0.1;
... // 省略其它
location /ws/ {
proxy_pass http://wsserver/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
}
}
upstream wsserver {
server 127.0.0.1:10101;
server 127.0.0.1:10102;
}
前端或其他應用可以通過ws://127.0.0.1:8000/ws/wsServer
訪問該服務
3 超時中斷問題
Nginx默認超時時間為60s。
當Nginx代理websocket,客戶端與服務端建立連接后,若60s內無交互,則nginx會斷開此連接。
為了解決這個問題,我們可以配置超時時間。
location /ws/ {
... // 省略其他
proxy_connect_timeout 4s;
proxy_read_timeout 600s; # 10分鍾無消息交互關閉連接
proxy_send_timeout 12s;
}
這樣10分鍾無交互才會斷開。
但依舊不妥,如果應用程序就是11分鍾才來消息呢。我們可以讓客戶端定時發送一個心跳。以前端為例:
// 每5分鍾發送一次心跳
function keepSocket() {
window.setInterval(function(){
socket.send('ping');
}, 300000);
}
ps: 后台接收到ping
后可以回復一個pong