nginx가 로그의 파일 설명을 저장하는 이유는 무엇입니까?

nginx가 로그의 파일 설명을 저장하는 이유는 무엇입니까?

Red Hat Enterprise Linux Server 버전 6.6(San Diego) nginx 버전: nginx/1.0.15

일반적인 nginx logrotate 구성을 사용하고 logrotate는 잘 작동하며 nginx는 access.log 또는 error.log와 같은 새 로그 파일을 생성합니다.

# cat /etc/logrotate.d/nginx 
/var/log/nginx/*log {
    daily
    rotate 4
    missingok
    notifempty
    compress
    sharedscripts
    postrotate
       /bin/kill -USR1 $(cat /var/run/nginx.pid 2>/dev/null) 2>/dev/null || :
    endscript
}

그러나 한 번은 여유 공간이 부족해졌고 잠시 후 nginx가 삭제된 파일의 파일 설명자를 유지하고 있음을 발견했습니다. 서버 공간을 확보하는 유일한 방법은 nginx를 다시 시작하여 파일 설명자를 확보하는 것입니다.

어떤 아이디어가 있나요?

>     [srv2 nginx]# logrotate -f  /etc/logrotate.d/nginx 
>     [srv2 nginx]#  lsof +L1
>     COMMAND    PID        USER   FD   TYPE DEVICE SIZE/OFF NLINK NODE NAME
>     vmtoolsd  1125        root    3u   REG  253,3     4240     0   45 /tmp/vmware-root-2883746505/vmware-apploader-1125.log (deleted)
>     nginx    38748 nginx    2w   REG  253,4  1370362     0  674 /var/log/nginx/error.log.1 (deleted)
>     nginx    38748 nginx    4w   REG  253,4  1370362     0  674 /var/log/nginx/error.log.1 (deleted)
>     nginx    38748 nginx    5w   REG  253,4        0     0  220 /var/log/nginx/access.log (deleted)
>     nginx    38748 nginx    6w   REG  253,4    41819     0  693 /var/log/nginx/localhost.access.log.1 (deleted)
>     nginx    38749 nginx    2w   REG  253,4  1370362     0  674 /var/log/nginx/error.log.1 (deleted)
>     nginx    38749 nginx    4w   REG  253,4  1370362     0  674 /var/log/nginx/error.log.1 (deleted)
>     nginx    38749 nginx    5w   REG  253,4        0     0  220 /var/log/nginx/access.log (deleted)
>     nginx    38749 nginx    6w   REG  253,4    41819     0  693 /var/log/nginx/localhost.access.log.1 (deleted)
>     nginx    38750 nginx    2w   REG  253,4  1370362     0  674 /var/log/nginx/error.log.1 (deleted)
>     nginx    38750 nginx    4w   REG  253,4  1370362     0  674 /var/log/nginx/error.log.1 (deleted)
>     nginx    38750 nginx    5w   REG  253,4        0     0  220 /var/log/nginx/access.log (deleted)
>     nginx    38750 nginx    6w   REG  253,4    41819     0  693 /var/log/nginx/localhost.access.log.1 (deleted)

답변1

이는 정상적인 현상입니다. 재부팅하지 않고 로그를 "회전"할 수 있으므로 프로세스(실제로 모든 프로세스)는 설명자를 열어 둡니다.

postrotate또는 를 사용하십시오 copytruncate.

postrotate   
    kill -USR1 `cat /var/run/nginx.pid` &>/dev/null   
endscript

신호는 USR1우리에게 말해준다로그 파일을 다시 로드합니다(따라서 설명자를 해제함).

답변2

이는 ModSecurity 저장소에서 제가 열었던 것과 똑같은 문제입니다. 참고로, nginx 지원을 위한 전문적인 유료 계약을 얻기 위해 spyderlabs에 연락했습니다. 그들이 nginx 지원 작업을 시작한 이후로는 소식을 듣지 못했습니다... 이제 다른 보류 중인 오류가 있기 때문에 nginx의 모든 mod_security 모듈을 일시적으로 중지했습니다. 아무런 해결책도 없이...

관련 정보