nginx代理websocket配置

nginx正常只能代理http请求,如果想实现代理websocket的需求,需在请求中加入"Upgrade"字段,使请求从http升级为websocket。

    配置如下:

http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }
 
    server {
        ...
 
        location /chat/ {
            proxy_pass http://backend;
            proxy_http_version 1.1;
            #以下配置添加代理头部:
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        }
    }


实验案例:

    配置websockeet服务器,客户端通过代理连接服务器端。环境如下:

    websocket服务端:192.168.1.110:8010

    nginx                   :192.168.1.131:8081

 

1:利用nodejs实现一个websocket服务端,监听8010端口,等待websocket链接。

      安装nodejs与npm,并安装ws模块。(这里通过官网程序包实现)

[root@192_168_1_110 ~]# tar -zxvf node-v6.2.0-linux-x64.tar.gz
[root@192_168_1_110 ~]# ln -s /root/node-v6.2.0-linux-x64/bin/node /usr/local/bin/node
[root@192_168_1_110 ~]# ln -s /root/node-v6.2.0-linux-x64/bin/node /usr/local/bin/node
[root@192_168_1_110 ~]# npm install -g ws
[root@192_168_1_110 ~]# npm install -g wscat

     编写websocket服务监听程序:

[root@192_168_1_110 ~]# vim 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);
});
});

     启动websocket服务端:

[root@192_168_1_110 ~]# node server.js
Server started

     重新开启一个终端,使用wscat程序测试程序连接:

[root@192_168_1_110 ~]# /root/node-v6.2.0-linux-x64/lib/node_modules/wscat/bin/wscat --connect ws://192.168.1.110:8010
connected (press CTRL+C to quit)
> This is a websocket test...
< Server received from client: This is a websocket test...
>

      查看服务端:

[root@192_168_1_110 ~]#node server.js
Server started
Received from client: This is a websocket test...          ----从客户端接收到的信息

     至此,websocket环境搭建完成。


2:配置nginx,代理110上的websocket链接。

[root@192_168_1_131 ~]# vim /opt/conf/nginx/nginx.conf
......
http {
......
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
.......
include vhost/*.conf;
 
 
[root@192_168_1_131 ~]# vim /opt/conf/nginx/vhost/nodejs.conf
upstream nodejs{
server 192.168.1.110:8010;
}
server {
listen 8010;
access_log /opt/logs/nginx/nodejs.log main;
location / {
proxy_pass http://nodejs;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}

     重新加载nginx配置:

[root@192_168_1_131 ~]# service nginx reload

   这样配置过后,在nginx服务器上访问8010端口的请求,将会全部发送到后端192.168.1.110的8081端口上。


3:验证websocket请求代理:(把ws地址指向192.168.1.131:8010)

[root@192_168_1_110 ~]# /root/node-v6.2.0-linux-x64/lib/node_modules/wscat/bin/wscat --connect ws://192.168.1.131:8010
connected (press CTRL+C to quit)
> This is a websocket test through nginx proxying...
< Server received from client: This is a websocket test through nginx proxying...
>

     查看服务端:

[root@192_168_1_110 ~]#node server.js
Server started
Received from client: This is a websocket test...
Received from client: This is a websocket test through nginx proxying...

    可以看到通过代理,websocket也能正常接收到客户端的请求信息。

优秀的个人博客,低调大师

微信关注我们

原文链接:https://blog.51cto.com/icenycmh/1839566

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
优质分享Android(本站安卓app)

优质分享Android(本站安卓app)

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Apache Tomcat7、8、9(Java Web服务器)

Apache Tomcat7、8、9(Java Web服务器)

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Eclipse(集成开发环境)

Eclipse(集成开发环境)

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。