Слишком много открытых файлов с nginx, не могу увеличить лимит

22

Сервер является Ubuntu 13.04 (GNU / Linux 3.9.3-x86_64-linode33 x86_64).

nginx - это nginx / 1.2.6.

Я работаю над этим уже несколько часов, так что вот что я получаю, и вот что я сделала.

tail -f /usr/local/nginx/logs/error.log
2013/06/18 21:35:03 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:05 [crit] 3426#0: accept4() failed (24: Too many open files)

Nginx работает:

geuis@localhost:~$ ps aux | grep nginx
root      3422  0.0  0.0  39292   380 ?        Ss   21:30   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody    3423  3.7 18.8 238128 190848 ?       S    21:30   0:13 nginx: worker process      
nobody    3424  3.8 19.0 236972 192336 ?       S    21:30   0:13 nginx: worker process      
nobody    3426  3.6 19.0 235492 192192 ?       S    21:30   0:13 nginx: worker process      
nobody    3427  3.7 19.0 236228 192432 ?       S    21:30   0:13 nginx: worker process      
nobody    3428  0.0  0.0  39444   468 ?        S    21:30   0:00 nginx: cache manager process

Изменены мягкие / жесткие ограничения в /etc/security/limits.conf (настройки в конце файла)

root soft  nofile 65536
root hard  nofile 65536

www-data soft nofile 65536
www-data hard nofile 65536

nobody soft nofile 65536
nobody hard nofile 65536

Чтение максимальных файлов

cat /proc/sys/fs/file-max
500000

И в /etc/pam.d/common-session:

session required pam_limits.so

С этим добавленным и перезагруженным сервером для хорошей меры, для nginx я считаю мягкие / жесткие ограничения, получая PID родительского процесса и:

cat /proc/<PID>/limits
Limit                     Soft Limit           Hard Limit           Units     
Max open files            1024                 4096                 files     

Родительский процесс выполняется как «root», а 4 рабочих - как «nobody».

root      2765  0.0  0.0  39292   388 ?        Ss   00:03   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody    2766  3.3 17.8 235336 180564 ?       S    00:03   0:21 nginx: worker process      
nobody    2767  3.3 17.9 235432 181776 ?       S    00:03   0:21 nginx: worker process      
nobody    2769  3.4 17.9 236096 181524 ?       S    00:03   0:21 nginx: worker process      
nobody    2770  3.3 18.3 235288 185456 ?       S    00:03   0:21 nginx: worker process      
nobody    2771  0.0  0.0  39444   684 ?        S    00:03   0:00 nginx: cache manager process

Я перепробовал все, что я знаю, как сделать и смог получить от Google. Я не могу получить ограничения на количество файлов для nginx для увеличения.

Помогите?

Geuis
источник

Ответы:

32

Добавьте следующую строку в ваш nginx и перезапустите процесс:

worker_rlimit_nofile 30000;

Это позволит рабочим брать больше файлов. Затем вы можете проверить с помощью:

su - nobody
ulimit -Hn
ulimit -Sn

Это должно вывести новые жесткие / мягкие ограничения.

Ссылка

Натан С
источник
6
Если вы изменяете только worker_rlimit_nofileнастройку uWSGI, а не системные ограничения (что сработало для меня), вы не можете проверить это с помощью ulimit. Вместо этого вы должны смотреть прямо на /proc/<pid of worker>/limits.
Ян Фабри
Я думаю, что пользователь (nobody / www-data) должен выйти из системы и вернуться обратно. перезагрузите сервер. ulimit для меня показывает, что он увеличился, но процесс все еще ограничен в соответствии с cat / proc / {pid} / limit
felix
@felix ОП упоминал, что они уже перезапустили сервер, но да, это необходимо.
Натан С
3

В Ubuntu отредактируйте /etc/pam.d/su, добавьте или раскомментируйте требуемый сеанс строки pam_limits.so

Кроме того, в /etc/security/limits.conf убедитесь, что между символами есть символы TABS, а не пробелы.

Расти Ходж
источник
1

убедитесь, что вы выполнили следующую команду после редактирования этих файлов

sysctl -p

Затем перезапустите nginx

Майк
источник
1
Не имеет никакого эффекта Пределы остались прежними.
Geuis