====== Nginx Error. Too many open files ======
===== Описание =====
В логе ошибок Nginx:
...socket() failed (24: Too many open files) while connecting to upstream..."
Для одного соединения Nginx инициирует открытие как минимум двух потоков ввода-вывода. Каждому потоку присваивается файловый дескриптор. В операционной системе имеется ограничение на количество одновременно открытых потоков ввода-вывода для одного процесса. Упомянутая ошибка сообщает о том, что процессы Nginx достигли это ограничение.
----
===== Диагностика =====
Список файловых дестрипторов, созданных процессом, можно увидеть в каталоге
/proc/$pid/fd
где
* **%%$pid%%** - ID процесса
Красивый вывод статистики по процессам Nginx:
for pid in `pidof nginx`; do echo "$(< /proc/$pid/cmdline)"; egrep 'files|Limit' /proc/$pid/limits; echo "Currently open files: $(ls -1 /proc/$pid/fd | wc -l)"; echo; done
nginx: worker process
Limit Soft Limit Hard Limit Units
Max open files 131072 131072 files
Currently open files: 25
nginx: worker process
Limit Soft Limit Hard Limit Units
Max open files 131072 131072 files
Currently open files: 29
nginx: worker process
Limit Soft Limit Hard Limit Units
Max open files 131072 131072 files
Currently open files: 29
nginx: worker process
Limit Soft Limit Hard Limit Units
Max open files 131072 131072 files
Currently open files: 55
nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
Limit Soft Limit Hard Limit Units
Max open files 1024 4096 files
Currently open files: 23
----
===== Решение =====
Если превышение лимита на количество открытых дескрипторов вызвано естественными факторами и его необходимо увеличить (а не искать причину), то есть два способа:
* ограничение на количество открытых файловых дискрипторов для воркеров Nginx можно задавать через параметр **worker_rlimit_nofile** :
vim /etc/nginx/nginx.conf
worker_rlimit_nofile 131072;
events {
...
}
http {
...
}
nginx -t
service nginx restart
* изменение ограничения со стороны операционной системы:
vim /etc/security/limits.conf
добавляем
* soft nofile 131072
* hard nofile 131072
и выполняем
ulimit -n 131072
----
===== Источники =====
* [[ http://nginx.org/ru/docs/ngx_core_module.html#worker_rlimit_nofile | nginx.org ]]
* [[ https://arm1.ru/blog/oshibka-nginx-too-many-open-files ]]
* [[ https://ru.wikipedia.org/wiki/Файловый_дескриптор | Wikipedia. Файловый дескриптор ]]