回复@ǝɲǝɲbρɯͽ:

回复@ǝɲǝɲbρɯͽ:

这是一个新安装,其中 nginx 之前启动和停止正常。我相信此错误是在启用测试成功的服务器块(nginx -t)后出现的。然后我尝试重新启动 nginx 并收到此错误:

nginx: [emerg] open() "/usr/share/nginx/on" failed (13: Permission denied)

在尝试重新启动之前,文件“on”不存在。它刚刚创建并且是空的。当我重新启动 php-fmp(成功)然后尝试再次重新启动 nginx 时,错误更改为:

nginx: [emerg] open() "/var/run/nginx.pid" failed (13: Permission denied)
nginx: configuration file /etc/nginx/nginx.conf test failed

但是再次运行 nginx -t 时,测试成功:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

我以为这可能是用户问题但一切似乎都很好:

# ps -elf | grep nginx
5 S nginx     2774  2773  0  80   0 - 234152 skb_re 22:07 ?       00:00:00 php-fpm: pool www
5 S nginx     2775  2773  0  80   0 - 234152 skb_re 22:07 ?       00:00:00 php-fpm: pool www
5 S nginx     2776  2773  0  80   0 - 234152 skb_re 22:07 ?       00:00:00 php-fpm: pool www
5 S nginx     2777  2773  0  80   0 - 234152 skb_re 22:07 ?       00:00:00 php-fpm: pool www
5 S nginx     2778  2773  0  80   0 - 234152 skb_re 22:07 ?       00:00:00 php-fpm: pool www
0 R root      2940  2472  0  80   0 - 25811 -      22:18 pts/0    00:00:00 grep nginx

尽管 Nginx 没有运行,但 nginx.pid 文件仍然存在,因此我将其删除。这样做只是将错误消息改回:

nginx: [emerg] open() "/usr/share/nginx/on" failed (13: Permission denied) nginx: configuration file /etc/nginx/nginx.conf test failed.

无论我如何尝试重新启动系统(包括$ sudo /etc/init.d/nginx restart和 ) ,都会收到此错误$ sudo /etc/init.d/nginx reload。我删除了空的“on”文件,这也没有区别。当我使用 时$ getenforce,它会返回Enforcing

回复@ǝɲǝɲbρɯͽ:

