nginx error log : socket() failed (24: Too many open files) by 김다이아2023. 7. 12. 17:24
반응형

해당 오류 로그는 Nginx 웹 서버에서 발생한 소켓 오류를 나타냅니다. 

"socket() failed (24: Too many open files)"는 소켓을 생성하는 동안 파일 디스크립터 개수 제한을 초과했음을 의미합니다.

이 오류는 보통 운영 체제에서 각 프로세스가 동시에 열 수 있는 파일 개수에 제한을 두기 때문에 발생합니다. 

이 제한은 시스템 안정성을 유지하고 리소스 고갈을 방지하기 위해 설정됩니다.

해결책으로는 다음과 같습니다.

1. ulimit -a 명령어를 사용하여 open files 개수를 확인합니다.

root@ubuntu:~# ulimit -a

open files                      (-n) 1024

 

2. cat /proc/sys/fs/file-nr 명령어를 사용하여 오픈된 파일 수 확인합니다.

root@ubuntu:~# cat /proc/sys/fs/file-nr 

 

3. lsof | wc -l  명령어를 사용하여 현재 시스템에서 오픈되어 있는 파일 수 확인합니다.

root@ubuntu:~# lsof | wc -l

 

4. cat /proc/sys/fs/file-max 명령어를 사용하여 오픈 가능한 파일 최대 개수를 확인합니다.

root@ubuntu:~# cat /proc/sys/fs/file-max

 

5. vi /etc/security/limits.conf 명령어를 사용하여 오픈 가능한 파일 개수 제한을 설정합니다.

root@ubuntu:~# vi /etc/security/limits.conf

파일 내용 안에 아래의 내용 추가
root   hard  nofile 65535
root   soft  nofile 65535

해당 설정은 root 사용자에 대해 최대 파일 개수 제한을 65535로 설정하는 것을 의미합니다.

또는

*   hard  nofile 65535
*   soft  nofile 65535

이렇게 설정하면 모든 사용자, 즉 root 사용자와 일반 사용자 모두가 65535의 파일 디스크립터를 허용받게 됩니다.

 

6. 기존 세션을 닫고 새로운 세션을 연다.

 

7. ulimit -a 명령어를 사용하여 변경된 open files 개수를 확인합니다.

root@ubuntu:~# ulimit -a

open files                      (-n) 65535

 




만약 해당 부분을 설정해도 해결이 안 될 시 아래의 작업을 시도합니다.

루트로 실행되는 nginx 프로세스조차도 파일 제한이 있습니다.

 

1. vi /etc/security/limits.conf 명령어를 사용하여 limlits 설정합니다.

root@ubuntu:~# vi /etc/security/limits.conf
[...]
# Added Nginx nofile limit
root       soft    nofile  unlimited
root       hard    nofile  unlimited
www-data    soft    nofile  unlimited
www-data    hard    nofile  unlimited

 

2. ps auxf | grep nginx 명령어를 사용하여 nginx를 사용하고 있는 프로세스를 나열합니다.

root@ubuntu:~# ps auxf | grep nginx
[...]
root     21114  0.0  0.4  64508 18264 ?        Ss   09:36   0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data 21115 40.0  0.6  70340 26880 ?        R    09:36   0:01  \_ nginx: worker process
www-data 21116  2.3  0.6  68888 25252 ?        S    09:36   0:00  \_ nginx: worker process
www-data 21117  7.0  0.6  68888 25376 ?        S    09:36   0:00  \_ nginx: worker process
www-data 21118 16.0  0.6  68888 25196 ?        S    09:36   0:00  \_ nginx: worker process
www-data 21119  0.0  0.5  68888 21312 ?        S    09:36   0:00  \_ nginx: cache manager process
www-data 21120  0.0  0.5  68888 20912 ?        S    09:36   0:00  \_ nginx: cache loader process

 

3. cat /proc/21114/limits 명령어를 사용하여 pid에서 사용 중인 open files 개수를 확인합니다.

