Nginx 에러 open socket #?? left in connection ??

웹서버 운영 중 처음 보는 형태의 장애가 발생해서 해결 방법을 공유해 봅니다.

아래와 같은 /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 

이제 문제가 없기를 바랍니다. ㅜㅜ

참고 자료