Estou tendo problemas com qualquer comando que diga ao nginx para usar novos arquivos de log. Estou usando Ubuntu 18.04, nginx/1.14.0, logrotate 3.11.0
Se eu criar arquivos novos access.log
ou error.log
em /var/log/nginx, manualmente ou via logrotate, eles não serão usados e, em vez disso, o serviço usará os arquivos de log antigos (que renomeei para access.log.1
este teste, simulando o que o logrotate faz).
Eu tentei os seguintes comandos (separadamente). Nenhum deles produz qualquer mensagem de erro, todos produzem a saída esperada. Mas o nginx se recusa a parar de usar os logs antigos.
service nginx rotate
invoke-rc.d nginx rotate
kill -USR1 `cat /var/run/nginx.pid`
Também verifiquei se o .pid
arquivo acima está no lugar correto.
A única maneira de fazer a rotação do log funcionar é por meio de um service nginx reload
, que faz o trabalho, mas também recarrega os arquivos de configuração. Sei que não há tempo de inatividade com a recarga, mas ainda assim prefiro recarregar o mínimo possível, por isso quero começar a service nginx rotate
trabalhar.
Tenho quase certeza de que é devido a problemas de permissão no /var/log
. Recentemente, configuramos um cronjob para garantir que os arquivos de log tenham permissões seguras. Isto foi para uma auditoria, já que a empresa de pentest sugeriu várias medidas de segurança em relação ao registro. O cronjob que configuramos é executado na inicialização:
#!/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
Aqui estão as permissões de diretórios e arquivos relevantes após executar o cronjob:
O próprio diretório /var/log:
drwxrwx--- 14 root syslog 4096 Aug 27 10:01 log
O próprio diretório /var/log/nginx:
drwxr----- 2 www-data adm 4096 Aug 24 02:25 nginx
E o conteúdo de /var/log/nginx (usamos logs nomeados personalizados em nossa configuração nginx):
-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
Se executarmos logrotate --force /etc/logrotate.d/nginx -v
(detalhadamente), ou mesmo um manual touch
para criar novos arquivos, eles serão criados com 640 permissões (conforme arquivo de configuração do logrotate). Pelo que li, 640 é suficiente:
-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
Como você pode ver, os novos arquivos permanecem vazios e o registro continua no arquivo antigo. Também verifiquei a saída detalhada do logrotate e tudo parece estar funcionando bem em relação à seção postrotate. (Que executa invoke-rc.d nginx rotate
. Como mencionei anteriormente, este comando não parece girar nada...)
Como último teste, tentei dar permissões de execução ao usuário para os novos arquivos e fiz um arquivo service nginx rotate
. Ainda assim, o nginx usa os arquivos antigos. Algumas outras respostas mencionam para verificar se o espaço em disco está cheio. Não é.
Agradeceríamos ajuda com isso! Obrigado.
Mais informações
Aqui está minha configuração /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
}
Como mencionado acima, a única maneira de fazer com que o logrotate e o nginx funcionem corretamente com os novos arquivos de log é substituindo a postrotate
seção por service nginx reload
.
Aqui está a saída de 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
Aqui está o getfacl
/var/log:
# file: var/log
# owner: root
# group: syslog
user::rwx
group::rwx
other::---
E aqui está o getfacl
/var/log/nginx:
# file: var/log/nginx
# owner: www-data
# group: adm
user::rwx
group::r--
other::---
Responder1
O /etc/logrotate.d/nginx
é o padrão e deve funcionar.
No entanto, alterando o postrotate.d
comando, para forçar o nginx a recarregar sua configuração (e usar o novo arquivo de log)
service nginx reload >/dev/null 2>&1
pode ser uma solução rápida.
Freqüentemente, quando um serviço normalmente funcional não consegue criar/abrir/renomear/alterar um arquivo, direitos de acesso estão envolvidos.
Aqui os acessos foram alterados (por questão de segurança), mas a acl padrão deveria estar funcionando/segura também, sem envolver setfacl
o que é poderoso, mas não aparece imediatamente ao usar as ls
opções padrão.
A acl padrão é, por/var/log
drwxrwxr-x 18 root syslog 4096 Aug 27 07:25 /var/log/
e o nginx padrão (na verdade) é
drwxr-x--- 2 www-data adm 4096 Aug 27 07:25 /var/log/nginx/
nginx
está bom, /var/log
poderia ser um pouco mais apertado
drwxrwx--x 18 root syslog 4096 Aug 27 07:25 /var/log/
que permitem others
visitar o diretório (e abaixo), mas impedem que listem o conteúdo.
Quanto ao facl, o getfacl
comando listará quais são as ACLs reais adicionadas para /var/log
e /var/log/nginx
que /var/log/nginx/*
podem revelar um problema.
Aliás, faça também um
dpkg-statoverride --list
para verificar quais ACLs o instalador definirá após uma atualização ou instalação e talvez alterar ou adicionar uma linha, se necessário (man dpkg-statoverride)