Skip to content

5. Nginx Nofile Limit


1. Mission

  • Nginx로 Reverse Proxy 구축 시 "socket() failed (24: Too many open files) while connecting to upstream" 문제 발생 → Ubuntu 시스템에서 Nginx(Master 및 Workers)의 open files 제한을 변경


2. Ubuntu Ulimit

1) Nginx의 Master Process 및 Worker Processes의 open files 제한 확인

  • 다음과 같이 open files 제한을 확인할 수 있다.


$(torchesrve) ps auxf | grep nginx
root     1121688  0.0  0.0   7132  3516 pts/12   S+   13:15   0:00  |       \_ tmux attach -t nginx
root     3089982  0.0  0.0   5520   592 pts/6    S+   Oct08   0:00  |   \_ tail -f /var/log/nginx/access.log
root     1136437  0.0  0.0   5520   596 pts/8    S+   14:08   0:00  |   \_ tail -f /var/log/nginx/error.log
root     1142775  0.0  0.0   6300   740 pts/0    S+   14:29   0:00  |   \_ grep --color=auto nginx
root     1139315  0.0  0.0  55256  1556 ?        Ss   14:15   0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data 1139319  0.0  0.0  55920  5928 ?        S    14:15   0:00  \_ nginx: worker process
www-data 1139321  0.0  0.0  57860  8112 ?        S    14:15   0:00  \_ nginx: worker process
www-data 1139323  0.0  0.0  55920  5264 ?        S    14:15   0:00  \_ nginx: worker process
www-data 1139325  0.0  0.0  55920  5916 ?        S    14:15   0:00  \_ nginx: worker process
www-data 1139328  0.0  0.0  55920  5264 ?        S    14:15   0:00  \_ nginx: worker process
www-data 1139330  0.0  0.0  55920  5260 ?        S    14:15   0:00  \_ nginx: worker process
www-data 1139332  0.0  0.0  55920  5264 ?        S    14:15   0:00  \_ nginx: worker process
www-data 1139335  0.0  0.0  55920  5264 ?        S    14:15   0:00  \_ nginx: worker process
www-data 1139337  0.0  0.0  55920  5264 ?        S    14:15   0:00  \_ nginx: worker process
www-data 1139340  0.0  0.0  55920  5264 ?        S    14:15   0:00  \_ nginx: worker process


  • Master Process부터 확인해 보자.


$(torchserve) cat /proc/1139315/limits | grep "open files"
Max open files            1024                524288                files


  • Worker Processes 중 한 개만 확인해 보자.


$(torchserve) cat /proc/1139319/limits | grep "open files"
Max open files            1024                524288                files


  • 이와 같이 /etc/nginx/nginx.conf 파일의 worker_rlimit_nofile의 수를 변경하더라도 Master Process의 제한이 걸려 있어서 의미가 없다.


2) Ulimit 확인

  • 다음과 같이 Ulimit을 확인한다.


$(torchserve) ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 2062992
max locked memory       (kbytes, -l) 65536
max memory size         (kbytes, -m) unlimited
open files                      (-n) 4096
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 2062992
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited


  • open files (-n)의 제한이 4096으로 되어 있으므로 다음과 같이 필요한 만큼 변경해 준다.


$(torchserve) ulimit -n 50000


  • 하지만 위와 같이 변경했을 때 리부팅하는 경우 원래대로 돌아오므로 /etc/security/limits.conf를 열어 맨 끝에 다음과 같이 추가한다.


$(torchserve) vim /etc/security/limits.conf
...

nginx       soft    nofile  50000
nginx       hard    nofile  80000
root       soft    nofile  unlimited
root       hard    nofile  unlimited
www-data    soft    nofile  unlimited
www-data    hard    nofile  unlimited


  • 사실 이렇게 해도 root로 실행되는 Nginx의 Master Process의 제한은 변경되지 않는다.


3) Systemd를 통해 제한 변경

  • 다음과 같이 /etc/systemd/system/nginx.service.d 디렉터리를 생성한다.


$(torchserve) mkdir -p /etc/systemd/system/nginx.service.d


  • 생성한 디렉터리에 /etc/systemd/system/nginx.service.d/nginx.conf 파일을 생성한 후 다음과 같이 내용을 작성한다.


$(torchserve) vim /etc/systemd/system/nginx.service.d/nginx.conf
[Service]
LimitNOFILE=50000


  • 다음과 같이 Nginx를 재시작한다.


$(torchserve) systemctl daemon-reload
$(torchserve) systemctl restart nginx.service


  • 프로세스를 다시 확인해 보자.


$(torchesrve) ps auxf | grep nginx
root     1121688  0.0  0.0   7132  3516 pts/12   S+   13:15   0:00  |       \_ tmux attach -t nginx
root     3089982  0.0  0.0   5520   592 pts/6    S+   Oct08   0:00  |   \_ tail -f /var/log/nginx/access.log
root     1136437  0.0  0.0   5520   596 pts/8    S+   14:08   0:00  |   \_ tail -f /var/log/nginx/error.log
root     1142775  0.0  0.0   6300   740 pts/0    S+   14:29   0:00  |   \_ grep --color=auto nginx
root     1139315  0.0  0.0  55256  1556 ?        Ss   14:15   0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data 1139319  0.0  0.0  55920  5928 ?        S    14:15   0:00  \_ nginx: worker process
www-data 1139321  0.0  0.0  57860  8112 ?        S    14:15   0:00  \_ nginx: worker process
www-data 1139323  0.0  0.0  55920  5264 ?        S    14:15   0:00  \_ nginx: worker process
www-data 1139325  0.0  0.0  55920  5916 ?        S    14:15   0:00  \_ nginx: worker process
www-data 1139328  0.0  0.0  55920  5264 ?        S    14:15   0:00  \_ nginx: worker process
www-data 1139330  0.0  0.0  55920  5260 ?        S    14:15   0:00  \_ nginx: worker process
www-data 1139332  0.0  0.0  55920  5264 ?        S    14:15   0:00  \_ nginx: worker process
www-data 1139335  0.0  0.0  55920  5264 ?        S    14:15   0:00  \_ nginx: worker process
www-data 1139337  0.0  0.0  55920  5264 ?        S    14:15   0:00  \_ nginx: worker process
www-data 1139340  0.0  0.0  55920  5264 ?        S    14:15   0:00  \_ nginx: worker process


  • Master Process를 확인해 보자.


$(torchserve) cat /proc/1139315/limits | grep "open files"
Max open files            50000                50000                files


  • Master Process의 open files 제한이 변경되었고, Worker Processes의 제한을 변경하고 싶다면, /etc/nginx/nginx.confworker_rlimit_nofile의 값을 worker_connections의 2배 정도로 변경하면 된다.