最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Nginx做WebSockets代理教程

 更新時間:2015年01月14日 09:43:56   投稿:junjie  
這篇文章主要介紹了使用Nginx做WebSockets代理教程,本文給出了代理配置,和一個完整的node.js實現(xiàn)的WebSockets實例,需要的朋友可以參考下

WebSocket 協(xié)議提供了一種創(chuàng)建支持客戶端和服務端實時雙向通信Web應用程序的方法。作為HTML5規(guī)范的一部分,WebSockets簡化了開發(fā)Web實時通信程序的難度。目前主流的瀏覽器都支持WebSockets,包括火狐、IE、Chrome、Safari以及Opera等,而且,越來越多的服務器應用框架也開始支持WebSockets。

要在企業(yè)產(chǎn)品中使用WebSockets,為滿足高性能和高可用性,需要多個WebSocket服務器。負載均衡層需要支持WebSocket協(xié)議。Nginx從1.3版起就開始支持WebSocket協(xié)議,而且可以擔當WebSocket應用程序的反向代理以及實現(xiàn)負載均衡。

WebSocket協(xié)議和HTTP協(xié)議不同,但是WebSocket協(xié)議的握手和HTTP是兼容的,它使用HTTP的Upgrade協(xié)議頭將連接從HTTP連接升級到WebSocket連接。這個特性使得WebSocket應用程序可以很容易地應用到現(xiàn)有的基礎設施。例如,WebSocket應用可以使用標準的80和443 HTTP端口,因此可以通過現(xiàn)有的防火墻設施。

WebSockets應用程序會在客戶端和服務器之間建立一個長連接,使得開發(fā)實時應用很容易。HTTP的Upgrade協(xié)議頭機制用于將連接從HTTP連接升級到WebSocket連接,Upgrade機制使用了Upgrade協(xié)議頭和Connection協(xié)議頭。反向代理服務器在支持WebSocket協(xié)議方面面臨著一些挑戰(zhàn)。挑戰(zhàn)之一是WebSocket是一個逐段轉(zhuǎn)發(fā)(hop-by-hop)協(xié)議,因此當代理服務器攔截到來自客戶端的Upgrade請求時,代理服務器需要將自己的Upgrade請求發(fā)送給后端服務器,包括適合的請求頭。而且,由于WebSocket連接是長連接,與傳統(tǒng)的HTTP端連接截然不同,故反向代理服務器還需要允許這些連接處于打開(Open)狀態(tài),而不能因為其空閑就關閉了連接。

Nginx通過在客戶端和后端服務器之間建立隧道來支持WebSockets通信。為了讓Nginx可以將來自客戶端的Upgrade請求發(fā)送到后端服務器,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 WebSockets 實例

下面的例子講述了Nginx是如何為WebSocket做代理的。此例將使用ws模塊,它是基于node.js構(gòu)建的WebSocket實現(xiàn)。Nginx將擔當反向代理服務器,后端服務器是一個使用了ws和Node.js的簡單WebSockets應用。例子使用的命令在Ubuntu 13.10和CentOS 6.5上測試通過,但對于其他操作系統(tǒng)或許需要稍作修改。就這個例子來說,WebSocket服務器的IP地址是192.168.100.10,Nginx服務器的IP地址是192.168.100.20。如果你還沒有安裝node.js和npm,你可以通過以下命令安裝:

對 Debian/Ubuntu 來說:

復制代碼 代碼如下:

sudo apt-get install nodejs npm

對 RHEL/CentOS 來說:
復制代碼 代碼如下:

sudo yum install nodejs npm

在Ubuntu上,node.js會被安裝為"nodejs",但在CentOS中被會安裝為"node"。我們在例子中統(tǒng)一使用"node",所以,我們會在Ubuntu上創(chuàng)建一個符號連接來允許我們使用“node”:
復制代碼 代碼如下:

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

然后安裝 ws:
復制代碼 代碼如下:

sudo npm install ws

注意:如果你得到了一個錯誤:“Error: failed to fetch from registry: ws” ,那么運行下面的命令應該能解決這個問題:
復制代碼 代碼如下:

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

接下來,你可以再次運行 sudo npm install ws

ws模塊來自/root/node_modules/ws/bin/wscat,我們會為客戶端使用它,但是我們需要創(chuàng)建一個程序來作為我們的服務器。將下面的代碼保存到一個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);
    });
 });

這個程序可以通過下面的命令執(zhí)行:
復制代碼 代碼如下:

node server.js

