我正在运行 CentOS 7.7,我想在具有自定义 www 和日志位置的自定义用户下运行 Nginx。我已经点击了 SELinux,所以我启用了我的自定义目录:
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
这是我的 nginx.conf:
user Xnginx Xgrp;
worker_processes auto;
error_log /opt/x/log/nginx/error.log;
pid /run/nginx.pid;
和目录权限:
ls -lZ /opt/X/log/
drwxrwxr-x. Xnginx Xgrp unconfined_u:object_r:httpd_log_t:s0 nginx
我开始 Nginx
systemctl start nginx
它给了
[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.
我可以看到子进程在用户下运行,而主进程以 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
最后是问题:
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
这些文件应该归 Xnginx 所有,而不是 root。为什么?
tl;博士
这可能是一个错误。当 nginx 启动时,它会创建日志文件,
ngx_init_cycle()
其中似乎不会调用chown()
日志文件。但是,当您指示 nginx 重新打开文件 (nginx -s reopen
) 时,它会通过ngx_reopen_files()
调用chown()
.此外,nginx 从不使用
user <user> [group]
指令中指定的组。调查
一、版本:
我
user www-data;
在我们的/etc/nginx/nginx.conf
.www-data
有 UID 33。我所有的日志文件都有“.log”后缀。首先,让我们删除日志文件,以便 nginx 必须创建它们:
然后,启动 nginx 并记录
strace
它的作用。-k
记录调用堆栈。注意 nginx 会一直在这里运行直到我们杀死它,所以切换到另一个终端窗口。
确认日志已创建并归以下人员所有
root:root
:删除旧文件以便 nginx 必须再次创建它们,并要求 nginx 重新打开日志文件:
检查文件是否属于
www-data:root
:我们现在可以杀死 nginx,在原来的终端中只需点击
CTRL+C
(或使用kill
)现在,让我们看看 strace 记录了什么:
如您所见
chown()
,仅在重新打开日志文件时调用,在ngx_reopen_files()