如何设置 nginx 最大打开文件数?

Posted

技术标签:

【中文标题】如何设置 nginx 最大打开文件数?【英文标题】:How to set nginx max open files? 【发布时间】:2015-03-07 02:39:56 【问题描述】:

虽然我做了如下设置,甚至重启了服务器:

# head /etc/security/limits.conf -n2
www-data soft nofile -1
www-data hard nofile -1
# /sbin/sysctl fs.file-max
fs.file-max = 201558

具体进程的打开文件限制还是1024/4096:

# ps aux | grep nginx
root       983  0.0  0.0  85872  1348 ?        Ss   15:42   0:00 nginx: master process /usr/sbin/nginx
www-data   984  0.0  0.2  89780  6000 ?        S    15:42   0:00 nginx: worker process
www-data   985  0.0  0.2  89780  5472 ?        S    15:42   0:00 nginx: worker process
root      1247  0.0  0.0  11744   916 pts/0    S+   15:47   0:00 grep --color=auto nginx
# cat /proc/984/limits
Limit                     Soft Limit           Hard Limit           Units
Max cpu time              unlimited            unlimited            seconds
Max file size             unlimited            unlimited            bytes
Max data size             unlimited            unlimited            bytes
Max stack size            8388608              unlimited            bytes
Max core file size        0                    unlimited            bytes
Max resident set          unlimited            unlimited            bytes
Max processes             15845                15845                processes
Max open files            1024                 4096                 files
Max locked memory         65536                65536                bytes
Max address space         unlimited            unlimited            bytes
Max file locks            unlimited            unlimited            locks
Max pending signals       15845                15845                signals
Max msgqueue size         819200               819200               bytes
Max nice priority         0                    0
Max realtime priority     0                    0
Max realtime timeout      unlimited            unlimited            us

我已经通过谷歌搜索尝试了所有可能的解决方案,但徒劳无功。我错过了什么设置?

【问题讨论】:

重复:***.com/questions/16919673/…? 【参考方案1】:

在 CentOS 上(在 7.x 上测试):

使用以下内容创建文件/etc/systemd/system/nginx.service.d/override.conf

[Service]
LimitNOFILE=65536

使用以下命令重新加载 systemd 守护进程:

systemctl daemon-reload

将此添加到 Nginx 配置文件中:

worker_rlimit_nofile 16384; (has to be smaller or equal to LimitNOFILE set above)

最后重启 Nginx:

systemctl restart nginx

您可以验证它是否适用于cat /proc/<nginx-pid>/limits

【讨论】:

我确认这也适用于 Ubuntu Xenial。感谢您的方法。 也许有一天我们会有一个 'worker_rlimit_nofile' 用于 nginx 的主进程:也许是 master_rlimit_nofile 根据我的经验,您只需更改worker_rlimit_nofile 并重新加载nginx。可能除非你达到硬限制。我能够使用worker_rlimit_nofile 将限制提高到为主进程设置的硬限制。虽然它在 Debian Wheezy 下。 此外,在 CentOS 7 上,您可以:systemctl edit SERVICE_NAME,在此处提供变量,保存该文件并重新加载服务。 我在ubuntu20.04上试试这个,如果worker_rlimit_nofile > LimitNOFILE,最大openfile等于worker_rlimit_nofile值【参考方案2】:

我在发布此问题后几分钟内找到了答案...

# cat /etc/default/nginx
# Note: You may want to look at the following page before setting the ULIMIT.
#  http://wiki.nginx.org/CoreModule#worker_rlimit_nofile
# Set the ulimit variable if you need defaults to change.
#  Example: ULIMIT="-n 4096"
ULIMIT="-n 15000"

/etc/security/limit.conf是PAM使用的,所以应该和www-data无关(它是nologin用户)。

【讨论】:

/etc/default/nginx 在哪里?我只看到 /etc/nginx/nginx.conf ,没有运气设置 worker_rlimit_nofile 您真的尝试过自己的答案吗?我发现nginx在重启时返回invalid option: n【参考方案3】:

对于 nginx,只需编辑 nginx.conf 并设置 worker_rlimit_nofile 即可更改限制。 我最初认为这是 nginx 自己强加的限制,但它增加了每个进程的限制:

worker_rlimit_nofile 4096;

您可以通过获取 nginx 进程 ID(来自 top -u nginx)进行测试,然后运行:

cat /proc/PID/limits

查看当前限制

另一种方法在 CentOS 7 上是 systemctl edit SERVICE_NAME,在此处添加变量:

[Service]
LimitNOFILE=65536

保存该文件并重新加载服务。

【讨论】:

【参考方案4】:

对于那些寻找预系统 Debian 机器的答案的人,nginx 初始化脚本执行 /etc/default/nginx。所以,添加行

ulimit -n 9999

将更改 nginx 守护进程的限制,而不会弄乱 init 脚本。

在之前的答案中添加 ULIMIT="-n 15000" 不适用于我的 nginx 版本。

【讨论】:

以上是关于如何设置 nginx 最大打开文件数?的主要内容,如果未能解决你的问题,请参考以下文章

Linux 打开文件数

怎样查看linux进程打开的文件数

ulimit 设置 最大 打开文件数(祝大家 未来 精彩无限 -- unlimited)

Linux最大打开文件数

linux 打开文件数too many open files解决方法

测试Linux最大打开文件数参数