해당 오류 로그는 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 |
문제가 해결되길 바랍니다.
감사합니다.
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
'공부방 > 서버' 카테고리의 다른 글
워드프레스 데이터베이스 연결 오류 해결하기: 나만의 해결 방법 (2) | 2023.09.06 |
---|---|
[해킹] sql injection 해킹 시나리오 (1) | 2023.08.10 |
리눅스 - tomcat ssl 인증서 설치 및 갱신 (1) | 2023.08.10 |
리눅스 crontab 명령어를 사용하여 로그 기록 자동으로 지우기 (1) | 2023.08.02 |
도커 설치 및 실행 방법 (1) | 2023.07.11 |
windows cmd 창에서 tasklist 명령어 사용 방법 (1) | 2023.05.09 |
windows cmd 창에서 taskkill 명령어 사용 방법 (1) | 2023.05.09 |
windows cmd 창에서 netstat 명령어 사용 방법 (1) | 2023.05.09 |