NGINX 서비스 회전은 새 로그 파일을 사용하지 않습니다.

NGINX 서비스 회전은 새 로그 파일을 사용하지 않습니다.

nginx에게 새 로그 파일을 사용하도록 지시하는 명령에 문제가 있습니다. 저는 Ubuntu 18.04, nginx/1.14.0, logrotate 3.11.0을 사용하고 있습니다.

access.log/var/log/nginx에 수동으로 또는 logrotate를 통해 새 파일 을 생성하면 error.log해당 파일은 사용되지 않으며 대신 서비스는 이전 로그 파일을 사용합니다( access.log.1이 테스트를 위해 이름을 변경하여 logrotate의 기능을 시뮬레이션했습니다.)

다음 명령을 (별도로) 시도했습니다. 그 중 어느 것도 오류 메시지를 생성하지 않으며 모두 예상된 출력을 생성합니다. 그러나 nginx는 이전 로그 사용을 중단하지 않습니다.

service nginx rotate

invoke-rc.d nginx rotate

kill -USR1 `cat /var/run/nginx.pid`

.pid위 파일이 올바른 위치에 있는지도 확인했습니다 .

로그 회전 작업을 수행할 수 있었던 유일한 방법은 service nginx reload작업을 수행할 뿐만 아니라 구성 파일을 다시 로드하는 를 사용하는 것입니다. 다시 로드하면 가동 중지 시간이 없다는 것을 알고 있지만 여전히 가능한 한 적게 다시 로드하는 것을 선호하므로 작업을 시작하고 싶습니다 service nginx rotate.

.NET의 권한 문제로 인한 것이라고 거의 확신합니다 /var/log. 최근 우리는 로그 파일에 보안 권한이 있는지 확인하기 위해 cronjob을 설정했습니다. 이는 감사를 위한 것이었습니다. 침투한 회사에서 로깅과 관련하여 다양한 보안 조치를 제안했기 때문입니다. 우리가 설정한 cronjob은 부팅 시 실행됩니다.

#!/bin/bash
  
setfacl -Rm u::rwx,g::r--,o::--- /var/log
find /var/log -type f -exec chmod g-wx,o-rwx "{}" + -o -type d -exec chmod g-w,o-rwx "{}" +
chmod g+wx /var/log

chown -R www-data:adm /var/log/nginx

cronjob 실행 후 관련 디렉터리 및 파일의 권한은 다음과 같습니다.

/var/log 디렉토리 자체:

drwxrwx--- 14 root syslog  4096 Aug 27 10:01 log

/var/log/nginx 디렉토리 자체:

drwxr-----  2 www-data  adm               4096 Aug 24 02:25  nginx

그리고 /var/log/nginx의 내용(우리는 nginx conf에서 사용자 정의 명명된 로그를 사용합니다):

-rwxr----- 1 www-data adm     0 Aug 24 02:24 access.log
-rwxr----- 1 www-data adm   108 Aug 24 02:24 error.log
-rwxr----- 1 www-data adm 49317 Aug 27 10:11 x3nr0s.access.log
-rwxr----- 1 www-data adm   798 Aug 27 10:02 x3nr0s.error.log

새 파일을 생성하기 위해 (상세하게) 실행하거나 logrotate --force /etc/logrotate.d/nginx -v매뉴얼을 실행하면 touch해당 파일은 640개의 권한으로 생성됩니다(logrotate의 구성 파일에 따라). 내가 읽은 바에 따르면 640이면 충분합니다.

-rwxr----- 1 www-data adm     0 Aug 24 02:24 access.log
-rw-r----- 1 www-data adm     0 Aug 27 10:13 error.log
-rwxr----- 1 www-data adm  1972 Aug 27 10:13 error.log.1
-rw-r----- 1 www-data adm     0 Aug 27 10:13 x3nr0s.access.log
-rwxr----- 1 www-data adm 51521 Aug 27 10:13 x3nr0s.access.log.1
-rw-r----- 1 www-data adm     0 Aug 27 10:13 x3nr0s.error.log
-rwxr----- 1 www-data adm   798 Aug 27 10:02 x3nr0s.error.log.1

