Nginx WebSocket代理配置
1. 概述
本文介绍如何在Nginx中配置WebSocket代理,实现WebSocket连接的正向代理和负载均衡。WebSocket协议提供了浏览器和服务器之间的全双工通信通道,广泛应用于实时通信场景。
2. 环境要求
- Nginx 版本:≥ 1.3.13
- 操作系统:Linux
- 权限要求:root 或 sudo 权限
3. 基础配置
3.1 配置文件位置
sudo vim /etc/nginx/nginx.conf
# 或者在子配置文件中:
sudo vim /etc/nginx/conf.d/websocket.conf
3.2 基本配置示例
server {
listen 80;
server_name example.com;
# WebSocket 配置
location /ws {
# 后端WebSocket服务地址
proxy_pass http://192.168.1.100:8080;
# 基础代理设置
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket 必要配置
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 超时设置
proxy_read_timeout 60s;
proxy_send_timeout 60s;
}
}
4. 参数说明
| 参数 | 说明 | 作用 |
|---|---|---|
| proxy_http_version 1.1 | 启用HTTP/1.1 | WebSocket需要HTTP/1.1支持 |
| proxy_set_header Upgrade | 设置协议升级头 | 支持协议升级到WebSocket |
| proxy_set_header Connection | 设置连接类型 | 指定升级类型为WebSocket |
5. 高级配置
5.1 负载均衡配置
upstream websocket_servers {
server 192.168.1.101:8080;
server 192.168.1.102:8080;
ip_hash; # WebSocket会话保持
}
server {
location /ws {
proxy_pass http://websocket_servers;
# ... 其他WebSocket配置 ...
}
}
5.2 SSL/TLS配置
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location /ws {
proxy_pass http://websocket_backend;
# ... 其他WebSocket配置 ...
}
}
6. 性能优化
- 超时设置
proxy_connect_timeout 60s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
- 缓冲设置
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
7. 注意事项
- 心跳检测
- 建议在WebSocket应用中实现心跳机制
- 合理设置proxy_read_timeout值
- 安全性考虑
- 建议使用SSL/TLS加密
- 实施访问控制
- 配置请求频率限制
- 日志配置
# WebSocket访问日志
access_log /var/log/nginx/websocket.access.log combined;
error_log /var/log/nginx/websocket.error.log error;
8. 故障排查
- 连接问题
# 检查WebSocket连接状态
tail -f /var/log/nginx/error.log
# 检查连接是否建立
netstat -an | grep ESTABLISHED
- 常见错误处理
- 502 Bad Gateway:检查后端服务
- 504 Gateway Timeout:调整超时设置
9. 测试验证
// WebSocket客户端测试代码
const ws = new WebSocket('ws://example.com/ws');
ws.onopen = () => console.log('Connected');
ws.onmessage = (e) => console.log('Received:', e.data);
ws.onerror = (e) => console.error('Error:', e);
改进后的文档更加全面,包含了完整的配置说明、优化建议和故障排查方法。所有示例中的IP地址均已替换为示例值。文档结构清晰,便于运维工程师参考使用。