Nginx如何实现反向代理Websocket?

Nginx可以通过proxy_http_version1.1模块实现WebSocket的反向代理。WebSocket是一种在单个TCP连接上进行全双工通讯的网络技术,可以实现服务端主动推送信息给客户端。

反向代理WebSocket主要涉及以下几个模块:

  • proxy_http_version 1.1:启用HTTP/1.1版本,开启proxy_http_version1.1模块
  • proxy_set_header:设置请求头部,添加Connection: Upgrade和Upgrade: websocket
  • proxy_redirect:重定向支持WebSocket
  • proxy_read_timeout:代理接收超时时间
  • proxy_send_timeout:代理发送超时时间

配置示例:

location /ws/ {
  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "upgrade";
  proxy_redirect off;
  proxy_read_timeout 6000s;
  proxy_send_timeout 6000s;

  proxy_pass http://backend;  # 代理到后端服务器
}  

上例location匹配/ws/路径,并开启以下proxy模块:

  • proxy_http_version 1.1:开启proxy_http_version1.1模块,支持WebSocket
  • proxy_set_header:添加Upgrade和Connection请求头,识别WebSocket连接
  • proxy_redirect off:关闭重定向,避免断开WebSocket
  • proxy_read_timeout:设置接收超时时间为6000s,WebSocket长连接需要较长超时时间
  • proxy_pass:代理请求到后端服务器

Nginx作为反向代理,其主要作用是:

  1. 监听客户端WebSocket连接请求
  2. 配置识别WebSocket请求头部,启用proxy_http_version1.1等模块
  3. 代理请求到后端应用服务器
  4. 转发后端服务器的数据给客户端,实现双向通信