Zbyt wiele otwartych plików w Nginxie, nie może podnieść limitu

22

Serwer to Ubuntu 13.04 (GNU / Linux 3.9.3-x86_64-linode33 x86_64).

nginx to nginx / 1.2.6.

Pracuję nad tym od kilku godzin, więc oto, co otrzymuję i oto, co zrobiłem.

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)

Uruchamianie 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

Zmodyfikowane limity miękkie / twarde w /etc/security/limits.conf (ustawienia od końca pliku)

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

Odczyt maks. Plików

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

Oraz w /etc/pam.d/common-session:

session required pam_limits.so

Po dodaniu tego i ponownym uruchomieniu serwera dla dobrego pomiaru, dla nginx liczę miękkie / twarde limity, otrzymując PID procesu nadrzędnego i:

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

Proces nadrzędny działa jako „root”, a 4 pracowników działa jako „nikt”.

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

Próbowałem wszystkiego, co wiem, jak to zrobić i mogłem uzyskać od Google. Nie mogę zwiększyć limitów plików dla Nginx.

Wsparcie?

Geuis
źródło

Odpowiedzi:

32

Dodaj następujący wiersz do swojego nginx i zrestartuj proces:

worker_rlimit_nofile 30000;

Umożliwi to pracownikom przyjmowanie większej liczby plików. Następnie możesz zweryfikować za pomocą:

su - nobody
ulimit -Hn
ulimit -Sn

To powinno wygenerować nowe twarde / miękkie limity.

Odniesienie

Nathan C.
źródło
6
Jeśli zmienisz tylko worker_rlimit_nofileustawienie uWSGI, a nie limity systemowe (które działały dla mnie), nie możesz tego zweryfikować ulimit. Zamiast tego powinieneś spojrzeć bezpośrednio na /proc/<pid of worker>/limits.
Jan Fabry
Myślę, że użytkownik (nobody / www-data) musi się wylogować i zalogować ponownie, tj. zrestartuj serwer. dla mnie ulimit pokazuje, że jego wzrost wzrósł, ale proces jest nadal ograniczony według cat / proc / {pid} / limit
felix
@felix OP wspomniał, że zrestartowali już serwer, ale tak, jest to konieczne.
Nathan C
3

W Ubuntu edytuj /etc/pam.d/su dodaj lub odkomentuj wymaganą sesję liniową pam_limits.so

Ponadto w /etc/security/limits.conf upewnij się, że między znakami znajduje się TABS, a nie spacje.

Rusty Hodge
źródło
1

po edycji tych plików uruchom następujące polecenie

sysctl -p

Następnie uruchom ponownie nginx

Mikrofon
źródło
1
Nie ma wpływu Granice pozostały takie same.
Geuis