Nginx: ошибка (24: Too many open files) и ее решение

Jan 11, 2018 11:43 · 211 words · 1 minute read nginx

На одном из серверов в логе ошибок веб-сервера Nginx появились сообщения вида

2017/11/22 08:21:02 [crit] 29098#29098: *174583882 open() "/var/www/public/blackfriday/img/tabs/img4.png" failed (24: Too many open files), client: 176.113.144.142, server: example.com, request: "GET /blackfriday/img/tabs/img4.png HTTP/2.0", host: "example.com"

Давайте разберемся как исправить данную ошибку в операционной системе Centos 7!

Смотрим текущие soft/hard лимиты файловых дескрипторов и открытых файлов для основного (master) процесса Nginx:

cat /proc/$(cat /var/run/nginx.pid)/limits|grep open.files
Max open files            1024                 4096                 files 

и для дочерних (worker) процессов:

ps --ppid $(cat /var/run/nginx.pid) -o %p|sed '1d'|xargs -I{} cat /proc/{}/limits|grep open.files
Max open files            1024                 4096                 files     
Max open files            1024                 4096                 files
Max open files            1024                 4096                 files

Открываем на редактирование конфигурационный файл /etc/security/limits.conf и вставляем в него следующие строки:

...
nginx   soft  nofile    10000
nginx   hard  nofile    30000

В конфигурациооный файл nginx.conf добавляем следующую строку:

...
worker_rlimit_nofile 30000;
...

Проверим конфигурацию веб-сервера на предмет ошибок и перечитаем конфиг:

nginx -t && nginx -s reload

Проверим новые лимиты, установленные для дочерних процессов веб-сервера Nginx:

ps --ppid $(cat /var/run/nginx.pid) -o %p|sed '1d'|xargs -I{} cat /proc/{}/limits|grep open.files
Max open files            10000                30000                files     
Max open files            10000                30000                files     
Max open files            10000                30000                files     

Новые лимиты могут примениться не ко всем дочерним процессам веб-сервера, в таком случае необходимо перезапустить nginx с помощью команды:

service nginx restart
tweet Share