該程序會輸出一條初始化消息“Server started”,之后監(jiān)聽8010端口,等待客戶端的連接。它會處理收到的所有請求,并且將接收到的消息輸出在控制臺,之后向客戶端返回一條包含該消息的消息。我們希望Nginx去代理客戶端的請求,可以通過下面的配置實現(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";
    }
}

上面的配置會使Nginx監(jiān)聽8020端口,并把任何接收到的請求轉(zhuǎn)發(fā)給后端的WebSocket服務器,讓后端服務器更好地處理WebSocket協(xié)議。我們可以使用wscat作為客戶端來測試一下:

復制代碼 代碼如下:

/root/node_modules/ws/bin/wscat –connect ws://192.168.100.20:8020

上面的命令會通過Nginx反向代理服務器和后端WebSocket服務器建立連接,你可以向服務器發(fā)送任意消息,然后服務器會返回一條消息。每當你在客戶端發(fā)送一條消息,在后端服務器上能看到該消息的輸出,之后在客戶端會顯示一條來自服務端的消息。
這是一個交互示例:

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

由此我們可以看到客戶端與服務器能通過Nginx反向代理建立WebSockets通信,而且消息可以持續(xù)地進行雙向傳輸,直至客戶端或服務器斷開連接。為了讓Nginx能正確處理WebSocket連接,只需正確地設置消息頭來處理從HTTP連接升級到WebSocket連接的Upgrade請求。

相關文章

  • Nginx的location的常見規(guī)則優(yōu)先級問題

    Nginx的location的常見規(guī)則優(yōu)先級問題

    Nginx是反向代理和負載均衡的首選工具,nginx的location配置有許多細節(jié)內(nèi)容在網(wǎng)上不容易找到資料,或者解釋不清。本文對Nginx location規(guī)則優(yōu)先級介紹,需要的朋友參考下吧
    2021-08-08
  • nginx: [warn]

    nginx: [warn] "log_format" directive used only on "http" lev

    這篇文章主要介紹了nginx: [warn] "log_format" directive used only on "http" level 解決方法,需要的朋友可以參考下
    2014-08-08
  • linux服務器部署tomcat和Nginx的教程

    linux服務器部署tomcat和Nginx的教程

    這篇文章主要為大家詳細介紹了linux服務器部署tomcat和Nginx的教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • nginx實現(xiàn)負載均衡和動靜分離

    nginx實現(xiàn)負載均衡和動靜分離

    這篇文章主要為大家詳細介紹了nginx實現(xiàn)負載均衡和動靜分離,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • windows下nginx服務關不掉問題解決

    windows下nginx服務關不掉問題解決

    這篇文章主要給大家介紹了關于windows下nginx服務關不掉問題解決的相關資料,nginx是一種網(wǎng)絡服務器,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-08-08
  • Nginx 配置根據(jù)請求IP末段進行分流的方法

    Nginx 配置根據(jù)請求IP末段進行分流的方法

    這篇文章主要介紹了Nginx 配置根據(jù)請求IP末段進行分流的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-07-07
  • Nginx 負載均衡是什么以及該如何配置

    Nginx 負載均衡是什么以及該如何配置

    這篇文章主要介紹了Nginx 負載均衡是什么以及該如何配置,幫助大家更好的理解和使用Nginx服務器,感興趣的朋友可以了解下
    2021-01-01
  • nginx if 指令的具體使用

    nginx if 指令的具體使用

    if指令該指令用來支持條件判斷,并根據(jù)條件判斷結(jié)果選擇不同的Nginx配置,本文主要介紹了nginx if 指令的具體使用,具有一定的參考價值,感興趣的可以了解一下
    2024-05-05
  • 如何用nginx解決前端部署跨域問題

    如何用nginx解決前端部署跨域問題

    這篇文章主要介紹了如何用nginx解決前端部署跨域問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 淺談nginx讀寫鎖的實現(xiàn)邏輯

    淺談nginx讀寫鎖的實現(xiàn)邏輯

    本文主要介紹了淺談nginx讀寫鎖的實現(xiàn)邏輯,是通過自旋鎖來實現(xiàn)的,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-05-05

最新評論

沅陵县| 黑龙江省| 理塘县| 灌南县| 嘉善县| 江陵县| 罗源县| 车致| 广宗县| 阿拉善左旗| 河北省| 宜川县| 大连市| 乐清市| 广汉市| 通渭县| 太保市| 晋州市| 金山区| 张家港市| 昌都县| 榕江县| 堆龙德庆县| 肥乡县| 河北区| 保定市| 定兴县| 桐梓县| 镇雄县| 曲阜市| 隆昌县| 永定县| 河西区| 治多县| 肇庆市| 山东省| 红桥区| 彭泽县| 开江县| 平乡县| 宜昌市|