實現方案
采用目前比較成熟的WebSocket技術,WebSocket協議為創建客戶端和服務器端需要實時雙向通訊的webapp提供了一個選擇。其為HTML5的一部分,WebSocket相較于原來開發這類app的方法來說,其能使開發更加地簡單。大部分現在的瀏覽器都支持WebSocket,比如Firefox,IE,Chrome,Safari,Opera,并且越來越多的服務器框架現在也同樣支持WebSocket。
WebSocket集群
在實際的生產環境中,要求多個WebSocket服務器必須具有高性能和高可用,那么WebSocket協議就需要一個負載均衡層,NGINX從1.3開始支持WebSocket,其可以作為一個反向代理和為WebSocket程序做負載均衡。
Nginx配置
注:看官方文檔說 Nginx 在 1.3 以后的版本才支持 websocket 反向代理,所以要想使用支持 websocket 的功能,必須升級到 1.3 以后的版本
NGINX通過允許一個在客戶端和后端服務器之間建立的隧道來支持WebSocket。為了NGINX發送來至于客戶端Upgrade請求到后端服務器,Upgrade和Connection頭部必須被設置明確。
代碼實例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
upstream wsbackend { server 127.0.0.1:8080; server 127.0.0.1:8081; } server { listen 80; server_name ws.52itstyle.com; location / { proxy_pass http://wsbackend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } |
前端配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
$( function (){ socket.init(); }); //Nginx反向代理實現websocket var basePath = "ws://ws.52itstyle.com//acts_competition/" ; socket = { webSocket : "" , init : function () { if ( 'WebSocket' in window) { webSocket = new WebSocket(basePath+ 'webSocketServer' ); } else if ( 'MozWebSocket' in window) { webSocket = new MozWebSocket(basePath+ "webSocketServer" ); } else { webSocket = new SockJS(basePath+ "sockjs/webSocketServer" ); } webSocket.onerror = function (event) { //alert("websockt連接發生錯誤,請刷新頁面重試!") }; webSocket.onopen = function (event) { }; webSocket.onmessage = function (event) { }; }, sendData : function (data) { webSocket.send(data); }, } |
最后,重啟下Nginx即可。
反向代理服務器在支持WebSocket時面臨的挑戰
- WebSocket是端對端的,所以當一個代理服務器從客戶端攔截一個Upgrade請求,它需要去發送它自己的Upgrade請求到后端服務器,也包括合適的頭。
- 因為WebSocket是一個長連接,不像HTTP那樣是典型的短連接,所以反向代理服務器需要允許連接保持著打開,而不是在它們看起來空閑時就將它們關閉。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。
原文鏈接:http://blog.52itstyle.com/archives/736/