在上篇文章介绍了 如何利用nginx搭建一个ssl服务器,并进行反向代理。
在上篇文章的基础上,今天我们来看看nginx如何代理websocket协议
1、websocket简介
WebSocket协议相比较于HTTP协议成功握手后可以多次进行通讯,直到连接被关闭。但是WebSocket中的握手和HTTP中的握手兼容,它使用HTTP中的Upgrade协议头将连接从HTTP升级到WebSocket。这使得WebSocket程序可以更容易的使用现已存在的基础设施。
WebSocket工作在HTTP的80和443端口并使用前缀ws://
或者wss://
进行协议标注,在建立连接时使用HTTP/1.1的101状态码进行协议切换,当前标准不支持两个客户端之间不借助HTTP直接建立Websocket连接。
2、使用Nginx对WebSocket进行反向代理
修改Nginx配置文件nginx.conf:
示例:这是在配置ssl的基础上,对WebSocket进行反向代理
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 8086 ssl;
server_name 10.167.2xx.xx;
client_max_body_size 50m; #文件最大大小
#ssl_certificate cert.pem;
#ssl_certificate_key cert.key;
ssl_certificate test.crt;
ssl_certificate_key test.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
#root html;
#index index.html index.htm;
proxy_pass http://127.0.0.1:8092; # websocket 项目的端口号
# 固定写法-------------
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
注意:
最重要的就是在反向代理的配置中增加了如下两行,其它的部分和普通的HTTP反向代理没有任何差
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
这里面的关键部分在于HTTP的请求中多了如下头部:
Upgrade: websocket
Connection: Upgrade
这两个字段表示请求服务器升级协议为WebSocket。服务器处理完请求后,响应如下报文:
# 状态码为101
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: upgrade
告诉客户端已成功切换协议,升级为Websocket协议。握手成功之后,服务器端和客户端便角色对等,就像普通的Socket一样,能够双向通信。 不再进行HTTP的交互,而是开始WebSocket的数据帧协议实现数据交换。
这里使用map指令可以将变量组合成为新的变量,会根据客户端传来的连接中是否带有Upgrade头来决定是否给源站传递Connection头, 这样做的方法比直接全部传递upgrade更加优雅。
默认情况下,连接将会在无数据传输60秒后关闭,proxy_read_timeout
参数可以延长这个时间。源站通过定期发送ping帧以保持连接并确认连接是否还在使用。
大家可以思考一下如何多次代理转发?还是很简单的,就不多啰嗦了:P
参考:
https://www.hi-linux.com/posts/42176.html
https://www.xncoding.com/2018/03/12/fullstack/nginx-websocket.html