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
$(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 확인
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
$(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
$(torchserve) cat /proc/1139315/limits | grep "open files"
Max open files 50000 50000 files
- Master Process의
open files
제한이 변경되었고, Worker Processes의 제한을 변경하고 싶다면, /etc/nginx/nginx.conf
의 worker_rlimit_nofile
의 값을 worker_connections
의 2배 정도로 변경하면 된다.