понимание максимальных файловых дескрипторов для linux и nginx и лучшее значение для worker_rlimit_nofile

10

Я получил типичную ошибку "слишком много дескрипторов файлов" на nginx. После долгих поисков решение состоит в том, чтобы увеличить количество дескрипторов файлов, доступных для nginx. Но мне не хватает информации, чтобы чувствовать себя комфортно, делая это осмысленно и безопасно. Вот основные моменты, которые освещают большинство тем форума / электронной почты:

  • ОС имеет свой собственный общий предел дескриптора файла (в моей системе cat /proc/sys/fs/file-maxвыводит «100678»)
  • у каждого пользователя тоже может быть свой лимит (но в моей системе, ulimitкогда любой пользователь выводит «неограниченно», смотрите обновление ниже )
  • несколько человек сказали что-то вроде того, что сказал этот человек : «Директива worker_rlimit_nofile не указывает« сколько », это ограничение операционной системы. Директива worker_rlimit_nofile просто позволяет быстро и грязно увеличить этот лимит, если этого недостаточно. ' Итак, я предполагаю, что это означает, что «лучше» установить ограничение для пользователя ОС nginx, а не в конфиге?

Я могу просто добавить значение worker_rlimit_nofile, превышающее число соединений на одного работника, и назвать его за день, но я чувствую, что на самом деле не знаю, что здесь происходит.

  • почему лимит на одного работника будет меньше, чем лимит ОС?
  • Как мне узнать, каков мой лимит сейчас?

обновление : как для пользователя root, так и для обычного пользователя, ulimit выводит "unlimited", НО ulimit -Hnи ulimit -Snоба вывода 1024

Джон Башир
источник

Ответы:

10

worker_rlimit_nofileустановит ограничение для файловых дескрипторов для рабочих процессов, в отличие от пользователя, запускающего nginx. Если другие программы, работающие под этим пользователем, не смогут корректно обрабатывать исчерпывающие файловые дескрипторы, вам следует установить этот предел немного меньше, чем для пользователя.

Во-первых, что использует ваши файловые дескрипторы?

  1. Каждое активное соединение с клиентом
  2. Используете proxy_pass? Это откроет сокет для хоста: порт, обрабатывающий эти запросы
  3. Использование proxy_pass для локального порта? Это еще одна открытая розетка. (Для владельца этого процесса)
  4. статические файлы, обслуживаемые 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

Я полагаю, что после этих изменений ограничения безопасности мне все же пришлось увеличить программный лимит для пользователя ulimit.

Как мне узнать, каков мой лимит сейчас?

ulimit -a Отобразятся все ограничения, связанные с пользователем, от имени которого вы его запускаете.

Дэн Р
источник
1
Спасибо - теперь, когда я превысил предел дескриптора файла, у меня заканчиваются соединения. Может быть, вы тоже можете мне помочь с этим :) serverfault.com/questions/209014/…
Джон Башир
1
Примечание для пользователей CentOS / Fedora: если у вас включен SELinux, вам нужно будет запустить setsebool -P httpd_setrlimit 1так, чтобы nginx имел разрешения для установки своего rlimit.
Джарретт
2

Нужно проверить источник, если честно, но он довольно низкий.

Я использовал worker_rlimit_nofile 15000;и не было проблем, вы можете безопасно увеличить его, хотя вероятность исчерпания файловых дескрипторов ничтожна.

Мартин Фьордвальд
источник