web-dev-qa-db-ja.com

CentOS 6.6とNginx 1.6.2-Nginxを突然再起動できません-nginx:[emerg] open() "/ usr / share / nginx / on" failed(13:Permission denied)

これは、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が返されます。

@ǝɲǝɲ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とは何ですか?また、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
_
2
John Andersen

/ 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...

**編集:コメントからの診断**

1.設定

  • 変更を注意深く確認してください。セミコロンがない場合、nginxは脆弱です。ほとんどすべての行は; で終わる必要があります。
    • いくつか見逃した場合、nginxは追加の行を同じディレクティブの一部であるかのように処理します。たとえば、次の2行は同じディレクティブとして処理されます(これより悪い場合もあります)。root /var/nginx/..... # no semicolon sendfile on;
    • 本当に優れた構文チェッカーであることは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/*

おそらくそれらの1つを修正する必要があります({}行にセミコロンを追加しないでください)。

$ 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 credit

5
ǝɲǝɲbρɯͽ

パスが必要なプロパティがありますが、ブール値が指定されています。

access_log on;

access_log にはパスが必要ですが、ブール値onが指定されています。エラーを注意深く読むことでこれを確認できます:

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

Nginxベースパスに対するonに注意してください。

4
Gajus