閱讀528 返回首頁    go 技術社區[雲棲]


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

寫在開始

去年,做過一款競賽打分的APP。具體需求,同組教師之間可以相互通信,及時通知同組人員,其他組員做了那些操作(當然,這隻是針對特定操作)。

實現方案

采用目前比較成熟的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.52itstyle.com;
        location / {
            proxy_pass https://wsbackend;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
}

前端配置:

$(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那樣是典型的短連接,所以反向代理服務器需要允許連接保持著打開,而不是在它們看起來空閑時就將它們關閉。

小站:https://blog.52itstyle.com/

最後更新:2017-04-19 15:00:39

  上一篇:go 快速搭建ThinkPHP框架教程
  下一篇:go Java常用的幾種設計模式