В общем логе (messages) или в логе любого сервиса таких как httpd, nginx, mysql, exim видим ошибку
Too many open files in system
или
24: too many open files
Не достаточно лимита открытых файлов. По умолчанию в системе он установлен в 1024. Этого не достаточно. Проверим текущий лимит командами:
cat /proc/sys/fs/file-max
#второй вариант проверить
ulimit -n
Проверяем текущее значение открытых файлов в системе:
cat /proc/sys/fs/file-nr
у нас будет 3 числа. Первое это текущее количество открытых файлов, второе число открытых, но не используемых файлов и третье число лимит открытых файлов
Давайте изменим:
vi /etc/sysctl.conf
Добавляем в файл строку
fs.file-max = 65535
применяем изменения командой
sysctl -p
Теперь изменим лимит в /etc/security/limits.conf
vi /etc/security/limits.conf
и добавляем строки:
* hard nofile 65535
* soft nofile 65535
После этого необходимо перезагрузить сервер.
Рекомендую еще задать лимиты в /etc/systemd/system.conf
vi /etc/systemd/system.conf
Добавляем или меняем значения:
DefaultLimitNOFILE=infinity
DefaultLimitMEMLOCK=infinity
Применяем изменения:
systemctl daemon-reload
После этого необходимо еще перезагрузить сервис по которому мы получали ошибку «too many open files»
Отдельно можно задать лимит для каждого сервиса. Например для nginx:
systemctl edit --full nginx.service
Находим секцию [Service]
и там меняем или добавляем строку:
LimitNOFILE=30720
после изменения необходимо выполнить systemctl daemon-reload и systemctl restart nginx.
чтобы проверить лимит под пользователем (не под root) выполним
runuser -u nginx -- bash
ulimit -Hn
ulimit -Sn
Мы заходим под пользователя nginx и смотрим сначала Hard лимит и вторая команда покажет Soft лимит пользователя.