Ошибка Nginx Too many open files
Про ускорение. Пара полезностей.
Как известно, у браузеров ограничено число одновременных соединений на домен во время загрузки сайта. Таким образом элементы сайта грузятся последовательно. Каждая картинка/js/css-файл - отдельное соединение. Если таких элементов много на страницах сайта - то ускорить его загрузку можно, если вынести статику на поддомены. Например s1.domain.com, s2.domain.com и т.д. Таким образом, если в браузере у нас, скажем, лимит на 5 соединений на каждый домен - то теперь у нас будет по 5 соединений на каждый поддомен. Если грамотно всё раскидать, то теоретически скорость загрузки может вырости чуть ли не в 5 раз.
Обратная сторона. Количество одновременных соединений с сервером также растёт. При той же посещаемости сайта - число соединений растёт примерно в 5 раз (при наличии 5 поддоменов). Если фронт-ендом стоит Nginx - то у него есть ограничение на число соединений в конфиге. А, поскольку соединений теперь в 5 раз больше, то и работы ему приходится одновременно проделывать больше, чем ранее. Таким образом с нашим ускорением мы также и приближаем Nginx к ограничению одновременных соединений, в результате у пользователя может не открываться сайт или какие-то файлы просто не отдаваться во время загрузки.
В логах Nginx будет ошибка:
Limit Soft Limit Hard Limit Units Max open files 1024 1048576 files Currently open files: 945 nginx: master process /usr/sbin/nginx Limit Soft Limit Hard Limit Units Max open files 1024 1048576 files
можно, выполнив в консоли:
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
Изменить ограничение:
- в /etc/security/limits.conf добавить строки:
* soft nofile 16384
* hard nofile 16384 - от рута выполнить:
ulimit -n 16384 - рестарт Nginx, на всякий случай.
Пишут ещё, что можно просто прописать в конфиге Nginx:
worker_rlimit_nofile 16384
и перезапустить его.