如何配置Nginx作為WebSocket的反向代理


WebSocket 是一種協議,它提供了一種建立支援客戶端和伺服器之間即時雙向通訊的 Web 應用程式的方法。WebSocket 使開發此類應用程式變得更加容易。大多數 現代瀏覽器 都支援 WebSocket,包括 Firefox、Internet Explorer、Chrome、Safari 和 Opera 等,越來越多的伺服器應用程式框架也開始支援 WebSocket。

對於生產環境,為了獲得良好的效能和網站或應用程式的高可用性,需要一個理解 WebSocket 協議的負載均衡層,NGINX 從 1.3 版本開始支援 WebSocket,並可以作為反向代理來執行應用程式的負載均衡。

NGINX 透過允許在客戶端和後端伺服器之間建立隧道來支援 WebSocket。NGINX 將客戶端的 Upgrade 請求傳送到後端伺服器,必須顯式設定 Upgrade 和 Connection 頭。

location /wsapp/ {
   proxy_pass http://wsbackend;
   proxy_http_version 1.1;
   proxy_set_header Upgrade $http_upgrade;
   proxy_set_header Connection "upgrade";
}

完成此操作後,NGINX 將其視為 WebSocket 連線。

NGINX WebSocket安裝及示例

這是一個演示 NGINX 作為 WebSocket 代理工作的即時示例。此示例有助於基於 Node.js 構建的 WebSocket 實現。NGINX 充當使用 ws 和 Node.js 的簡單 WebSocket 應用程式的反向代理。這些說明已在 Ubuntu 13.10 和 CentOS 6.5 上進行了測試,但需要針對其他作業系統和版本進行調整。在此示例中,WebSocket 伺服器的 IP 地址為 192.168.1.1,NGINX 伺服器的 IP 地址為 192.168.1.2

如果尚未安裝 Node.js 和 npm,請執行以下命令:

# sudo yum install nodejs npm

Node.js 在 Ubuntu 上安裝為 nodejs,在 CentOS 上安裝為 node。此示例使用 node,因此在 Ubuntu 上,我們需要建立一個從 nodejs 到 node 的符號連結。

# ln -s /usr/bin/nodejs /usr/local/bin/node

要安裝 WebSocket,請執行以下命令:

# sudo npm install ws

注意:如果收到類似“Error: failed to fetch from registry: ws”的錯誤訊息,請執行以下命令來解決問題:

# sudo npm config set registry http://registry.npmjs.org/

然後再次執行**sudo npm install**命令。

# sudo npm install ws

‘ws’ 帶有程式 /root/node_modules/ws/bin/wscat,可用於我們的客戶端,但我們需要建立一個程式作為伺服器。建立一個名為 server.js 的檔案,其中包含以下內容:

console.log("Server started");
var Msg = '';
var WebSocketServer = require('ws').Server
   , wss = new WebSocketServer({port: 8010});
   wss.on('connection', function(ws) {
      ws.on('message', function(message) {
         console.log('Received from client: %s', message);
         ws.send('Server received from client: ' + message);
      });
   });

要執行伺服器程式,請執行以下命令:

# node server.js

伺服器列印初始“伺服器已啟動”訊息,然後偵聽埠 8010,等待客戶端連線。當它收到客戶端請求時,它會將其回顯並向客戶端傳送包含它收到的訊息的訊息。為了讓 NGINX 代理這些請求,我們建立以下配置:

http {
   map $http_upgrade $connection_upgrade {
      default upgrade;
      '' close;
   }
   upstream websocket {
      server 192.168.1.1:8010;
   }
   server {
      listen 8020;
      location / {
         proxy_pass http://websocket;
         proxy_http_version 1.1;
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Connection $connection_upgrade;
      }
   }
}

NGINX 偵聽埠 8020 並將請求代理到後端 WebSocket 伺服器。proxy_set_header 指令使 NGINX 能夠正確處理 WebSocket 協議。

要測試伺服器,我們在客戶端系統中執行 wscat:

# /root/node_modules/ws/bin/wscat --connect ws://192.168.1.2:8020

wscat 透過 NGINX 代理連線到 WebSocket 伺服器。當您鍵入要傳送到伺服器的 wscat 訊息時,您會看到它在伺服器上回顯,然後客戶端上會出現來自伺服器的訊息。這是一個示例互動:

伺服器:客戶端

# node server.js
Server started
# wscat –connect ws://192.168.1.2:8020
Connected (press CTRL+C to quit)
> Hello
Received from client: Hello
< Server received from client: Hello

在這裡,我們看到客戶端和伺服器能夠透過充當代理伺服器的 NGINX 進行通訊,並且可以繼續傳送訊息,直到客戶端或伺服器斷開連線為止。所有需要做的就是正確配置 NGINX 以處理 WebSocket,並正確設定標頭以處理將連線從 HTTP 升級到 WebSocket 的 Upgrade 請求。

更新於:2023年11月2日

41K+ 次瀏覽

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.