root@ubuntu:~# cat /proc/21114/limits
Limit                     Soft Limit           Hard Limit           Units     
Max cpu time              unlimited            unlimited            seconds   
Max file size             unlimited            unlimited            bytes     
Max data size             unlimited            unlimited            bytes     
Max stack size            8388608              unlimited            bytes     
Max core file size        0                    unlimited            bytes     
Max resident set          unlimited            unlimited            bytes     
Max processes             15598                15598                processes
Max open files            1024                 4096                 files     
Max locked memory         16777216             16777216             bytes     
Max address space         unlimited            unlimited            bytes     
Max file locks            unlimited            unlimited            locks     
Max pending signals       15598                15598                signals   
Max msgqueue size         819200               819200               bytes     
Max nice priority         0                    0                    
Max realtime priority     0                    0                    
Max realtime timeout      unlimited            unlimited            us     

루트로 실행되는 nginx  프로세스조차도 여전히 1024 (소프트) 및 4096 (하드)의 파일 제한이 있습니다.

이것은 Nginx가 새 소켓이나 파일 처리기를 열어야 할 때 분명히 오류를 일으킬 수 있다.

 

4. cp /lib/systemd/system/nginx.service /etc/systemd/system/ 명령어를 사용하여 systemd 서비스 단위 구성에서 제한을 변경합니다.

root@ubuntu:~# cp /lib/systemd/system/nginx.service /etc/systemd/system/

nginx.service 파일을 소스 디렉터리 /lib/systemd/system/에서 대상 디렉토리 /etc/systemd/로 복사하는 데 사용됩니다.

이 명령은 기존 systemd 서비스 유닛의 구성 또는 동작을 수정하려는 경우에 자주 사용됩니다. 서비스 파일을 /etc/systemd/system/ 디렉터리에 복사하면 /lib/systemd/system/에서 원본 파일을 수정하지 않고도 복사된 파일을 변경할 수 있습니다.

 

5. cat /etc/systemd/system/nginx.service 명령어를 사용하여 파일 내용 안에  LimitNOFILE 옵션이 있는지 확인합니다.

root@ubuntu:~# cat /etc/systemd/system/nginx.service

 

6. vi /etc/systemd/system/nginx.service 파일 안에 LimitNOFILE=500000 옵션 추가 합니다.

root@ubuntu:~# vi /etc/systemd/system/nginx.service
# Stop dance for nginx
# =======================
#
# ExecStop sends SIGSTOP (graceful stop) to the nginx process.
# If, after 5s (--retry QUIT/5) nginx is still running, systemd takes control
# and sends SIGTERM (fast shutdown) to the main process.
# After another 5s (TimeoutStopSec=5), and if nginx is alive, systemd sends
# SIGKILL to all the remaining processes in the process group (KillMode=mixed).
#
# nginx signals reference doc:
# http://nginx.org/en/docs/control.html
#
[Unit]
Description=A high performance web server and a reverse proxy server
Documentation=man:nginx(8)
After=network.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed
LimitNOFILE=500000

[Install]
WantedBy=multi-user.target

 

7. nginx 재시작을 합니다.

 

8.  ps auxf|grep nginx 명령어를 사용하여 nginx 프로세스에서 제한된 open files 개수를 확인합니다.

root@ubuntu:~# ps auxf|grep nginx
root     26732  0.0  0.0  14428  1012 pts/0    S+   10:03   0:00                      \_ grep --color=auto nginx
root     21636  0.0  0.4  64508 18260 ?        Ss   09:37   0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data 21637  0.1  0.6  68888 25368 ?        S    09:37   0:01  \_ nginx: worker process
www-data 21638 10.6  0.7  75440 32228 ?        R    09:37   2:42  \_ nginx: worker process
www-data 21639  1.6  0.6  69608 26276 ?        R    09:37   0:24  \_ nginx: worker process
www-data 21640 29.0  1.1  87836 44740 ?        S    09:37   7:22  \_ nginx: worker process
www-data 21641  0.0  0.5  68888 21368 ?        S    09:37   0:00  \_ nginx: cache manager process

root@ubuntu:~# cat /proc/21636/limits | grep "open files"
Max open files            500000               500000               files    

root@ubuntu:~# cat /proc/21637/limits |grep "open files"
Max open files            500000               500000               files    

 

문제가 해결되길 바랍니다.

감사합니다.

 

 

 

 

 

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

 

 

 

반응형