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 没变,号牌数量不会重新分配。

相关推荐
挖掘狂人42 分钟前
用 Python 从零搭一套 RAG 系统:40 行跑通,再谈优化
后端·程序员·ai编程
东创yu1 小时前
酒店弱电怎么验收?四个阶段与逐项检查清单
后端
QZQ541881 小时前
高并发系统如何保护自己:限流算法原理、实现与选型
后端
鶴哥只手遮天1 小时前
企业级 .NET 领域驱动框架深度解析-第 1 章 全景图:一套框架的七条脊柱
后端·架构·领域驱动设计
小满zs1 小时前
Go语言第十四章(文件操作)
后端·go
打工仔折腾 AI1 小时前
Linux 网络编程:从零掌握 TCP Socket 编程与 C++ 实战落地
linux·网络·人工智能·后端·python·tcp/ip·性能优化
沙蒿同学2 小时前
Wails v3 实战:一个桌面提醒客户端,从 v2 升到 v3 的全过程
前端·后端·github
aibo8603082 小时前
基于 Spring Boot + Vue3 的爱心众筹管理系统设计与实现
java·spring boot·后端
SimonKing2 小时前
OpenCode免费模型直接给`Workbuddy`用,一键导入
java·后端·程序员