如何配置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 請求。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP