- worker_connections 지시어는 nginx의 worker process가 열 수 있는 최대 동시 연결 수를 설정(기본값은 512).
- 클라이언트 연결뿐만 아니라 모든 유형의 연결(프록시 서버와의 연결)이 최대 연결 수에 포함 → proxy_pass도 포함
- worker당 동시 연결 수에는 다른 제한이 있음 → 각 프로세스에 할당된 File Descriptors(파일 설명자)의 최대 수에 대한 OS 제한
- 최신 UNIX 배포판에서 File Descriptors(파일 설명자)의 최대 수에 대한 기본 제한은 1024개
- 가장 작은 규모의 nginx 배포를 제외한 모든 배포에서 worker당 512개의 연결 제한은 너무 작을 수 있음
- 이 문제를 해결하려면 기본 구성 컨텍스트에서 worker_rlimit_nofile 지시어를 사용하여 설정
- worker_rlimit_nofile 지시자
- worker process의 최대 파일 열기 수 제한(RLIMIT_NOFILE)을 변경
- Main Process를 다시 시작하지 않고 제한을 늘리는 데 사용
구문 : worker_rlimit_nofile number; 기본 : — 문맥 : main
- 더 많은 File Descriptors(파일 설명자)가 필요한 이유
- nginx worker process에서 클라이언트 또는 업스트림 서버로의 각 연결은 File Descriptors를 소비
- nginx가 웹 서버로 작동하는 경우, 클라이언트 연결에 하나의 File Descriptors를 사용하고 제공되는 파일당 하나의 File Descriptors를 사용하여 클라이언트당 최소 2개의 File Descriptors를 사용
- 프록시 서버로 작동하는 경우, nginx는 클라이언트 및 업스트림 서버 연결에 각각 하나의 File Descriptors 사용(2개 사용)하고, 서버의 응답을 임시로 저장하는 데 사용되는 파일에 세 번째 File Descriptors를 사용
- nginx가 캐싱 서버로 작동하는 경우, 캐시된 응답에 대해서는 웹 서버처럼 작동하고 캐시가 비어 있거나 만료된 경우에는 프록시 서버처럼 작동
- nginx는 로그 파일당 File Descriptors를 사용하고 Master 프로세스와 통신하기 위해 몇 개의 File Descriptors를 사용 → 일반적으로 몇 개의 File Descriptors 숫자는 연결 및 파일에 사용되는 File Descriptors의 수에 비해 작음
- UNIX는 프로세스당 File Descriptors 수를 설정하는 몇 가지 방법을 제공
- nginx를 시작하는 경우 ulimit 명령어
- ulimit 명령어는 프로세스가 사용하는 자원에 대한 제어 및 관리할 수 있게 해줌
- ulimit 명령어는 하나의 유저(쉘,프로세스)에 대해서 할당할 자원량의 한계를 정하는 것으로서 리눅스 시스템에서 과부하를 막아주는 방패가 되어 주는 유용한 설정
- ulimit는 일시적 설정
$ ulimit -n 65536
- soft와 hard 두 가지 타입
- soft → 새로운 프로그램을 생성하면 기본으로 적용되는 한도
- hard → soft 한도에서 최대로 늘릴 수 있는 한도
- nginx를 서비스로 시작하는 경우 init 스크립트 또는 systemd 서비스 manifest 변수 사용
$ vi /etc/systemd/system/nginx.service [Unit] Description=The NGINX HTTP and reverse proxy server After=syslog.target network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/run/nginx.pid ExecStartPre=/usr/local/nginx/sbin/nginx -t ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true LimitNOFILE=65535 LimitNOFILESoft=65535 [Install] WantedBy=multi-user.target
- /etc/security/limits.conf 파일 → 유저의 프로세스별 file open을 설정
- /etc/security/limits.conf 파일은 유저의 프로세스별 사용하는 자원에 대한 제어 및 관리할 수 있게 해줌
- 할당할 자원량의 한계를 정함으로 리눅스 시스템에서 과부하를 막아줌
- /etc/security/limits.conf 파일은 영구적 설정
$ vi /etc/security/limits.conf ## nginx 사용자 계정에 수치를 지정 nginx soft nofile 1048576 nginx hard nofile 1048576 nginx soft nproc 1048576 nginx hard nproc 1048576 ## *를 사용하여 모든 계정에 수치를 지정 * soft nofile 1048576 * hard nofile 1048576 * soft nproc 1048576 * hard nproc 1048576
- sysctl.conf 의 file open 확인 및 커널 설정
- sysctl.conf에서 시스템 전체에 대한 file open 개수를 설정
$ cat /proc/sys/fs/file-nr 3072 0 300000 | | | | | | | | 최대 오픈 파일 디스크립터 수(fs.file-max) | 할당되지 않은 파일 디스크립터 수 (2.6 커널에서는 항상 0으로 표기되며 이는 에러 아님) 할당된 파일 디스크립터 수
- 커널의 fs.file-max 파라미터는 시스템 전체에서 최대로 열 수 있는 파일 개수
- 커널의 fs.file-max 파라미터는 시스템의 메모리를 KB로 표현한 값의 10%가 적당
- 커널의 fs.nr_open 파라미터는 하나의 프로세스가 열 수 있는 최대 파일 개수
- 커널의 fs.nr_open 파라미터는 기본값은 1024*1024 (1048576) → 대부분의 머신에서 충분(Actual limit depends on RLIMIT_NOFILE resource limit.)
- 커널의 fs.file-max 파라미터와 fs.nr_open 파라미터 설정 확인 및 변경
## 기존 설정값 확인 $ sysctl -a | grep fs.file-max fs.file-max = 300000 $ cat /proc/sys/fs/file-max 300000 ## 기존 파라미터 값 수정 $ vim /etc/sysctl.conf fs.file-max = 1048576 ## 설정 값 적용 $ sysctl -p ## 변경 설정값 확인 $ sysctl -a | grep fs.file-max fs.file-max = 300000 $ cat /proc/sys/fs/file-max 300000 $ cat /proc/sys/fs/file-nr 3008 0 1048576
- sysctl.conf에서 시스템 전체에 대한 file open 개수를 설정
- nginx를 시작하는 경우 ulimit 명령어
- 시스템 전체에 File Descriptors 수에 대한 제한이 있으며, OS의 sysctl fs.file-max 명령으로 설정 가능
- nginx를 시작하는 방법에 따라 다르지만, worker_rlimit_nofile은 nginx를 시작하는 방법에 작동
- 모든 nginx worker process가 사용할 수 있는 최대 파일 설명자 수(worker_rlimit_nofile * worker_processes)가 fs.file-max보다 훨씬 적은지 확인 필요
- nginx가 사용 가능한 모든 File Descriptors를 사용하는 경우(예: DoS 공격), 문제를 해결하기 위해 컴퓨터에 로그인하는 것조차 불가능해짐
※ File Descriptor(파일 디스크립터)
- 리눅스 혹은 유닉스 계열의 시스템에서 프로세스(process)가 파일(file)을 다룰 때 사용하는 개념
- 프로세스에서 특정 파일에 접근할 때 사용하는 추상적인 값
- File Descriptor(파일 디스크럽터)는 일반적으로 0이 아닌 정수값을 갖음
참고 자료 : 가장 많이 실수하는 NGINX 설정 에러 10가지 - NGINX STORE
참고 자료 : file open 확인 및 커널 설정 : 네이버 블로그 (naver.com)
'Nginx > NGINX 설정 에러' 카테고리의 다른 글
upstream 서버에 대한 Keepalive 연결 활성화 → upstream http1.1 및 connection "" 초기화 (0) | 2024.03.31 |
---|---|
error_log에 off 사용 불가 → error_log /dev/null emerg으로 비활성화 (0) | 2024.03.31 |