在 linux 中优化 nginx 处理 websocket 高并发连接数,核心在于解除文件描述符(fd)限制并调整 nginx 的事件模型。具体做法是修改系统级 `ulimit` 和 nginx 配置文件中的 `worker_rlimit_nofile`,同时确保使用 `epoll` 事件驱动模式。这样设置后,nginx 能够维持数万甚至数十万的长连接而不报错。

Nginx 配置文件中哪些参数影响 WebSocket 长连接
主要影响参数包括 `worker_connections`、`worker_processes` 以及 `keepalive_timeout`。`worker_connections` 定义单个工作进程能打开的最大连接数,`worker_processes` 决定启动的工作进程数量,两者乘积决定了理论最大并发连接上限。WebSocket 作为长连接协议,必须配合 `proxy_set_header Upgrade` 和 `proxy_set_header Connection` 等指令才能正确透传升级请求,否则连接会被强制关闭。

events {
worker_connections 65535;
use epoll;
}
http {
upstream websocket_backend {
server 127.0.0.1:8080;
}
server {
listen 80;
server_name ws.example.com;
location /ws {
proxy_pass http://websocket_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
}
}
Linux 系统层面需要调整哪些内核参数
除了 Nginx 自身配置,Linux 内核的 `net.core.somaxconn` 和 `fs.file-max` 是关键瓶颈。`somaxconn` 控制监听队列长度,默认值通常过小导致连接被拒绝;`fs.file-max` 限制整个系统的最大文件句柄数。此外,TCP 时间等待状态 `tcp_tw_reuse` 的开启有助于快速回收处于 TIME_WAIT 状态的连接资源,提升复用率。

# 查看当前限制 cat /proc/sys/fs/file-max sysctl net.core.somaxconn # 临时生效命令 sysctl -w fs.file-max=1000000 sysctl -w net.core.somaxconn=65535 sysctl -w net.ipv4.tcp_tw_reuse=1 # 永久生效需写入 /etc/sysctl.conf # fs.file-max = 1000000 # net.core.somaxconn = 65535 # net.ipv4.tcp_tw_reuse = 1
如何验证 WebSocket 连接是否成功建立且未断开
通过检查 Nginx 错误日志中的 `upstream prematurely closed connection` 或客户端心跳包响应来验证。如果连接频繁断开,通常是因为代理超时设置过短或后端服务未正确处理 Ping/Pong 帧。使用 `curl` 模拟 WebSocket 握手并观察 HTTP 状态码是否为 101 Switching Protocols,可初步确认链路通畅。











