WebSocket连接数受限求助:Ubuntu 17.10下仅能建立381个连接
我之前也碰到过类似的长连接数受限问题,结合你的Ubuntu 17.10环境和Nginx配置,咱们一步步拆解排查:
1. 先盯紧Nginx核心连接配置
你已经设置了worker_rlimit_nofile 8192,但别漏了events块里的worker_connections参数——它决定了单个Nginx worker进程能处理的最大连接数。
打开你的nginx.conf,找到events段,确保配置类似这样:
events { worker_connections 4096; # 建议设为worker_rlimit_nofile的一半左右 use epoll; # 适配Linux的高效事件驱动模型,Ubuntu默认支持 multi_accept on; # 让worker进程一次性处理所有新连接 }
理论总连接数= worker_processes × worker_connections,但实际会因为Nginx自身占用句柄打折扣,先把这个值拉到合理范围。修改后重启Nginx:
sudo systemctl restart nginx
2. 检查系统级文件句柄限制
Linux对用户、进程的打开文件数有默认限制,这大概率是你碰到381个连接上限的核心原因:
(1)用户级限制
编辑/etc/security/limits.conf,给Nginx运行用户www-data提权:
www-data soft nofile 65536 www-data hard nofile 65536
保存后需要重启服务器(或重新登录)让配置永久生效,临时生效可以用ulimit -n 65536,但重启后会重置。
(2)系统全局限制
查看当前系统最大文件句柄数:
sysctl fs.file-max
如果结果小于100000,编辑/etc/sysctl.conf添加:
fs.file-max = 1000000
执行以下命令让配置立即生效:
sudo sysctl -p
3. 验证Nginx进程的实际句柄限制
重启Nginx后,找到worker进程ID:
ps aux | grep nginx | grep worker
然后查看该进程的实际文件句柄上限:
cat /proc/<worker_pid>/limits | grep "Max open files"
确保显示的数值是你设置的8192(或更大),如果不是,说明worker_rlimit_nofile的位置错了——这个参数必须放在nginx.conf的最外层main块,不能嵌套在events/http块里。
4. 确认WebSocket代理配置完整性
虽然你已经能建立连接,但还是要确保Nginx的WebSocket代理配置没有遗漏关键参数,避免连接异常:
在你的WebSocket代理location块中添加:
location /your-websocket-endpoint { proxy_pass http://your-backend-service; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_read_timeout 86400; # 长连接超时时间,按需调整 }
最后验证
修改完成后重新测试连接数,如果还是有问题,去Nginx错误日志(/var/log/nginx/error.log)里找too many open files这类报错,它会直接指向文件句柄限制的问题。
内容的提问来源于stack exchange,提问作者Witold Tkaczyk

