• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            Fork me on GitHub
            隨筆 - 215  文章 - 13  trackbacks - 0
            <2017年1月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234


            專(zhuān)注即時(shí)通訊及網(wǎng)游服務(wù)端編程
            ------------------------------------
            Openresty 官方模塊
            Openresty 標(biāo)準(zhǔn)模塊(Opm)
            Openresty 三方模塊
            ------------------------------------
            本博收藏大部分文章為轉(zhuǎn)載,并在文章開(kāi)頭給出了原文出處,如有再轉(zhuǎn),敬請(qǐng)保留相關(guān)信息,這是大家對(duì)原創(chuàng)作者勞動(dòng)成果的自覺(jué)尊重!!如為您帶來(lái)不便,請(qǐng)于本博下留言,謝謝配合。

            常用鏈接

            留言簿(1)

            隨筆分類(lèi)

            隨筆檔案

            相冊(cè)

            Awesome

            Blog

            Book

            GitHub

            Link

            搜索

            •  

            積分與排名

            • 積分 - 215465
            • 排名 - 118

            最新評(píng)論

            閱讀排行榜

            http://www.oschina.net/translate/websocket-nginx
            WebSocket 協(xié)議給我們提供了一個(gè)創(chuàng)建可以支持客戶(hù)端和服務(wù)端進(jìn)行雙向?qū)崟r(shí)通信的web應(yīng)用程序的方法。相比之前使用的方法,WebSocket(作為HTML5的一部分)可以使我們更容易開(kāi)的發(fā)出這種類(lèi)型的應(yīng)用程序。絕大多數(shù)的現(xiàn)代瀏覽器都支持WebSocket,包括火狐,IE,Chrome,Safari以及Opera等,同時(shí),越來(lái)越多的服務(wù)端框架也開(kāi)始支持WebSocket了。
            對(duì)于企業(yè)應(yīng)用來(lái)說(shuō),我們需要多個(gè)WebSocket服務(wù)器來(lái)保障性能和高可用性,因此我們迫切的需要對(duì)WebSocket協(xié)議進(jìn)行負(fù)載均衡。NGINX自從1.3版本就開(kāi)始支持WebSocket了,并且可以為WebSocket應(yīng)用程序做反向代理和負(fù)載均衡。
            WebSocket 和HTTP協(xié)議不同,但是WebSocket中的握手和HTTP中的握手兼容,它使用HTTP中的Upgrade協(xié)議頭將連接從HTTP升級(jí)到WebSocket。這使得WebSocket程序可以更容易的使用現(xiàn)已存在的基礎(chǔ)設(shè)施。例如,WebSocket可以使用標(biāo)準(zhǔn)的HTTP端口 80 和 443,因此,現(xiàn)存的防火墻規(guī)則也同樣適用。
            一個(gè)WebSockets的應(yīng)用程序會(huì)在客戶(hù)端和服務(wù)端保持一個(gè)長(zhǎng)時(shí)間工作的連接。用來(lái)將連接從HTTP升級(jí)到WebSocket的HTTP升級(jí)機(jī)制使用HTTP的Upgrade和Connection協(xié)議頭。反向代理服務(wù)器在支持WebSocket方面面臨著一些挑戰(zhàn)。一項(xiàng)挑戰(zhàn)是WebSocket是一個(gè)hop-by-hop協(xié)議,所以,當(dāng)代理服務(wù)器攔截到一個(gè)客戶(hù)端發(fā)來(lái)的Upgrade請(qǐng)求時(shí),它(指服務(wù)器)需要將它自己的Upgrade請(qǐng)求發(fā)送給后端服務(wù)器,也包括合適的請(qǐng)求頭。此外,由于WebSocket連接是長(zhǎng)時(shí)間保持的,所以代理服務(wù)器需要允許這些連接處于打開(kāi)狀態(tài),而不是像對(duì)待HTTP使用的短連接那樣將其關(guān)閉。
            NGINX 通過(guò)在客戶(hù)端和后端服務(wù)器之間建立起一條隧道來(lái)支持WebSocket。為了使NGINX可以將來(lái)自客戶(hù)端的Upgrade請(qǐng)求發(fā)送給后端服務(wù)器,Upgrade和Connection的頭信息必須被顯式的設(shè)置。如下所示:
            location /wsapp/ {
                proxy_pass http://wsbackend;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
            }
            一旦我們完成以上設(shè)置,NGINX就可以處理WebSocket連接了。
            NGINX Websockets 舉例
            這里有一個(gè)展示NGINX如何為WebSocket做代理的實(shí)例。這個(gè)例子將會(huì)使用node.js上的一個(gè)實(shí)現(xiàn)了WebSocket的模塊——ws。這個(gè)示例在Ubuntu 13.10 和 CentOS 6.5上測(cè)試通過(guò),但對(duì)于其他系統(tǒng)來(lái)說(shuō)也許需要稍作修改。就這個(gè)例子來(lái)說(shuō),WebSocket服務(wù)器的IP地址是192.168.100.10,NGINX服務(wù)器的IP地址是192.168.100.20。如果你還沒(méi)有安裝node.js和npm,你可以通過(guò)以下命令安裝:
            對(duì) Debian/Ubuntu 來(lái)說(shuō):
            sudo apt-get install nodejs npm
            對(duì) RHEL/CentOS 來(lái)說(shuō):
            sudo yum install nodejs npm
            在Ubuntu上,node.js會(huì)被安裝為 "nodejs",在CentOS中被會(huì)安裝為"node"。我們?cè)谶@例子中統(tǒng)一使用"node",所以,我們將會(huì)在Ubuntu上創(chuàng)建一個(gè)連接來(lái)允許我們使用“node”:
            ln -s /usr/bin/nodejs /usr/local/bin/node
            然后安裝 ws:
            sudo npm install ws
            注意:如果你得到了一個(gè)錯(cuò)誤:“Error: failed to fetch from registry: ws” ,那么運(yùn)行下面的命令應(yīng)該能解決這個(gè)問(wèn)題:
            sudo npm config set registry http://registry.npmjs.org/
            接下來(lái),你可以再次運(yùn)行 sudo npm install ws
            ws命令來(lái)自/root/node_modules/ws/bin/wscat,我們將會(huì)把它當(dāng)做我們的客戶(hù)端,但是我們需要?jiǎng)?chuàng)建一個(gè)程序來(lái)做我們的服務(wù)端。將下面的代碼保存到一個(gè)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);
                });
             });
            這個(gè)程序可以通過(guò)下面的命令執(zhí)行:
            node server.js
            該程序會(huì)輸出一條初始化消息“Server started”,之后監(jiān)聽(tīng)8010端口,等待客戶(hù)端的連接。它會(huì)處理收到的所有請(qǐng)求,并且將接收到的消息輸出在控制臺(tái),之后向客戶(hù)端返回一條包含該消息的消息。我們希望NGINX去代理這些請(qǐng)求,通過(guò)下面的配置便可實(shí)現(xiàn):
            map $http_upgrade $connection_upgrade {
                default upgrade;
                '' close;
            }
            upstream websocket {
                server 192.168.100.10:8010;
            }
            server {
                listen 8020;
                location / {
                    proxy_pass http://websocket;
                    proxy_http_version 1.1;
                    proxy_set_header Upgrade $http_upgrade;
                    proxy_set_header Connection "Upgrade";
                }
            }
            上面的配置會(huì)使NGINX監(jiān)聽(tīng)8020端口,并把接收到的任何請(qǐng)求傳遞給后端的WebSocket服務(wù)器以便恰當(dāng)?shù)奶幚鞼ebSocket協(xié)議。我們可以使用wscat作為客戶(hù)端來(lái)測(cè)試一下:
            /root/node_modules/ws/bin/wscat –connect ws://192.168.100.20:8020
            上面的命令會(huì)通過(guò)NGINX代理服務(wù)器和WebSocket服務(wù)器建立連接,你可以輸入你想要發(fā)送給服務(wù)器的消息,之后服務(wù)器會(huì)返回一條消息。每當(dāng)你輸入一條消息,你應(yīng)該可以在服務(wù)端看到該消息的輸出,之后在客戶(hù)端會(huì)顯示一條來(lái)自服務(wù)端的消息。
            這是一個(gè)交互示例:
            Server: Client:
            $ node server.js
            Server started
            wscat –connect ws://192.168.100.20:8020
            Connected (press CTRL+C to quit)
            > Hello
            Received from client: Hello
            < Server received from client: Hello
            由此我們可以看到服務(wù)端與客戶(hù)端能夠通過(guò)作為代理的NGINX通信, 而且消息可以持續(xù)進(jìn)行雙向傳輸直到客戶(hù)端或服務(wù)端斷開(kāi)連接。為了能使NGINX正確處理WebSocket, 只需正確地設(shè)置消息頭來(lái)處理更新從http到WebSocket連接的Upgrade請(qǐng)求。
            更多信息請(qǐng)參見(jiàn):
            posted on 2017-06-03 14:35 思月行云 閱讀(1037) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): Nginx\Openresty
            久久久久久午夜成人影院| 四虎国产精品免费久久久| 午夜天堂精品久久久久| 久久久久久国产精品免费无码| 久久不射电影网| 思思久久99热只有频精品66| 国产情侣久久久久aⅴ免费| 精品久久久久久无码人妻蜜桃| 7777精品伊人久久久大香线蕉| 69国产成人综合久久精品| 青青草原综合久久大伊人导航| 乱亲女H秽乱长久久久| 久久亚洲2019中文字幕| 97r久久精品国产99国产精| 少妇人妻综合久久中文字幕| 99久久无码一区人妻| 久久精品中文无码资源站| 综合久久精品色| 久久国产精品偷99| 99久久超碰中文字幕伊人 | 久久亚洲国产精品一区二区| 国产成人综合久久精品红| 精品一久久香蕉国产线看播放| 91久久婷婷国产综合精品青草| 亚洲AV无码1区2区久久| 伊人精品久久久久7777| 久久www免费人成看国产片| 色综合久久久久网| 久久免费高清视频| 久久精品一区二区国产| 国内精品伊人久久久久av一坑 | 色欲久久久天天天综合网精品| 久久人人超碰精品CAOPOREN| 91精品国产综合久久四虎久久无码一级| 热re99久久6国产精品免费| 狠狠综合久久AV一区二区三区| 国产精品中文久久久久久久| 久久久久久亚洲精品影院| 久久人人爽人人爽人人片AV东京热| 色播久久人人爽人人爽人人片aV| 欧美大战日韩91综合一区婷婷久久青草|