题目
如何配置Nginx反向代理支持WebSocket应用?
信息
- 类型:问答
- 难度:⭐⭐
考点
Nginx配置语法,反向代理原理,WebSocket协议支持,连接超时优化
快速回答
配置Nginx支持WebSocket需要三个关键步骤:
- 使用
proxy_http_version 1.1启用HTTP/1.1协议 - 设置
Upgrade和Connection头部处理协议升级:proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection \"upgrade\"; - 调整超时设置防止连接断开:
proxy_read_timeout 86400s;
一、原理说明
WebSocket协议通过HTTP/1.1的Upgrade机制实现协议切换:
- 客户端发送包含
Upgrade: websocket的HTTP请求 - Nginx需透传
Upgrade和Connection头部到后端服务器 - 保持TCP长连接状态(默认60秒超时需调整)
二、完整配置示例
server {
listen 80;
server_name ws.example.com;
location /chat/ {
# 核心配置
proxy_pass http://backend_server;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 超时优化(按需调整)
proxy_read_timeout 86400s; # 24小时
proxy_send_timeout 86400s;
# 可选:IP透传
proxy_set_header X-Real-IP $remote_addr;
}
}三、最佳实践
- 超时设置:根据业务需求调整
proxy_read_timeout(默认60秒) - 负载均衡:结合
upstream实现WS集群化upstream ws_cluster { server 10.0.0.1:8080; server 10.0.0.2:8080; } - 安全加固:
- 限制
Upgrade头只允许WebSocket:if ($http_upgrade != \"websocket\") { return 403; } - 启用WSS加密:配置SSL证书并监听443端口
- 限制
四、常见错误
| 错误现象 | 原因 | 解决方案 |
|---|---|---|
| 连接60秒后断开 | 未设置proxy_read_timeout | 延长超时时间 |
| 返回426 Upgrade Required | 未启用proxy_http_version 1.1 | 添加HTTP版本配置 |
| WebSocket握手失败 | 丢失Upgrade头部 | 检查proxy_set_header指令 |
五、扩展知识
- Nginx版本要求:1.3+ 开始支持WebSocket代理
- 连接复用:启用
keepalive提升性能:upstream { keepalive 100; } - 状态监控:通过
$connection_upgrade变量记录协议升级状态 - 替代方案:对于高并发场景可考虑njs模块实现自定义逻辑