在Linux环境下部署WebSocket实时推送服务时,Nginx作为反向代理服务器需正确配置proxy_set_header指令以支持协议升级。以下为关键配置步骤与原理解析:
WebSocket协议升级机制****
WebSocket通过HTTP握手建立持久连接,核心流程包括:
1. 客户端发送Upgrade: websocket请求头
2. 服务端返回101 Switching Protocols响应
3. 连接升级为双向全双工通信
Nginx需准确传递这些关键头部字段,否则握手将失败。
Nginx核心配置示例****
nginx
| server { | |
|---|---|
| listen 80; | |
| server_name ws.example.com; | |
| location /ws/ { | |
| proxy_pass http://backend_ws_server:8080; | |
| proxy_http_version 1.1; # 必须使用HTTP/1.1 | |
| proxy_set_header Upgrade $http_upgrade; # 传递Upgrade头 | |
| proxy_set_header Connection "upgrade"; # 修改Connection头 | |
| proxy_set_header Host $host; # 保留原始Host | |
| proxy_set_header X-Real-IP $remote_addr; # 传递客户端IP | |
| proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | |
| proxy_read_timeout 86400s; # 长连接超时设置 | |
| proxy_send_timeout 86400s; | |
| } | |
| } |
关键配置项详解****
1.
proxy_http_version 1.1
HTTP/1.1支持持久连接,是WebSocket的基础要求。HTTP/1.0的默认短连接模式无法维持长连接。
2.
3.
proxy_set_header Upgrade $http_upgrade
将客户端的Upgrade: websocket请求头原样传递给后端服务,这是协议升级的核心标识。
4.
5.
proxy_set_header Connection "upgrade"
强制修改Connection头为"upgrade",即使客户端可能发送其他值(如"keep-alive, upgrade")。Nginx官方文档明确要求此配置。
6.
7.
超时设置
proxy_read_timeout和proxy_send_timeout需设置为足够长的时间(如24小时),避免Nginx主动断开空闲连接。
8.
常见问题排查****
1.
400 Bad Request错误
检查是否遗漏proxy_http_version 1.1或Connection头配置错误。
2.
3.
连接频繁断开
确认后端服务与Nginx的超时设置一致,避免因超时配置不匹配导致连接中断。
4.
5.
WSS配置补充
对于加密连接(WSS),需额外配置SSL证书及proxy_ssl_*相关指令。
6.
通过以上配置,Nginx可高效完成WebSocket协议升级与长连接代理,支持每秒万级消息推送的高并发场景,同时保持与HTTP服务的共存部署能力。