Estou executando o CentOS 7.7 e desejo executar o Nginx em um usuário personalizado com www personalizado e locais de log. Eu já acessei o SELinux, então habilitei meus diretórios personalizados:
semanage permissive -a httpd_t # temporarily make SELinux permissive
semanage fcontext -a -t httpd_sys_content_t '/opt/x/data/nginx(/.*)?'
restorecon -R -v /opt/x/data/nginx
semanage fcontext -a -t httpd_log_t '/opt/x/log/nginx(/.*)?'
restorecon -R -v /opt/x/log/nginx
Este é o meu nginx.conf:
user Xnginx Xgrp;
worker_processes auto;
error_log /opt/x/log/nginx/error.log;
pid /run/nginx.pid;
E os direitos do diretório:
ls -lZ /opt/X/log/
drwxrwxr-x. Xnginx Xgrp unconfined_u:object_r:httpd_log_t:s0 nginx
Eu inicio o Nginx com
systemctl start nginx
E dá
[root@RE1 nginx]# systemctl status nginx
nginx.service - The nginx HTTP and reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
Active: active (running) since Wed 2020-05-06 09:15:06 CEST; 12min ago
Process: 109185 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
Process: 109182 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
Process: 109180 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
Main PID: 109187 (nginx)
CGroup: /system.slice/nginx.service
├─109187 nginx: master process /usr/sbin/nginx
├─109188 nginx: worker process
├─109189 nginx: worker process
├─109190 nginx: worker process
└─109191 nginx: worker process
May 06 09:15:06 RE1 systemd[1]: Starting The nginx HTTP and reverse proxy server...
May 06 09:15:06 RE1 nginx[109182]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
May 06 09:15:06 RE1 nginx[109182]: nginx: configuration file /etc/nginx/nginx.conf test is successful
May 06 09:15:06 RE1 systemd[1]: Started The nginx HTTP and reverse proxy server.
Posso ver os subprocessos em execução sob o usuário enquanto o processo mestre é executado como root
1 0 109187 1 20 0 131148 2268 sigsus Ss ? 0:00 nginx: master process /usr/sbin/nginx
5 603 109188 109187 20 0 133632 3544 ep_pol S ? 0:00 \_ nginx: worker process
5 603 109189 109187 20 0 133632 3544 ep_pol S ? 0:00 \_ nginx: worker process
5 603 109190 109187 20 0 133632 3544 ep_pol S ? 0:00 \_ nginx: worker process
5 603 109191 109187 20 0 133632 3544 ep_pol S ? 0:00 \_ nginx: worker process
E finalmente o problema:
ls -lZ /opt/X/log/nginx/
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access.log
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 error.log
Os arquivos deveriam pertencer ao Xnginx, não ao root. Por quê?
tl;dr
Isso pode ser um bug. Quando o nginx é iniciado, ele cria arquivos de log nos
ngx_init_cycle()
quais parece não chamarchown()
os arquivos de log. No entanto, quando você instruir o nginx a reabrir os arquivos (nginx -s reopen
), ele fará isso por meiongx_reopen_files()
de , que chamachown()
.Além disso, o nginx nunca usa o grupo especificado na
user <user> [group]
diretiva.Investigação
Primeira versão:
Eu uso
user www-data;
diretiva em nosso arquivo/etc/nginx/nginx.conf
.www-data
tem UID 33. Todos os meus arquivos de log têm o sufixo '.log'.Primeiro, vamos remover os arquivos de log para que o nginx tenha que criá-los:
Em seguida, inicie o nginx e grave com
strace
o que ele faz.-k
pilha de chamadas de registros.Observe que o nginx continuará rodando aqui até que o eliminemos, então mude para outra janela de terminal.
Confirme se os logs foram criados e pertencem a
root:root
:Remova os arquivos antigos para que o nginx tenha que criá-los novamente e peça ao nginx para reabrir os arquivos de log:
Verifique se os arquivos são de propriedade de
www-data:root
:Agora podemos matar o nginx, no terminal original apenas aperte
CTRL+C
(ou usekill
)Agora, vamos ver o que o strace registrou:
Como você pode ver
chown()
, é chamado apenas ao reabrir arquivos de log, emngx_reopen_files()