在上篇文章的基础上,今天我们来看看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
参考:
配置 Nginx 反向代理 WebSocket - 奇妙的 Linux 世界