天天看點

nginx代理websocket配置

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>&gt; This is a websocket </code><code>test</code><code>...</code>

<code>&lt; Server received from client: This is a websocket </code><code>test</code><code>...</code>

<code>&gt;</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>&gt; This is a websocket </code><code>test</code> <code>through nginx proxying...</code>

<code>&lt; 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,如需轉載請自行聯系原作者

繼續閱讀