我有一个nginx
在 Debian (8.3) 上运行的 -daemon。 nginx 进程在尝试写入日志文件时偶尔会遇到资源限制:too many open files
。
主nginx
进程以 root 身份执行,而四个工作进程均以www-data
用户权限执行。
当我检查 nginx-master 和每个工作进程限制配置时,我发现了一些奇怪的事情。
cat /proc/{nginx-master-process-id}/limits
Limit Soft Limit Hard Limit Units
…
Max open files 1024 4096 files
…
cat /proc/{nginx-any-worker-process-id}/limits
…
Max open files 30000 30000 files
…
每个 nginx Worker 允许打开 30000 个文件。
不过,nginx 主进程只允许打开 1024 个文件,而硬限制则分别为 4096 个文件。
当我检查 root 用户 ulimit 设置时,我发现没有定义这样的限制!这个 1024/4096 设置可能来自哪里?
根 ulimit 设置
# logged in as root
ulimit -H
unlimited
另外我检查了守护进程配置:
/lib/systemd/system/nginx.service
[Unit]
Description=A high performance web server and a reverse proxy server
After=network.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --signal QUIT --retry QUIT/5 --pidfile /run/nginx.pid
# Give Passenger a chance to clean up before being killed by systemd.
ExecStop=/bin/sleep 1
TimeoutStopSec=5
KillMode=mixed
[Install]
WantedBy=multi-user.target
我在这里也没有看到 ulimit 配置。
我还可以检查哪些地方来修改 -master 进程的 1024/4096 nofile 限制nginx
?
答案1
看来问题可以这么说,我错误地假设 systemd 服务尊重 中配置的 ulimit /etc/security/limits.conf
。
事实证明,通过 systemd 配置的守护进程确实会故意忽略 limit.conf 中的设置,并需要LimitNOFILE
在服务配置文件中进行配置。
更新我的 systemd 单元文件解决了问题:
/lib/systemd/system/nginx.service
[Unit]
Description=A high performance web server and a reverse proxy server
After=network.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --signal QUIT --retry QUIT/5 --pidfile /run/nginx.pid
# Give Passenger a chance to clean up before being killed by systemd.
ExecStop=/bin/sleep 1
TimeoutStopSec=5
KillMode=mixed
LimitNOFILE=30000 # <= This line was added
[Install]
WantedBy=multi-user.target
以下是有关此问题的一些链接和资源:
- https://serverfault.com/questions/628610/increasing-nproc-for-processes-launched-by-systemd-on-centos-7
- https://bugzilla.redhat.com/show_bug.cgi?id=754285
感谢@ijaz-khan 为我指明了这个方向。
答案2
实现此目的的最佳方法是复制服务文件
cp /lib/systemd/system/nginx.service /etc/systemd/system
然后在 中编辑它/etc/systemd/system
。如果存在,可以通过使用以下内容/etc/systemd/system/nginx.service.d
创建来进行简单的覆盖/etc/systemd/system/nginx.service.d/ulimit.conf
[Service]
LimitNOFILE=30000
/etc
在处理 systemd 定义文件时,推荐使用覆盖 in 的方法。最后别忘了systemctl daemon-reload