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가 새 로그 파일과 올바르게 작동하도록 하는 유일한 방법은 섹션 postrotate
을 service 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.d
nginx가 해당 구성을 다시 로드하도록 명령을 변경하고 새 로그 파일을 사용합니다.
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)