概述
- Nginx 代理模式中,大多都是基于 HTTP 的 Proxy 模块来对应设置的
- 除此之外,Nginx 还可以实现更多细小化的协议的HTTP代理,比如 ws 的代理
WS 的建立模式
-
websocket 它其实是建立在HTTP连接上,先要建立起HTTP连接
-
建立好连接以后,客户端会向服务端发送一个 Upgrade 的协议头将连接升级到 websocket
-
这样的话,从HTTP连接升级到了websocket的连接
-
它可以实现最重要的一个特点就是双向通信。
- 就是客户端可以向服务端主动发送请求
- 这个时候服务端也可以向客户端来发送主动请求
- 这样就实现了一个很好的双向连接
-
来看一下这个图,建立好了HTTP连接以后,客户端会向服务端来主动发送一个头信息
-
就是upgrade, 服务端收到了这个头信息会将这个协议的建立升级到websocket的这个模式里面去
-
建立好了双向的这个websocket连接,服务端这个时候也可以主动向客户端来发请求了
-
客户端收到信息以后也可以再回应,这样的话就建立起了一个类似于长连接的这种双向通信的这个模式
-
Websocket 代理场景
- 多人聊天
- APP信息推送
Nginx 实现 ws 代理
- 其实就是客户端向 Nginx 这个代理中心建立一个ws也就是websocket连接
- Nginx 将会将这种连接代理到后端的服务端里面去,只是说把地址做了一个变化,变成一个内部的地址
- 对客户端而言,其实就是跟Nginx建立连接的, 而代理只是说将连接做了一层转发到真实的服务端
- wscat 是客户端测试的工具
1 ) 环境配置
- 在linux 上安装 nodejs,$
yum install nodejs -y
- 安装 npm 工具,$
yum install npm
- 安装 websocket 模块,$
npm install ws
- 安装 wscat 工具,$
npm install wscat
2 ) 准备后端nodejs程序(ws程序) server.js
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);
});
});
- 启动这个服务
3 )配置 Nginx
websocket_proxy.conf
nginx
# map 实现映射的赋值,给 $connection_upgrade 来赋值
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
# 转发到
upstream websocket {
server 127.0.0.1:8010; # 这个后续换成真实的ip 这是 ws 服务
}
server {
listen 8020;
access_log /var/log/nginx/test_websocket.access.log main;
location / {
proxy_pass http://websocket;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; # 最重要的两行
proxy_set_header Connection $connection_upgrade; # 最重要的两行
}
}
- Nginx 的 map 配置选项: 通过 map 进行变量中内容映射后赋值
- 语法:map string $variable { ... }
- string 也可以是一个变量
- Default: --
- Context: http
- 语法:map string $variable { ... }
- 文档地址:ngx_http_map_module
- 上面 map 配置的意义
- map 会判断 客户端发送过来的 $http_upgrade 变量是否是有值的,如果没有值
- 则把 $connection_upgrade 赋值为 upgrade
- 如果客户端发送过来的 $http_upgrade 变量值为 ''
- 则把 $connection_upgrade 赋值为 close 表示连接关闭
- map 会判断 客户端发送过来的 $http_upgrade 变量是否是有值的,如果没有值
- 启动 nginx
- $
nginx -c /etc/nginx/nginx.conf
这个配置文件包含上述子配置文件 - $
netstat -luntp | grep 80
可查看对应的 8010 和 8020
- $
4 )通过 wscat 来测试
- $
wscat --connet ws://127.0.0.1:8020
注意,这里是8020是nginx的代理端口- 随机在窗口中输入内容回车
- 之后,服务端返回信息
- 这样,就可以看到,全双工通信的过程了
- 整个代理过程完毕