데몬 nginx 기본 프로세스에 대해 "최대 열린 파일 수"의 ulimit를 구성합니다.

데몬 nginx 기본 프로세스에 대해 "최대 열린 파일 수"의 ulimit를 구성합니다.

nginx데비안(8.3)에서 -daemon을 실행하고 있습니다 . nginx 프로세스는 로그 파일에 쓰려고 할 때 때때로 리소스 제한에 직면합니다 too many open files.

기본 nginx프로세스는 루트로 실행되는 반면 4개의 작업자 프로세스는 www-data사용자 권한으로 실행됩니다.

nginx-master 및 작업자당 프로세스 제한 구성을 확인했을 때 이상한 점을 발견했습니다.

cat /proc/{nginx-master-process-id}/limits
Limit                     Soft Limit           Hard Limit           Units
Max open files            1024                 4096                 files

cat /proc/{nginx-any-worker-process-id}/limits
Max open files            30000                30000                files

각 nginx 작업자는 30,000개의 파일을 열 수 있습니다.

그러나 nginx 기본 프로세스는 1024개의 파일만 열 수 있도록 허용하는 반면 하드 제한은 각각 4096개의 파일입니다.

루트 사용자 ulimit 설정을 확인했을 때 그러한 제한이 정의되어 있지 않은 것을 발견했습니다! 이 1024/4096 설정은 어디에서 올 수 있습니까?

루트 ulimit 설정

# logged in as root
ulimit -H
unlimited

또한 데몬 구성을 확인했습니다.

/lib/systemd/system/nginx.service

[Unit]
Description=A high performance web server and a reverse proxy server
After=network.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --signal QUIT --retry QUIT/5 --pidfile /run/nginx.pid
# Give Passenger a chance to clean up before being killed by systemd.
ExecStop=/bin/sleep 1
TimeoutStopSec=5
KillMode=mixed

[Install]
WantedBy=multi-user.target

여기에도 ulimit 구성이 표시되지 않습니다.

-master 프로세스에 대한 1024/4096 파일 없음 제한을 수정하려면 어디에서 확인할 수 있나요 nginx?

답변1

것 같다질문말하자면, 나는 systemd 서비스가 /etc/security/limits.conf.

LimitNOFILEsystemd를 통해 구성된 데몬은 실제로 Limit.conf의 설정을 의도적으로 무시하고 서비스 구성 파일에서 구성을 요구하는 것으로 나타났습니다 .

내 시스템 장치 파일을 업데이트하면 문제가 해결되었습니다.

/lib/systemd/system/nginx.service

[Unit]
Description=A high performance web server and a reverse proxy server
After=network.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --signal QUIT --retry QUIT/5 --pidfile /run/nginx.pid
# Give Passenger a chance to clean up before being killed by systemd.
ExecStop=/bin/sleep 1
TimeoutStopSec=5
KillMode=mixed
LimitNOFILE=30000 # <= This line was added

[Install]
WantedBy=multi-user.target

이 문제에 대한 몇 가지 링크와 리소스는 다음과 같습니다.

이 방향을 알려준 @ijaz-khan에게 감사드립니다.

답변2

이를 달성하는 가장 좋은 방법은 서비스 파일을 복사하는 것입니다.

cp /lib/systemd/system/nginx.service /etc/systemd/system

그런 다음 에서 편집하세요 /etc/systemd/system. 존재하는 경우 다음을 생성하여 /etc/systemd/system/nginx.service.d간단한 재정의를 수행할 수 있습니다./etc/systemd/system/nginx.service.d/ulimit.conf

[Service]
LimitNOFILE=30000

/etc시스템 정의 파일을 처리할 때 덮어쓰기 방법을 사용하는 것이 좋습니다. 마지막으로 잊지 마세요systemctl daemon-reload

관련 정보