Я получил, казалось бы, обычную ошибку "слишком много файловых дескрипторов" на nginx. После долгих поисков решение очевидно - увеличить количество файловых дескрипторов, доступных для nginx. Но информации недостаточно, чтобы я чувствовал себя комфортно, делая это осмысленным и безопасным способом. Вот основные моменты, которые освещаются в большинстве форумов / электронных писем:
cat /proc/sys/fs/file-max
выходы "100678")ulimit
как любой пользователь выводит "без ограничений" см. обновление внизу с более подробной информацией)Я могу просто добавить значение worker_rlimit_nofile, превышающее количество подключений на одного рабочего, и назвать это днем, но я чувствую, что действительно не знаю, что здесь происходит.
Обновить: и для root, и для обычного пользователя ulimit выводит "неограниченно", НО ulimit -Hn
и ulimit -Sn
оба выходят 1024
worker_rlimit_nofile
установит ограничение для файловых дескрипторов для рабочих процессов в отличие от пользователя, запускающего nginx. Если другие программы, работающие под этим пользователем, не смогут корректно обработать исчерпание дескрипторов файлов, вам следует установить этот предел немного меньше, чем тот, который установлен для пользователя.
Во-первых, что использует ваши файловые дескрипторы?
Почему ограничение на одного работника должно быть меньше лимита ОС?
Это контролируется ОС, потому что рабочий - не единственный процесс, запущенный на машине. Чтобы изменить его для пользователя, работающего с nginx, см. Ниже. Было бы очень плохо, если бы ваши воркеры использовали все файловые дескрипторы, доступные для всех процессов, не устанавливайте свои ограничения, чтобы это было возможно.
#/etc/sysctl.conf
#This sets the value you see when running cat /proc/sys/fs/file-max
fs.file-max = 65536"
#/etc/security/limits.conf
#this sets the defaults for all users
* soft nofile 4096
* hard nofile 4096
#This overrides the default for user `usernamehere`
usernamehere soft nofile 10240
usernamehere hard nofile 10240
Я считаю, что после этих изменений ограничений безопасности мне все же пришлось увеличить softlimit для пользователя, использующего ulimit
.
Как мне узнать, какой у меня сейчас лимит?
ulimit -a
Отобразит все ограничения, связанные с пользователем, от имени которого вы его запускаете.
Если честно, нужно проверить источник, но он довольно низкий.
я использовал worker_rlimit_nofile 15000;
и не было проблем, вы можете смело увеличивать его, хотя вероятность исчерпания файловых дескрипторов мала.