Nginx 报错 Too many open files?一招 ulimit 解决高并发下的文件句柄耗尽

📖 背景 大屏平稳运行。某天访问量稍微大了一点。Nginx 突然开始狂报 502 Bad Gateway。查 error.log,满屏红字:Too many open files。Flask 后端明明活着,但 Nginx 就是连不上。

🔍 原因 小学生版解释:Linux 系统是个发号牌的门卫。每个文件、每个网络连接,都要发一个号牌(文件句柄)。 默认情况下,门卫手里只有 1024 个号牌。Nginx 既要接访客(连接),又要看日志(文件),还要连 Flask(代理),还得转发静态资源。 人一多,号牌发完了。新来的人只能吃闭门羹(报错)。 排查命令:

bash 复制代码
ulimit -n
# 输出 1024

🛠 解决 需要分两处改:系统层 和 Nginx 自身层。

  1. 系统层放号牌 修改 /etc/security/limits.conf:
markdown 复制代码
* soft nofile 65535
* hard nofile 65535

修改 systemd 全局配置 /etc/systemd/system.conf:

ini 复制代码
DefaultLimitNOFILE=65535
  1. Nginx 层加配 修改 nginx.conf,在开头加上:
ini 复制代码
worker_rlimit_nofile 65535;
events {
    worker_connections 65535;
}

✅ 验证效果 重启 Nginx。 查 Nginx 主进程的限额:

bash 复制代码
cat /proc/$(pgrep nginx | head -1)/limits | grep "open files"

预期输出:Max open files 65535 65535 files。 访问大屏,502 消失,系统顶住了并发。

💣 三个坑 只改 limits.conf 没用:如果你是用 systemctl restart nginx 启动的,systemd 会覆盖 limits.conf。必须改 /etc/systemd/system.conf。

Nginx 两个参数不匹配:worker_connections 不能大于 worker_rlimit_nofile。否则 Nginx 启动直接报错。

reload 不生效:改 ulimit 必须 restart,光 nginx -s reload 没用,因为进程 PID 没变,号牌数量不会重新分配。

相关推荐
知守观5 小时前
同一个团队两套分包:DDD 四层落地后,domain 层最大的类还是 5885 行
java·后端·领域驱动设计
Anymous5 小时前
我手写的 Redis 锁,输给了 10 秒的 TTL
后端·架构
Rain的Java大神之路6 小时前
设计一套生产级 API 接口:从契约、安全、幂等到限流,我踩过的坑都在这了
java·后端·面试
SimonKing6 小时前
零配置也能白嫖前沿大模型!dsh-our-free-model插件真香警告
java·后端·程序员
nice_lcj5206 小时前
【从零理解 Spring AI · 15】让检索更准:先宽召回,再精排序
java·后端·rag·spring ai·ai应用开发·检索优化·重排序
回家路上绕了弯6 小时前
要人确认的那一步,在确认什么?
后端
IT_陈寒7 小时前
JavaScript项目实战经验分享:从内存泄漏到性能优化的血泪史
前端·人工智能·后端
杨凯凡7 小时前
Spring Boot 链路追踪实战:Micrometer、TraceId 与异步线程上下文传播
java·spring boot·后端
非优秀程序员16 小时前
第07章 孙德良的阳谋|《互联网产品恩仇录》
javascript·后端
非优秀程序员16 小时前
第06章 浙江帮的内战|《互联网产品恩仇录》
后端