You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WebSocket连接数受限求助:Ubuntu 17.10下仅能建立381个连接

排查WebSocket连接数固定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:01:11