Nginx學習之反向代理WebSocket配置例項

實現方案

採用目前比較成熟的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頭部必須被設定明確。

程式碼例項:

upstream wsbackend { server 127。0。0。1:8080; server 127。0。0。1:8081;}server { listen 80; server_name ws。xxx。com; location / { proxy_pass http://wsbackend; proxy_http_version 1。1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection “upgrade”; }}

前端配置:

$(function(){ socket。init();});//Nginx反向代理實現websocketvar basePath = “ws://ws。xxx。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那樣是典型的短連線,所以反向代理伺服器需要允許連線保持著開啟,而不是在它們看起來空閒時就將它們關閉。