웹서버 운영 중 처음 보는 형태의 장애가 발생해서 해결 방법을 공유해 봅니다.
아래와 같은 /var/log/nginx/error.log 에 아래와 같은 오류 로그가 남아있었네요.
2024/03/21 13:53:38 [alert] 3280218#3280218: *1217 open socket #50 left in connection 73
2024/03/21 13:53:38 [alert] 3280218#3280218: *1271 open socket #22 left in connection 74
2024/03/21 13:53:38 [alert] 3280218#3280218: *1191 open socket #53 left in connection 76
2024/03/21 13:53:38 [alert] 3280218#3280218: *1255 open socket #27 left in connection 80
2024/03/21 13:53:38 [alert] 3280218#3280218: *1250 open socket #19 left in connection 82
2024/03/21 13:53:38 [alert] 3280218#3280218: *1319 open socket #91 left in connection 83
2024/03/21 13:53:38 [alert] 3280218#3280218: *1287 open socket #23 left in connection 85
2024/03/21 13:53:38 [alert] 3280218#3280218: *1032 open socket #108 left in connection 89
2024/03/21 13:53:38 [alert] 3280218#3280218: *1332 open socket #36 left in connection 92
2024/03/21 13:53:38 [alert] 3280218#3280218: *1280 open socket #78 left in connection 93
2024/03/21 13:53:38 [alert] 3280218#3280218: *1320 open socket #59 left in connection 94
2024/03/21 13:53:38 [alert] 3280218#3280218: *1311 open socket #35 left in connection 95
2024/03/21 13:53:38 [alert] 3280218#3280218: aborting
위와 같은 오류가 발생하고 실제 서버가 응답을 못하고 실 도메인에 붙인 가상 서버 로그 쪽에는 499 에러가 계속해서 뜨더군요.
최종적으로는 웹서버(reverse proxy), docker compose 로 운영 중인 웹서버+PHP-FPM+mariaDB 서버를 모두 재시작하고 나서야 정상적으로 돌아왔습니다.
위 로그 정보로 구글 검색해 보니 Debian 계열 배포본은 ulimit 확인 시 사용자 한도가 너무 낮게 설정되어 있어 에러가 발생할 수 있다고 하네요.
저 에러가 직접적인 웹서버 혹은 PHP-FPM 서버가 멈추는데 영향이 있는지는 모르겠지만 일단 아래와 같은 순서로 검사해서 Nginx 의 기본 설정 nginx.conf 에 설정을 추가해 주었습니다.
ulimit 으로 먼저 현재 한도를 확인합니다.
# ulimit -n
1024
Nginx 프로세스의 PID 값을 확인합니다.
# ps aufx | grep nginx
root 3460627 0.0 0.0 93992 3264 ? Ss 09:44 0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data 3460628 0.6 0.1 95616 13768 ? S 09:44 0:27 \_ nginx: worker process
www-data 3460629 0.0 0.1 94868 12052 ? S 09:44 0:00 \_ nginx: worker process
www-data 3460630 0.0 0.0 94300 5572 ? S 09:44 0:00 \_ nginx: worker process
www-data 3460631 0.0 0.0 94300 5572 ? S 09:44 0:00 \_ nginx: worker process
nginx worker process 중 아무거나 PID 값을 아래와 같이 넣어서 검사해 보세요
# cat /proc/3460628/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 31638 31638 processes
Max open files 1024 524288 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 31638 31638 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
결과를 보면 Max open files 에 Soft Limit 이 1024로 매우 낮게 설정되어 있습니다.
제가 볼 때 여기서 두 가지 해결방안이 있는데 시스템 전체 ulimit 값을 높게 설정하는 방법이 있고 아니면 nginx.conf 에 worker_rlimit_nofile 를 최대 Hard Limit 값까지 설정하는 방법이 있을 것 같습니다.
일단 시스템 영향이 없는 nginx.conf 설정을 하자면 아래와 같이 하면 됩니다. ( /etc/nginx/nginx.conf )
worker_rlimit_nofile 524288;
이후 웹서버를 재시작해 주면 됩니다.
이제 다시 검사를 해보면 아래와 같이 Soft Limit 도 높게 나옵니다.
# cat /proc/3460628/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 31638 31638 processes
Max open files 524288 524288 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 31638 31638 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
이제 문제가 없기를 바랍니다. ㅜㅜ
참고 자료
- https://unix.stackexchange.com/questions/717952/tcp-timeouts-in-nginx
- https://spiderwebcoding.tistory.com/2