nginx对websocket支持

时间:2024-10-12 19:19:31

最近项目中有开发同学使用了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)状态,而不能因为其空闲就关闭了连接

实施总结内容:

  1. 使用过程中,由于我们有两层nginx代理(公司安全需要),之前只在第二层nginx上做了websocket支持,当从第一层开始访问时,得到结果404,需要在第一层转发时,即开始websocket协议支持
  2. 在第一层做完websocket转发后,得到结果还是404,所以准备看看是第一层就没收到websocket请求还是第二层没有收到websocket请求,即打开nginx日志log配置,打印$http_Conection和$http_Upgrade状态,发现第一层就没有websocket。查经过路径,发现是WAF导致
  3. tomcat上也可以打开websocket协议访问记录,添加信息为:%{Connection}i %{Upgrade}i