微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

debian – 为daemonized nginx主进程配置`max open files`的ulimit

我在Debian(8.3)上运行了一个Nginx-daemon.在尝试编写日志文件时,Nginx进程偶尔会遇到资源限制:打开的文件太多.

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工作者都可以打开30000个文件.

但是,Nginx主进程只允许打开1024个文件,分别关于硬限制的4096个文件.

当我检查root用户ulimit设置时,我看不到定义了这样的限制!这个1024/4096设置可能来自哪里?

root 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配置.

我可以检查哪些地方修改Nginx-master进程的1024/4096 nofile限制?

解决方法:

可以这么说,似乎问题是我的错误假设是systemd服务尊重/etc/security/limits.conf中配置的ulimit.

事实证明,通过systemd配置的守护进程会故意忽略limits.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指点我这个方向.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