これは、nginxが以前に正常に起動および停止した新しいインストールです。このエラーは、テスト(nginx -t)が成功したサーバーブロックを有効にした後に発生したと思います。次にnginxを再起動しようとしたところ、次のエラーが発生しました:
_nginx: [emerg] open() "/usr/share/nginx/on" failed (13: Permission denied)
_
再起動を試行する前は、ファイル「オン」は存在しませんでした。作成されたばかりで空です。 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
が返されます。
_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
とは何ですか?また、nginxの再起動を妨げる原因となる可能性があるiptablesに何かありますか?
_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
_
/ usr/share/nginx/...は、デフォルトのWebルートの場所です。何かを「オン」に設定し、誤ってそのファイルに触れた可能性があります。テストが機能するので、それも解決されている可能性がありますが、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...
root /var/nginx/..... # no semicolon sendfile on;
それらの行を見つけやすくするには¹:
$ Sudo grep -vR '^$\|^\s*\#' /etc/nginx/conf.d/* | grep -v ";"
または、「on」または「/ usr/share」を含む行:
$ Sudo grep -ER "on|/usr/share" /etc/nginx/conf.d/*
おそらくそれらの1つを修正する必要があります({}行にセミコロンを追加しないでください)。
$ Sudo rm /usr/share/nginx/on /var/run/nginx.pid
$ Sudo /etc/init.d/nginx restart
これは情報提供のみを目的としています。それは編集の中で常に発生し、私たち/将来の訪問者にとってピボットです。 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(コンテキストの変更)で修正されます。これに関する質問は 簡単に見つかります です。
パスが必要なプロパティがありますが、ブール値が指定されています。
access_log on;
access_log
にはパスが必要ですが、ブール値on
が指定されています。エラーを注意深く読むことでこれを確認できます:
nginx: [emerg] open() "/usr/share/nginx/on" failed (13: Permission denied)
Nginxベースパスに対するon
に注意してください。