Nginx支持WebSocket配置


記錄一下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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM