欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用Nginx做WebSockets代理教程

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

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

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

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

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

Nginx通過(guò)在客戶(hù)端和后端服務(wù)器之間建立隧道來(lái)支持WebSockets通信。為了讓Nginx可以將來(lái)自客戶(hù)端的Upgrade請(qǐng)求發(fā)送到后端服務(wù)器,Upgrade和Connection的頭信息必須被顯式的設(shè)置。如下所示:

復(fù)制代碼 代碼如下:

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 實(shí)例

下面的例子講述了Nginx是如何為WebSocket做代理的。此例將使用ws模塊,它是基于node.js構(gòu)建的WebSocket實(shí)現(xiàn)。Nginx將擔(dān)當(dāng)反向代理服務(wù)器,后端服務(wù)器是一個(gè)使用了ws和Node.js的簡(jiǎn)單WebSockets應(yīng)用。例子使用的命令在Ubuntu 13.10和CentOS 6.5上測(cè)試通過(guò),但對(duì)于其他操作系統(tǒng)或許需要稍作修改。就這個(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ō):

復(fù)制代碼 代碼如下:

sudo apt-get install nodejs npm

對(duì) RHEL/CentOS 來(lái)說(shuō):
復(fù)制代碼 代碼如下:

sudo yum install nodejs npm

在Ubuntu上,node.js會(huì)被安裝為"nodejs",但在CentOS中被會(huì)安裝為"node"。我們?cè)诶又薪y(tǒng)一使用"node",所以,我們會(huì)在Ubuntu上創(chuàng)建一個(gè)符號(hào)連接來(lái)允許我們使用“node”:
復(fù)制代碼 代碼如下:

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

然后安裝 ws:
復(fù)制代碼 代碼如下:

sudo npm install ws

注意:如果你得到了一個(gè)錯(cuò)誤:“Error: failed to fetch from registry: ws” ,那么運(yùn)行下面的命令應(yīng)該能解決這個(gè)問(wèn)題:
復(fù)制代碼 代碼如下:

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ì)為客戶(hù)端使用它,但是我們需要?jiǎng)?chuàng)建一個(gè)程序來(lái)作為我們的服務(wù)器。將下面的代碼保存到一個(gè)server.js文件中:

復(fù)制代碼 代碼如下:

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í)行:
復(fù)制代碼 代碼如下:

node server.js

該程序會(huì)輸出一條初始化消息“Server started”,之后監(jiān)聽(tīng)8010端口,等待客戶(hù)端的連接。它會(huì)處理收到的所有請(qǐng)求,并且將接收到的消息輸出在控制臺(tái),之后向客戶(hù)端返回一條包含該消息的消息。我們希望Nginx去代理客戶(hù)端的請(qǐng)求,可以通過(guò)下面的配置實(shí)現(xiàn):
復(fù)制代碼 代碼如下:

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)求轉(zhuǎn)發(fā)給后端的WebSocket服務(wù)器,讓后端服務(wù)器更好地處理WebSocket協(xié)議。我們可以使用wscat作為客戶(hù)端來(lái)測(cè)試一下:

復(fù)制代碼 代碼如下:

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

上面的命令會(huì)通過(guò)Nginx反向代理服務(wù)器和后端WebSocket服務(wù)器建立連接,你可以向服務(wù)器發(fā)送任意消息,然后服務(wù)器會(huì)返回一條消息。每當(dāng)你在客戶(hù)端發(fā)送一條消息,在后端服務(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

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

相關(guān)文章

  • Nginx session丟失問(wèn)題處理解決方法

    Nginx session丟失問(wèn)題處理解決方法

    這篇文章主要介紹了Nginx session丟失問(wèn)題處理解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 一篇文章徹底搞懂Nginx的.conf文件路徑配置

    一篇文章徹底搞懂Nginx的.conf文件路徑配置

    nginx.conf文件是Nginx的主配置文件,它包含了Nginx的全局配置和各個(gè)虛擬主機(jī)的配置,這篇文章主要給大家介紹了關(guān)于Nginx的.conf文件路徑配置的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • nginx代理服務(wù)器配置方法

    nginx代理服務(wù)器配置方法

    Nginx代理服務(wù)器是一種高性能的Web服務(wù)器和反向代理服務(wù)器,具有負(fù)載均衡、緩存加速、SSL終端、靜態(tài)資源服務(wù)等多種功能,這篇文章主要介紹了nginx代理服務(wù)器配置,需要的朋友可以參考下
    2024-03-03
  • centos環(huán)境下nginx高可用集群的搭建指南

    centos環(huán)境下nginx高可用集群的搭建指南

    為了防止Nginx單點(diǎn)故障造成服務(wù)器癱瘓,本文介紹了Nginx實(shí)現(xiàn)高可用集群構(gòu)建,下面這篇文章主要給大家介紹了關(guān)于centos環(huán)境下nginx高可用集群的搭建指南,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • Nginx性能優(yōu)化之Gzip壓縮設(shè)置詳解(最大程度提高頁(yè)面打開(kāi)速度)

    Nginx性能優(yōu)化之Gzip壓縮設(shè)置詳解(最大程度提高頁(yè)面打開(kāi)速度)

    這篇文章主要介紹了Nginx性能優(yōu)化之Gzip壓縮設(shè)置詳解(最大程度提高頁(yè)面打開(kāi)速度),需要的朋友可以參考下
    2022-01-01
  • nginx利用lua語(yǔ)言實(shí)現(xiàn)軟waf的示例代碼

    nginx利用lua語(yǔ)言實(shí)現(xiàn)軟waf的示例代碼

    這篇文章主要介紹了nginx利用lua語(yǔ)言實(shí)現(xiàn)軟waf,文中通過(guò)代碼示例和圖文結(jié)合的方式給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-03-03
  • Nginx+SpringBoot實(shí)現(xiàn)負(fù)載均衡的示例

    Nginx+SpringBoot實(shí)現(xiàn)負(fù)載均衡的示例

    這篇文章主要介紹了Nginx優(yōu)雅的實(shí)現(xiàn)負(fù)載均衡,幫助大家更好的理解和使用nginx,感興趣的朋友可以了解下
    2020-10-10
  • nginx結(jié)合openssl實(shí)現(xiàn)https的方法

    nginx結(jié)合openssl實(shí)現(xiàn)https的方法

    這篇文章主要介紹了基于nginx結(jié)合openssl實(shí)現(xiàn)https的方法,準(zhǔn)備工作大家需要安裝nginx服務(wù),具體操作過(guò)程跟隨小編一起看看吧
    2021-07-07
  • 使用Nginx創(chuàng)建臨時(shí)和永久重定向的具體示例

    使用Nginx創(chuàng)建臨時(shí)和永久重定向的具體示例

    HTTP 重定向 是將一個(gè)域名或地址指向另一個(gè)的方法,有幾種不同類(lèi)型的重定向,每種對(duì)客戶(hù)端瀏覽器意味著不同的事情,最常見(jiàn)的兩種類(lèi)型是臨時(shí)重定向和永久重定向,本文給大家介紹了使用Nginx創(chuàng)建臨時(shí)和永久重定向的具體示例,需要的朋友可以參考下
    2024-07-07
  • 使用nginx解決前端js下載跨域問(wèn)題

    使用nginx解決前端js下載跨域問(wèn)題

    訂單系統(tǒng)增加附件預(yù)覽,下載的功能,但是這個(gè)附件是客戶(hù)推單時(shí)推送過(guò)來(lái)的,文件連接是類(lèi)似oss連接,但是是客戶(hù)的域名,所以導(dǎo)致跨域問(wèn)題,本文小編將給大家介紹如何用nginx解決前端js下載跨域問(wèn)題,需要的朋友可以參考下
    2023-10-10

最新評(píng)論