这是一个新安装,其中 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
在正常情况下,您不会想在实时网站上这样做。有更好的方法,包括:
- $ sudo /etc/init.d/nginx 重新加载
- 优雅的控制选项
重新启动 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 会(正确地)抑制异常进程操作。
- 如果你遗漏了一些,nginx 会将其他行视为同一指令的一部分进行处理。例如(情况可能比这更糟)这两行被视为同一指令进行处理:
为了更容易找到这些线条¹:
$ 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(更改上下文)修复,有关此问题的问题如下很容易找到。