【问题标题】:nginx.conf and nginx.pid users and permissionsnginx.conf 和 nginx.pid 用户和权限
【发布时间】: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;

这对我来说,向我展示了一些东西。

  1. 我正在与用户一起运行 NGINX:www-data。
  2. 自动调整允许的工作进程数。
  3. 我的 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 运行主进程这一事实。你怎么开始nginxsystemd?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 内部?

标签: nginx server pid


【解决方案1】:

我今天在我的 Centos 7 服务器上遇到了同样的错误。

nginx.pid" 失败(13:权限被拒绝)

对我来说,原来是 SELinux 的问题。我做了以下操作以使其再次工作:

systemctl stop nginx
touch /var/run/nginx.pid
chcon -u system_u -t httpd_var_run_t /var/run/nginx.pid
systemctl start nginx

运行

ls -Z nginx.pid

应该输出

-rw-r--r--。 root root system_u:object_r:httpd_var_run_t:s0 nginx.pid

【讨论】:

  • 你从哪个目录运行它?您的第三行将nginx.pid 引用为相对的,但显然有一个/run/nginx.pid 和一个/var/run/nginx.pid
  • +1 为此,它解决了我在 CentOS 7 上的问题。这个问题是由于以前的安装在我需要的低得多的版本中发生的,它安装了 1.12,我需要 1.17。运行 touch 命令而不在 nginx.pid 未创建的文件夹中,但我必须直接进入该文件夹才能使其生效。
  • 从 /var/run/ 目录运行第三个命令后,这在使用 nginx 1.19 的 centos 8 上有效
  • 也为我工作!编辑在chcon中添加路径。
【解决方案2】:

在我的情况下,我得到了一个

    "/usr/local/var/run/nginx.pid" failed (13: Permission denied)

    bind() to 0.0.0.0:80 failed (48: Address already in use)

工作解决方案由以下步骤组成:

  1. 停止根进程

    sudo nginx -s stop
    
  2. 检查进程是否停止

    ps aux | grep nginx
    
  3. 重启进程

    sudo nginx -s reload
    

给了我错误

    nginx: [error] open() “/usr/local/var/run/nginx.pid” failed (2: No such file or directory)

probabil .pid 是用错误的 root 用户启动的,因为我在 /usr/local/etc/nginx/nginx.conf 中取消注释带有 .pid 路径的行,然后我再次将其注释掉

  1. 以用户而非 root 身份启动 nginx

    brew services start nginx
    
  2. 运行命令的结果

    ps aux | grep nginx
    
    youruser 89212 0.0 0.0 4268280 644 s002  S+ 2:46PM 0:00.00 grep nginx
    youruser 89179 0.0 0.0 4302204 1776 ?? S 2:45PM 0:00.00 nginx: worker process  
    youruser 89178 0.0 0.0  4275372 4368 ?? S 2:45PM 0:00.01 nginx: master process /usr/local/opt/nginx/bin/nginx -g daemon off;
    

可以看出,nginx 进程以预期用户而不是以 root 身份启动,进程之间的冲突消失了,我可以访问 PHP 应用程序本地域。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    • 2011-03-07
    • 2016-05-05
    • 1970-01-01
    相关资源
    最近更新 更多