Increase Nginx file limits on CentOS v7.x
This is part of tuning Nginx to scale to reasonable workloads.
Change the nginx process limits with a systemd 'drop-in snippet' configuration file:
# mkdir -p /lib/systemd/system/nginx.service.d # cat > /lib/systemd/system/nginx.service.d/worker_files_limit.conf <<EOF [Service] LimitNOFILE=100000 EOF # systemctl daemon-reload # systemctl restart nginx.service
Add/change the '/etc/nginx/nginx.conf' file:
worker_rlimit_nofile 33000;
events {
worker_connections 16384;
}
Links
- https://www.supertcp.com/boost-nginx-connection-limits/
- https://www.digitalocean.com/community/tutorials/how-to-optimize-nginx-configuration
- https://www.linode.com/docs/websites/nginx/configure-nginx-for-optimized-performance
- http://blog.martinfjordvald.com/2011/04/optimizing-nginx-for-high-traffic-loads/
- http://nginx.org/en/docs/ngx_core_module.html#worker_rlimit_nofile
- https://lists.freedesktop.org/archives/systemd-devel/2013-March/009496.html
Appendices
Limits
# cat /proc/$(cat /run/nginx.pid)/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 1803 1803 processes Max open files 100000 100000 files Max locked memory 65536 65536 bytes Max address space unlimited unlimited bytes Max file locks unlimited unlimited locks Max pending signals 1803 1803 signals Max msgqueue size 819200 819200 bytes Max nice priority 0 0 Max realtime priority 0 0 Max realtime timeout unlimited unlimited us
Systemd 198 release notes (snippets)
In detail:
* Configuration of unit files may now be extended via drop-in
files without having to edit/override the unit files
themselves. More specifically, if the administrator wants to
change one value for a service file foobar.service he can
now do so by dropping in a configuration snippet into
/etc/systemd/systemd/foobar.service.d/*.conf. The unit logic
will load all these snippets and apply them on top of the
main unit configuration file, possibly extending or
overriding its settings. Using these drop-in snippets is
generally nicer than the two earlier options for changing
unit files locally: copying the files from
/usr/lib/systemd/system/ to /etc/systemd/system/ and editing
them there; or creating a new file in /etc/systemd/system/
that incorporates the original one via ".include". Drop-in
snippets into these .d/ directories can be placed in any
directory systemd looks for units in, and the usual
overriding semantics between /usr/lib, /etc and /run apply
for them too.
* Most unit file settings which take lists of items can now be
reset by assigning the empty string to them. For example,
normally, settings such as Environment=FOO=BAR append a new
environment variable assignment to the environment block,
each time they are used. By assigning Environment= the empty
string the environment block can be reset to empty. This is
particularly useful with the .d/*.conf drop-in snippets
mentioned above, since this adds the ability to reset list
settings from vendor unit files via these drop-ins.

