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
.
LimitNOFILE
systemd를 통해 구성된 데몬은 실제로 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
이 문제에 대한 몇 가지 링크와 리소스는 다음과 같습니다.
- https://serverfault.com/questions/628610/increasing-nproc-for-processes-launched-by-systemd-on-centos-7
- https://bugzilla.redhat.com/show_bug.cgi?id=754285
이 방향을 알려준 @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