accept() failed (24: too many open files) 表明进程文件描述符耗尽,需逐层排查系统/用户/nginx/php-fpm的fd限制与实际使用量,并针对性调优配置。

看到 accept() failed (24: Too many open files) 或频繁出现 502 Bad Gateway、499 client has closed connection,基本可以锁定是连接数超限引发的拒绝服务。这不是配置没生效的问题,而是系统资源被真实打穿——必须从“连接源头→Nginx→PHP-FPM→系统内核”逐层验证,不能只改一个参数就收工。
盯紧 Nginx 错误日志里的关键信号
打开 /var/log/nginx/error.log,重点搜这三类线索:
-
accept() failed (24: Too many open files)→ 文件描述符(FD)耗尽,立刻查三层限制(系统/用户/Nginx进程) -
upstream timed out或no live upstreams→ PHP-FPM 没响应或全忙,不是网络问题,是后端撑不住 -
client has closed connection(499)→ 客户端等太久主动断开,根源在 PHP 处理慢或 FPM 进程不够
查清 Nginx 自身连接能力是否卡死
Nginx 能否接住请求,取决于三个数值的最小值,任一为 1024 就是瓶颈:
- 系统全局上限:
cat /proc/sys/fs/file-max(建议 ≥1000000) - 用户级限制:
ulimit -n(若显示 1024,说明/etc/security/limits.conf没生效或未重新登录) - Nginx 进程实际值:
cat /proc/$(cat /var/run/nginx.pid)/limits | grep "Max open files",应等于你配置的worker_rlimit_nofile
再看它到底开了多少 FD:ls -l /proc/$(cat /var/run/nginx.pid)/fd/ 2>/dev/null | wc -l。持续超过 8000 就得预警;过万基本已失控。
确认 PHP-FPM 是否成为连接黑洞
502 和长时间等待,90% 出在 PHP-FPM 这一环。分三步验证:
- 查进程是否存活:
systemctl status php-fpm或ps aux | grep php-fpm - 查监听方式是否匹配:
ss -tulnp | grep php-fpm,确认它监听的是127.0.0.1:9000还是/run/php/php-fpm.sock,Nginx 的fastcgi_pass必须严格对应 - 查实际并发承载力:
grep 'max children' /var/log/php-fpm/www-error.log或直接看当前活跃子进程数:systemctl status php-fpm | grep active;更准的是:ps aux | grep 'php-fpm:' | grep -v grep | wc -l,接近pm.max_children就说明严重排队
结合业务场景做针对性调优
不要盲目堆参数。按常见负载选配:
-
中小网站(日活 ≤ 1 万):Nginx
worker_connections 2048;PHP-FPMpm = dynamic,pm.max_children = 32–64,pm.start_servers = 8 -
API 服务(高并发短耗时):增大
pm.max_requests(如 1000+),避免子进程频繁重启;调小request_terminate_timeout防止单请求拖垮全局 - 大文件/长任务(如导出、转码):单独建一个 FPM 池,用独立 socket 和超时设置,不与常规接口混用
所有修改后,务必执行:nginx -t && systemctl reload nginx 和 systemctl reload php-fpm,再观察 error.log 是否还有同类报错。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











