Nginx 容器 setrlimit(RLIMIT_NOFILE) 报错问题分析与解决
问题描述
setrlimit(RLIMIT_NOFILE, 51200) failed (1: Operation not permitted)
为什么 1.24 正常,1.28 报错?
触发条件
-
Nginx 配置中启用了:
worker_rlimit_nofile 51200;
-
容器未赋予 SYS_RESOURCE 能力。
解决方案:jisongbin的自动化脚本写法
✅ 方案 1:修改 Docker 启动参数(推荐)
# === 生成启动命令(绝对路径) ===
DOCKER_CMD="docker run -d \
--restart unless-stopped \
--name $CONTAINER_NAME \
--hostname $HOSTNAME_NAME \
--ulimit nofile=65536:65536 \
--cap-add=SYS_RESOURCE \
-v $CONTAINER_DIR/Sites:/www/wwwroot \
-v $CONTAINER_DIR/MySQL:/www/server/data \
-v $CONTAINER_DIR/Backup:/www/backup \
$IMAGE_NAME"
验证:
docker exec -it nginx-1.28 bash
ulimit -n # 应输出 65536
✅ 方案 2:修改 Nginx 配置
如果你无法调整 Docker 权限,可以注释 worker_rlimit_nofile,避免 Nginx 调用 setrlimit()。
✅ 方案 3:回退版本
使用 nginx:1.24 镜像,避免 Nginx 尝试提升 ulimit。
为什么突然出现?
后续优化
--ulimit nofile=65536:65536 --cap-add=SYS_RESOURCE
分享总结
-
根因:Nginx 1.28 新增 setrlimit() 调用。
-
解决:容器加 –cap-add SYS_RESOURCE + –ulimit nofile。
-
经验:升级镜像时检查 ENTRYPOINT 或源码改动,特别是资源限制相关。