【发布时间】:2016-10-20 00:41:54
【问题描述】:
我正在着手查看我的 NGINX error.log 文件级别:警告... 可能是一个愚蠢的想法,并且会导致我在解决任何发生的错误时崩溃我的服务器,但是嘿,我们是书呆子和这就是我们在这里的原因。
我注意到每次重新启动服务器时都会弹出 [warn] 和 [emerg],其中显示:
[warn] 8041#0: the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:1
[emerg] 8041#0: open() "/run/nginx.pid" failed (13: Permission denied)
我的 nginx.conf 文件的顶部写着:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
这对我来说,向我展示了一些东西。
- 我正在与用户一起运行 NGINX:www-data。
- 自动调整允许的工作进程数。
- 我的 PID 文件/信息存储在 /run/nginx.pid 中。
错误告诉我 NGINX 没有访问 /run/nginx.pid 的权限,这导致我看到了该文件的用户权限。
sudo ls -la /run/nginx.pid
揭示:
-rw-r--r-- 1 root root 5 Jun 18 05:34 /run/nginx.pid
然后尝试:
ps -ef | grep nginx
产生:
root 5914 1 0 05:34 ? 00:00:00 nginx: master process /u
www-data 5917 5914 0 05:34 ? 00:00:00 nginx: worker process
抓头
现在,有人可以告诉我为什么,或者 NGINX 是如何设法创建具有 root 所有权的主进程,而现在工作进程由 www-data 拥有吗?
或者更重要的是,有人对我遇到的这个 [emerg] 错误有什么建议吗?
我的第一个想法是尝试更改 /run/nginx.pid 文件的所有权,看看 NGINX 喜欢它,但我觉得即使我这次手动这样做,当我重新启动服务器时,我会遇到同样的问题。
我的第二个想法可能是我在 NGINX 中定义我的工作进程启动的其他地方..
谢谢。
编辑
/etc/systemd/system/multi-user.target.wants/nginx.service文件的内容是:
[Unit]
Description=A high performance web server and a reverse proxy server
After=network.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=/usr/sbin/nginx -s quit
[Install]
WantedBy=multi-user.target
【问题讨论】:
-
这是
user参数(see this)的正确行为。该错误还源于nginx旨在以root运行主进程这一事实。你怎么开始nginx?systemd?init-v?二进制setuid有没有机会? -
好的。所以 NGINX 应该以 root 身份运行主进程。因此,如上所示,关于权限,一切都应该如此。我仍然很困惑为什么会弹出我的 [emerg] 错误。我的 NGINX 从 AWS 服务器开始,几乎没有停机。但是,如果我使用
sudo service nginx restart重新启动,我会看到上述错误。你能告诉我如何确切地找到它是如何开始的,这样我就可以回答你的问题@grochmal? -
嗯,不同的操作系统目前有不同的启动过程,尽管
systemd是迄今为止最常见的。如果您有systemctl命令,则您正在使用systemd,如果您有它,将向我们解释nginx如何启动的文件应位于/etc/systemd/system/multi-user.target.wants/nginx.service下。 -
请参阅我添加到上述问题的编辑。我认为这意味着它是 systemd,@grochmal,?我还看到
nginx.pid声明在我的nginx.conf文件和我的/etc/systemd/system/multi-user.target.wants/nginx.service文件中都匹配,并且它正在分叉。所以还没有任何提醒我,也许我没有看到它? -
这解释了为什么主进程以
root运行,对吧? (systemd 在ExecStart=中没有以其他用户身份运行的指令)。现在,您的工作进程以ww-data运行,因此nginx不会忽略user www-data;。因此,错误令人费解。您在哪个日志中看到这些错误?在nginx.conf中配置的error_log内部?