需分层协同调高系统、用户、systemd及nginx四级文件描述符限制,并辅以lsof和/proc/sys/fs/file-nr实时监控验证:先设error_log alert级别捕获错误,再同步配置ulimit、limitnofile和worker_rlimit_nofile至一致值(如1048576),最后排查fd泄漏点。

看到 SSL_do_handshake() failed 且伴随 accept() failed (24: Too many open files),说明不是单纯的 SSL 配置问题,而是文件描述符(fd)被耗尽后,Nginx worker 连基本的 accept 和新连接 TLS 握手都做不了——SSL 失败只是表象,根因在资源层。
确认是否真为 fd 耗尽而非 SSL 协议问题
别急着调证书或协议,先验证是不是资源卡死:
- 查错误日志里是否同时出现
accept() failed (24: Too many open files)——这是 fd 耗尽最直接信号 - 看
SSL_do_handshake() failed是否集中出现在大量请求涌入后、或持续高负载时段,而非固定某个域名或接口 - 执行
cat /proc/sys/fs/file-nr:三个数字中第三个是系统最大 fd 数,第一个远接近第三个,说明内核级已逼近上限 - 用
lsof -p $(pgrep nginx | head -1) | wc -l查单个 worker 打开的 fd 数,若超 65535 或接近你设的worker_rlimit_nofile,就是进程级打满了
分层检查 fd 限制源头
fd 限制有四层,缺一不可,必须全部对齐:
-
系统级:检查
/proc/sys/fs/file-max,若低于 200000,建议调高,如:echo 200000 > /proc/sys/fs/file-max,并写入/etc/sysctl.conf -
用户级:运行
ulimit -n,确认 nginx 启动用户的 soft/hard limit。修改/etc/security/limits.conf,加两行:
nginx soft nofile 1048576
nginx hard nofile 1048576 -
systemd 级(如用 systemctl 启动):编辑
/usr/lib/systemd/system/nginx.service或/etc/systemd/system/nginx.service.d/override.conf,加入:
LimitNOFILE=1048576 -
Nginx 配置级:在
nginx.conf的 main 块中设:
worker_rlimit_nofile 1048576;(值不能超过前几层的最小值)
排查 fd 泄漏点(尤其影响 SSL 握手)
如果只部分 worker 报错,或重启后过段时间又复现,大概率是 fd 没及时释放:
- 检查是否有长连接未正确关闭:如 upstream 使用 keepalive 但没配
keepalive_requests或keepalive_timeout,导致 socket 积压 - 确认日志文件是否被频繁 reopen:
access_log /path/to/log main flush=1s比buffer=64k flush=5s更省 fd;避免每条日志都 open/write/close - 留意第三方模块(如某些 Lua 脚本、自定义 auth 模块)是否打开文件或 socket 后未 close,可用
lsof -p $PID | grep -E "(REG|IPv4|IPv6)" | head -20观察 fd 类型分布 - SSL 握手本身会占用 fd:每个 TLS 握手中的临时 socket、OCSP Stapling 查询、证书链验证时的 CA 下载连接,都会消耗 fd——若大量客户端重连或证书链不全触发反复校验,会加速耗尽
快速缓解与验证方法
线上出问题时,优先保服务,再定位根因:
- 临时增大所有层级限制(按上文顺序),然后
systemctl daemon-reload && systemctl restart nginx - 用
ss -s查当前 socket 总数,对比netstat -s | grep -i "failed"中的failed to allocate计数是否下降 - 模拟压测:用
ab -n 10000 -c 200 https://yourdomain.com/,同时监控lsof -p $(pgrep nginx | head -1) | wc -l变化趋势 - 若问题消失,说明确实是 fd 不足;若仍报错,再回退排查 SSL 方向(此时重点看是否是
to upstream还是client:)











