nginx正常隻能代理http請求,如果想實作代理websocket的需求,需在請求中加入"Upgrade"字段,使請求從http更新為websocket。
配置如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<code>http {</code>
<code> </code><code>map $http_upgrade $connection_upgrade {</code>
<code> </code><code>default upgrade;</code>
<code> </code><code>''</code> <code>close;</code>
<code> </code><code>}</code>
<code> </code>
<code> </code><code>server {</code>
<code> </code><code>...</code>
<code> </code><code>location </code><code>/chat/</code> <code>{</code>
<code> </code><code>proxy_pass http:</code><code>//backend</code><code>;</code>
<code> </code><code>proxy_http_version 1.1;</code>
<code> </code><code>#以下配置添加代理頭部:</code>
<code> </code><code>proxy_set_header Upgrade $http_upgrade;</code>
<code> </code><code>proxy_set_header Connection $connection_upgrade;</code>
<code> </code><code>}</code>
實驗案例:
配置websockeet伺服器,用戶端通過代理連接配接伺服器端。環境如下:
websocket服務端:192.168.1.110:8010
nginx :192.168.1.131:8081
1:利用nodejs實作一個websocket服務端,監聽8010端口,等待websocket連結。
安裝nodejs與npm,并安裝ws子產品。(這裡通過官網程式包實作)
<code>[root@192_168_1_110 ~]</code><code># tar -zxvf node-v6.2.0-linux-x64.tar.gz</code>
<code>[root@192_168_1_110 ~]</code><code># ln -s /root/node-v6.2.0-linux-x64/bin/node /usr/local/bin/node</code>
<code>[root@192_168_1_110 ~]</code><code># npm install -g ws</code>
<code>[root@192_168_1_110 ~]</code><code># npm install -g wscat</code>
編寫websocket服務監聽程式:
<code>[root@192_168_1_110 ~]</code><code># vim server.js</code>
<code>console.log(</code><code>"Server started"</code><code>);</code>
<code>var Msg = </code><code>''</code><code>;</code>
<code>var WebSocketServer = require(</code><code>'ws'</code><code>).Server</code>
<code>, wss = new WebSocketServer({port: 8010});</code>
<code>wss.on(</code><code>'connection'</code><code>, </code><code>function</code><code>(ws) {</code>
<code>ws.on(</code><code>'message'</code><code>, </code><code>function</code><code>(message) {</code>
<code>console.log(</code><code>'Received from client: %s'</code><code>, message);</code>
<code>ws.send(</code><code>'Server received from client: '</code> <code>+ message);</code>
<code>});</code>
啟動websocket服務端:
<code>[root@192_168_1_110 ~]</code><code># node server.js</code>
<code>Server started</code>
重新開啟一個終端,使用wscat程式測試程式連接配接:
<code>[root@192_168_1_110 ~]</code><code># /root/node-v6.2.0-linux-x64/lib/node_modules/wscat/bin/wscat --connect ws://192.168.1.110:8010</code>
<code>connected (press CTRL+C to quit)</code>
<code>> This is a websocket </code><code>test</code><code>...</code>
<code>< Server received from client: This is a websocket </code><code>test</code><code>...</code>
<code>></code>
檢視服務端:
<code>[root@192_168_1_110 ~]</code><code>#node server.js</code>
<code>Received from client: This is a websocket </code><code>test</code><code>... ----從用戶端接收到的資訊</code>
至此,websocket環境搭建完成。
2:配置nginx,代理110上的websocket連結。
18
19
20
21
22
23
24
25
26
<code>[root@192_168_1_131 ~]</code><code># vim /opt/conf/nginx/nginx.conf</code>
<code>......</code>
<code>map $http_upgrade $connection_upgrade {</code>
<code>default upgrade;</code>
<code>''</code> <code>close;</code>
<code>}</code>
<code>.......</code>
<code>include vhost/*.conf;</code>
<code>[root@192_168_1_131 ~]</code><code># vim /opt/conf/nginx/vhost/nodejs.conf</code>
<code>upstream nodejs{</code>
<code>server 192.168.1.110:8010;</code>
<code>server {</code>
<code>listen 8010;</code>
<code>access_log </code><code>/opt/logs/nginx/nodejs</code><code>.log main;</code>
<code>location / {</code>
<code>proxy_pass http:</code><code>//nodejs</code><code>;</code>
<code>proxy_http_version 1.1;</code>
<code>proxy_set_header Upgrade $http_upgrade;</code>
<code>proxy_set_header Connection $connection_upgrade;</code>
重新加載nginx配置:
<code>[root@192_168_1_131 ~]</code><code># service nginx reload</code>
這樣配置過後,在nginx伺服器上通路8010端口的請求,将會全部發送到後端192.168.1.110的8081端口上。
3:驗證websocket請求代理:(把ws位址指向192.168.1.131:8010)
<code>[root@192_168_1_110 ~]</code><code># /root/node-v6.2.0-linux-x64/lib/node_modules/wscat/bin/wscat --connect ws://192.168.1.131:8010</code>
<code>> This is a websocket </code><code>test</code> <code>through nginx proxying...</code>
<code>< Server received from client: This is a websocket </code><code>test</code> <code>through nginx proxying...</code>
檢視服務端:
<code>Received from client: This is a websocket </code><code>test</code><code>...</code>
<code>Received from client: This is a websocket </code><code>test</code> <code>through nginx proxying...</code>
可以看到通過代理,websocket也能正常接收到用戶端的請求資訊。
本文轉自 icenycmh 51CTO部落格,原文連結:http://blog.51cto.com/icenycmh/1839566,如需轉載請自行聯系原作者