보시다시피 새 파일은 비어 있고 이전 파일에 대한 로깅이 계속됩니다. 또한 자세한 logrotate 출력을 확인한 결과 postrotate 섹션과 관련하여 모든 것이 제대로 작동하는 것 같습니다. (실행됩니다 invoke-rc.d nginx rotate. 앞서 언급했듯이 이 명령은 아무것도 회전하지 않는 것 같습니다...)

마지막 테스트로 사용자에게 새 파일에 대한 실행 권한을 부여하고 service nginx rotate. 그래도 nginx는 이전 파일을 사용합니다. 다른 답변에서는 디스크 공간이 가득 찼는지 확인하라고 언급합니다. 그렇지 않습니다.

이에 대한 도움을 주시면 감사하겠습니다! 감사해요.

추가 정보

내 /etc/logrotate.d/nginx 구성은 다음과 같습니다.

/var/log/nginx/*.log {
        daily
        missingok
        rotate 14
        compress
        delaycompress
        notifempty
        create 0640 www-data adm
        sharedscripts
        prerotate
                if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
                        run-parts /etc/logrotate.d/httpd-prerotate; \
                fi \
        endscript
        postrotate
                invoke-rc.d nginx rotate >/dev/null 2>&1
        endscript
}

위에서 언급했듯이 logrotate와 nginx가 새 로그 파일과 올바르게 작동하도록 하는 유일한 방법은 섹션 postrotateservice nginx reload.

출력은 다음과 같습니다 ps -ef | grep nginx.

root      1367     1  0 10:45 ?        00:00:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data  1368  1367  0 10:45 ?        00:00:00 nginx: worker process
www-data  1369  1367  0 10:45 ?        00:00:00 nginx: worker process
www-data  1370  1367  0 10:45 ?        00:00:00 nginx: worker process
www-data  1371  1367  0 10:45 ?        00:00:00 nginx: worker process
root     15247 14835  0 11:19 pts/0    00:00:00 grep --color=auto nginx

getfacl/var/log는 다음 과 같습니다 .

# file: var/log
# owner: root
# group: syslog
user::rwx
group::rwx
other::---

그리고 여기에 getfacl/var/log/nginx가 있습니다:

# file: var/log/nginx
# owner: www-data
# group: adm
user::rwx
group::r--
other::---

답변1

이것이 /etc/logrotate.d/nginx기본값이며 작동해야 합니다.

그러나 postrotate.dnginx가 해당 구성을 다시 로드하도록 명령을 변경하고 새 로그 파일을 사용합니다.

  service nginx reload >/dev/null 2>&1

빠른 해결이 될 수도 있습니다.

일반적으로 작동하는 서비스가 파일 생성/열기/이름 바꾸기/변경을 할 수 없는 경우 액세스 권한이 관련되는 경우가 많습니다.

여기서는 보안을 위해 액세스가 변경되었지만 기본 acl도 작동/안전해야 합니다. 이는 강력 setfacl하지만 기본 옵션을 사용할 때 즉시 나타나지 않습니다 ls.

기본 acl은 다음과 같습니다./var/log

drwxrwxr-x 18 root syslog 4096 Aug 27 07:25 /var/log/

기본 nginx (실제로)는 다음과 같습니다.

drwxr-x--- 2 www-data adm 4096 Aug 27 07:25 /var/log/nginx/

nginx괜찮아요, /var/log조금 더 타이트해도 돼요

drwxrwx--x 18 root syslog 4096 Aug 27 07:25 /var/log/

해당 others디렉터리(및 아래)를 방문할 수는 있지만 콘텐츠를 나열할 수는 없습니다.

facl의 경우 명령은 문제를 드러낼 수 있는 및 에 getfacl대해 실제로 추가된 ACL이 무엇인지 나열합니다 ./var/log/var/log/nginx/var/log/nginx/*

그건 그렇고, 또한

dpkg-statoverride --list

업데이트 또는 설치 후 설치 프로그램이 설정할 ACL을 확인하고 필요한 경우 줄을 변경하거나 추가할 수 있습니다(남자 dpkg-statoverride)

관련 정보