最近项目中有开发同学使用了websocket协议,由于公司架构,前边还是拿nginx作为代理接入层,所以记录下nginx的websocket配置和实际过程中的一些注意事项:
nginx的websocket配置:
location ^~ /websocket/ {
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_pass http://group/;
proxy_set_header X-Real-IP $remote_addr;
proxy_intercept_errors on;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
WebSocket协议和HTTP协议不同,但是WebSocket协议的握手和HTTP是兼容的,
- 它使用HTTP的Upgrade协议头将连接从HTTP连接升级到WebSocket连接。这个特性使得WebSocket应用程序可以很容易地应用到现有的基础设施。例如,WebSocket应用可以使用标准的80和443 HTTP端口,因此可以通过现有的防火墙设施
- HTTP的Upgrade协议头机制用于将连接从HTTP连接升级到WebSocket连接,Upgrade机制使用了Upgrade协议头和Connection协议头
- Nginx通过在客户端和后端服务器之间建立隧道来支持WebSockets通信。为了让Nginx可以将来自客户端的Upgrade请求发送到后端服务器,Upgrade和Connection的头信息必须被显式的设置
- WebSockets应用程序会在客户端和服务器之间建立一个长连接,使得开发实时应用很容易
- 由于WebSocket连接是长连接,与传统的HTTP端连接截然不同,故反向代理服务器还需要允许这些连接处于打开(Open)状态,而不能因为其空闲就关闭了连接
实施总结内容:
- 使用过程中,由于我们有两层nginx代理(公司安全需要),之前只在第二层nginx上做了websocket支持,当从第一层开始访问时,得到结果404,需要在第一层转发时,即开始websocket协议支持
- 在第一层做完websocket转发后,得到结果还是404,所以准备看看是第一层就没收到websocket请求还是第二层没有收到websocket请求,即打开nginx日志log配置,打印$http_Conection和$http_Upgrade状态,发现第一层就没有websocket。查经过路径,发现是WAF导致
- tomcat上也可以打开websocket协议访问记录,添加信息为:%{Connection}i %{Upgrade}i