1. WebSocket 长连接的技术背景与需求
在实时通信场景中,传统的HTTP短连接存在明显的性能瓶颈。以在线客服系统为例,每次消息发送都需要重新建立TCP连接,这种"一问一答"的模式不仅增加了服务器负担,还导致消息传递存在延迟。WebSocket协议正是为解决这类问题而生,它通过在单个TCP连接上实现全双工通信,使得服务端可以主动推送数据到客户端。
Nginx作为反向代理服务器,在处理WebSocket连接时需要特殊配置。与普通HTTP请求不同,WebSocket连接建立后会保持长时间活跃状态(通常为数小时甚至数天),这对代理服务器的连接管理能力提出了更高要求。我曾参与过一个物联网设备监控项目,当同时在线设备数超过5000时,就遇到了代理层连接中断的问题。
2. Nginx 基础 WebSocket 配置
2.1 核心配置指令解析
在Nginx配置文件中,WebSocket支持主要通过以下指令实现:
nginx复制location /wsapp/ {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
关键配置说明:
proxy_http_version 1.1:强制使用HTTP/1.1协议,这是WebSocket必需的Upgrade头:将客户端请求的Upgrade头原样传递给后端Connection头:告知后端这是升级连接请求
注意:如果遗漏
Connection头设置,某些客户端可能会遇到101 Switching Protocols响应被Nginx拦截的问题。
2.2 连接超时优化配置
WebSocket长连接需要调整默认的超时参数:
nginx复制proxy_connect_timeout 7d;
proxy_send_timeout 7d;
proxy_read_timeout 7d;
这三个参数分别控制:
- 与后端服务器建立连接的超时(默认60s)
- 向上游发送请求的超时(默认60s)
- 从上游读取响应的超时(默认60s)
在实际生产环境中,建议根据业务特点设置合理的超时值。比如金融行情推送系统可能需要设置24小时,而在线游戏可能只需2小时。
3. 大容量数据传输配置优化
3.1 缓冲区大小调整
当WebSocket传输大量数据时(如文件传输、实时视频帧),需要调整Nginx的缓冲区设置:
nginx复制proxy_buffers 8 32k;
proxy_buffer_size 64k;
proxy_busy_buffers_size 128k;
配置说明:
proxy_buffers:设置缓冲区的数量和单个大小(默认8个4k/8k)proxy_buffer_size:用于存储响应头的缓冲区大小proxy_busy_buffers_size:处于忙碌状态的缓冲区大小限制
在视频直播项目中,我们曾将proxy_buffers调整为16个128k,解决了高分辨率画面传输时的卡顿问题。
3.2 内存与连接数优化
高并发长连接会消耗大量内存,需要调整系统级参数:
nginx复制worker_connections 10240;
worker_rlimit_nofile 20480;
events {
use epoll;
worker_connections 20480;
}
配套的系统内核参数调整建议:
bash复制# 最大文件描述符数
sysctl -w fs.file-max=2097152
# TCP连接保持时间
sysctl -w net.ipv4.tcp_keepalive_time=600
4. 生产环境问题排查实录
4.1 连接意外断开问题
常见现象:客户端每隔几分钟就自动重连
排查步骤:
- 检查Nginx错误日志中的
upstream timed out记录 - 确认防火墙或负载均衡器的空闲连接超时设置
- 使用tcpdump抓包分析FIN包来源
解决方案示例:
nginx复制# 保持连接活跃
proxy_set_header Keep-Alive "timeout=3600";
# 增加心跳检测
location /healthcheck {
proxy_pass http://backend;
access_log off;
}
4.2 大数据传输截断问题
现象:超过1MB的WebSocket消息被截断
解决方案组合:
- 调整Nginx缓冲配置(如3.1节所示)
- 增加临时文件存储:
nginx复制proxy_temp_path /dev/shm/nginx_temp;
proxy_max_temp_file_size 1024m;
- 客户端实现分片传输协议
5. 性能监控与调优建议
5.1 关键监控指标
通过Nginx status模块监控:
- Active connections中的Writing状态连接数
- 等待队列长度(waiting)
- 每秒新建WebSocket连接数
推荐Prometheus监控配置:
yaml复制- job_name: 'nginx'
metrics_path: '/status'
static_configs:
- targets: ['nginx:9113']
5.2 压力测试方法
使用WebSocket基准测试工具:
bash复制# 安装wsbench
go get github.com/eranyanay/wsbench
# 执行测试
wsbench -c 5000 -n 1000000 -u ws://yoursite.com/wsapp
测试要点:
- 逐步增加并发连接数(-c参数)
- 观察Nginx worker进程的内存增长曲线
- 监控TCP重传率(netstat -s | grep retransmit)
6. 安全加固配置
6.1 防止DDoS攻击
针对WebSocket连接的特殊防护措施:
nginx复制limit_conn_zone $binary_remote_addr zone=wsconn:10m;
limit_conn wsconn 50;
location /wsapp/ {
limit_conn wsconn 20;
# ...其他配置...
}
6.2 消息内容过滤
通过Lua脚本实现消息检查:
nginx复制location /wsapp/ {
access_by_lua_block {
local msg = ngx.var.request_body
if string.len(msg) > 1048576 then
ngx.exit(ngx.HTTP_FORBIDDEN)
end
}
# ...其他配置...
}
在实际部署中,我们结合这套配置方案成功支撑了日均10万+的在线设备连接。关键点在于根据业务特点动态调整参数值,比如教育类应用可以适当放宽超时限制,而金融类应用则需要更严格的安全控制。