sudo grep -vR '^$\|^\s*\#' /etc/nginx/conf.d/* | grep -v ";"并且sudo grep -vR '^$\|^\s*\#' /etc/nginx/nginx.conf* | grep -v ";"没有缺失分号。

该命令sudo grep -ER "on|/usr/share" /etc/nginx/*打印出了 nginx 中几乎每个文件的每一行,所以我不确定我能从这些信息中了解到什么。顺便说一句,/usr/shar/nginx只包含那个空on文件,没有其他内容。

sudo ausearch -m avc -ts recent -c nginx<no matches>

不用说,我是服务器问题方面的新手,但我认为命令service --status-all(如下)可能会产生有用的信息。当然,我们已经知道即使 nginx 死了,pid 文件仍然存在,但是什么master (pid 1924) is running?此外,iptables 中是否有任何东西可以负责阻止 nginx 重启?

atd (pid  1995) is running...
auditd (pid  1405) is running...
crond (pid  1982) is running...
htcacheclean is stopped

Table: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all      ::/0                 ::/0                state RELATED,ESTABLISHED
2    ACCEPT     icmpv6    ::/0                 ::/0
3    ACCEPT     all      ::/0                 ::/0
4    ACCEPT     udp      ::/0                 fe80::/64           state NEW udp dpt:546
5    ACCEPT     tcp      ::/0                 ::/0                state NEW tcp dpt:22
6    REJECT     all      ::/0                 ::/0                reject-with icmp6-adm-prohibited

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    REJECT     all      ::/0                 ::/0                reject-with icmp6-adm-prohibited

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

Table: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:80
5    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
6    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
7    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:3306
8    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

iscsi is stopped
iscsid is stopped
lvmetad is stopped
mdmonitor (pid  1445) is running...
multipathd is stopped
mysqld is stopped
netconsole module not loaded

Configured devices:
lo bond0 em1 em2

Currently active devices:
lo em1 em2 bond0

nginx dead but pid file exists
php-fpm is stopped
master (pid  1924) is running...
rdisc is stopped
restorecond is stopped
rsyslogd (pid  1425) is running...
sandbox is stopped
saslauthd is stopped
snmpd is stopped
snmptrapd is stopped
openssh-daemon (pid  1486) is running...
svnserve is stopped

答案1

您有一个需要路径的属性,但提供了一个布尔值,例如

access_log on;

access_log期望输入的是路径,但提供的是布尔值on。您可以通过仔细阅读错误来确认这一点:

nginx: [emerg] open() "/usr/share/nginx/on" failed (13: Permission denied)

注意on相对于你的 nginx 基本路径。

答案2

/usr/share/nginx/... 是默认的 webroot 位置;您可能将某些内容设置为“打开”,并意外触碰了该文件。由于您的测试有效,因此问题可能也已解决,但当 nginx 崩溃(或发生 kill -9 之类的情况)时,它不会删除其 pid 文件。

我没有使用过 php-fpm,但看起来你的 nginx 主进程没有运行。你可以通过以下方法进行确认:

$ ps axu | grep `cat /var/run/nginx.pid`

这些是反引号 (`) 而不是撇号 (')。如果它没有运行,请删除 pid 文件:

$ sudo rm /var/run/nginx.pid

然后重启 nginx。在许多系统上,这是:

$ sudo /etc/init.d/nginx restart

在正常情况下,您不会想在实时网站上这样做。有更好的方法,包括:

重新启动 nginx 后,您应该会看到类似以下内容:

$ ps axu | grep nginx

... worker threads
... 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf

你也可以:

$ /etc/init.d/nginx status

nginx (pid  1111) is running...

**编辑:根据评论进行诊断**

1.配置

  • 仔细查看您的更改。nginx 在缺少分号时很脆弱。几乎每一行都必须以 ; 结尾
    • 如果你遗漏了一些,nginx 会将其他行视为同一指令的一部分进行处理。例如(情况可能比这更糟)这两行被视为同一指令进行处理: root /var/nginx/..... # no semicolon sendfile on;
    • nginx 并没有责任为您提供一个真正优秀的语法检查器,因此无法保证 nginx 会在尝试启动工作进程之前检测到此错误,而 SELinux 会(正确地)抑制异常进程操作。

为了更容易找到这些线条¹:

$ sudo grep -vR '^$\|^\s*\#' /etc/nginx/conf.d/* | grep -v ";"

或者包含“on”或“/usr/share”的行:

$ sudo grep -ER "on|/usr/share" /etc/nginx/conf.d/*

您可能需要修复其中一个(不要在 {} 行中添加分号),然后:

$ sudo rm /usr/share/nginx/on /var/run/nginx.pid
$ sudo /etc/init.d/nginx restart

2. 元数据:证明 SELinux 参与(或不参与)

这仅供参考。它在编辑中一直出现,并且是我们/未来访问者的支点。假设 nginx 仍然损坏(您尚未修复配置):

$ sudo /etc/init.d/nginx start
$ sudo ausearch -m avc -ts recent -c nginx

虽然我们正在对 nginx 进行过滤(可能还有其他拒绝),但如果您看到以下情况,则可能未指示 SELinux:

<no matches>

SELinux 使用类似如下的 AVC 来表示:

type=AVC msg=audit(timestamp:123): avc:  denied  { getattr } for  pid=1234 comm="nginx" path="/usr/share/nginx/on" dev=sda ino=123456 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:var_t:s0 tclass=file

问题在于,在启动过程中的某个时刻,文件是在不同于 nginx 或其工作程序(切换安全上下文)的上下文中创建的,因此不允许接触。如果需要,可以通过向许多命令添加 -Z 来查看上下文,使用 chcon(更改上下文)修复,有关此问题的问题如下很容易找到

¹grep 信用

相关内容