在我是項目開發中用到Socket收發客戶端消息,發現在開發環境中,ws服務頻繁收到客戶端斷開、重連問題,最后利用nginx代理websocket的時候,發現客戶端和服務器握手成功后,如果在60s時間內沒有數據交互,連接就會自動斷開。
如果需要保持長連接,可以采取來兩種方式.
1.nginx.conf 設置proxy_read_timeout時長。配置如下:
server { listen 80; server_name carrefourzone.senguo.cc; #error_page 502 /static/502.html; location /static/ { root /home/chenming/Carrefour/carrefour.senguo.cc/source; expires 7d; } location /ws { proxy_pass_header Server; proxy_set_header Host $http_host; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; proxy_pass http://127.0.0.1:9887; proxy_http_version 1.1; proxy_set_header Upgrade "websocket"; proxy_set_header Connection "Upgrade"; proxy_read_timeout 600s; } }
這種方式只能維持在設置的時間短內長連接。
2.客戶端發心跳
在客戶端ws服務類中定時添加發送檢測心跳消息即可(定時時長需小於nginx設置時長),代碼如下:
ws.publish({ type:'ping' })