まずは確認のコマンド達 ( root で実行してます )

A.親プロセス確認

ps aux | grep httpd | grep Ss

とか
A’.親プロセスID直確認

cat /var/run/httpd.pid

B. 子プロセス確認

ps aux | grep httpd | grep -v Ss |grep -v grep

上記をふまえて。

1.がっつりこけちゃう、でもアクセスしたら閲覧できちゃう

/etc/init.d/httpd restart
とかしても


/etc/init.d/httpd restart
Stopping httpd: [FAILED]
Starting httpd: (98)Address already in use: make_sock: could not bind to address [::]:80
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
[FAILED]

こけちゃう場合。

親プロセスは死んでるけど子プロセスが生きているため。
ちなみに、/etc/init.d/httpd status とすると

httpd is stopped

となるのに、B. を実行すると


apache 14869 0.0 0.3 275980 7316 ? S 03:29 0:00 /usr/sbin/httpd
apache 14871 0.0 0.3 275980 7312 ? S 03:29 0:00 /usr/sbin/httpd
apache 14872 0.0 0.3 275980 7312 ? S 03:29 0:00 /usr/sbin/httpd
apache 14873 0.0 0.3 275980 7312 ? S 03:29 0:00 /usr/sbin/httpd
apache 14874 0.0 0.3 275980 7312 ? S 03:29 0:00 /usr/sbin/httpd
apache 14875 0.0 0.3 275980 7312 ? S 03:29 0:00 /usr/sbin/httpd
apache 14876 0.0 0.3 275980 7312 ? S 03:29 0:00 /usr/sbin/httpd
apache 14877 0.0 0.3 275980 7312 ? S 03:29 0:00 /usr/sbin/httpd

にょろーんと出てくる。
なーので実際にアクセスしてみると、待ち受けてくれてる。死に体で出迎えてくれる。
両親はもうとっくにいないのに、健気である。
これは実に厄介で僕の知ってる監視プログラムだと検知しない(待ち受けてるし実際しばらくは処理出来るため)
それでもやっぱり正常起動ってわけではないので時間がくれば必ず落ちる。ストンなのでとても困る。
ということでこんな症状に気づいた場合は子プロセスを奇麗に殺してください。
(それ以外の奇麗に安全な方法ってあるのかなあ? DBの整合性とか気になるんだなあ)

2.restart できちゃってる風、でも全然出来てない

/etc/init.d/httpd restart は


Stopping httpd: [FAILED]
Starting httpd: [ OK ]

成功するのに、
/etc/init.d/httpd status で、

httpd dead but subsys locked

と表示されるにょろーんな場合。
(ちなみに僕の経験ではこの事象が起きてる際には /var/run/httpd.pid は存在しないです)

これはもう完全に落ちていて、
A. A’.(先述通りpidファイルない) も B. も全てけんもほろろである。
これはセマフォっていう仕組みが問題になっているようです。
ipcs -s を実行して見ると、apache 行が山盛りになってます。
実際に行数をカウントしてみると、

ipcs -s|grep -c apache

126

という感じでした。再起動し過ぎ。ふざけ過ぎ。
以下を参照。エントリ最下段にセマフォ開放ワンライナーあり。
kameid さん、どうもありがとうございます。これなかったら今日はやばかったです。
apache がセマフォを使い切る – kameidの備忘録 – Sharpen the Saw!

そしたら restart できるよ。

  4 Responses to “httpd(Apache)が立ち上がらない時のまとめ”

  1. > 時間がくれば必ず落ちる。
    ノー ちがいます。 時間ではありません。

    httpdの子プロセスはMaxRequestsPerChildディレクティブに設定された回数分の処理を行って自滅します

    CentOS標準のApache2.2をお使いなら MaxRequestsPerChildは 4000 もしくは0という値が設定されているでしょう。
    $ grep MaxRequestsPerChild /etc/httpd/conf/httpd.conf | grep -v ^#
    MaxRequestsPerChild 4000
    MaxRequestsPerChild 0

    これは、httpd.conf全体をみればわかりますが
    Server MPM: Preforkの時 MaxRequestsPerChild 4000
    Server MPM: Wokerの時: MaxRequestsPerChild 0
    という意味です。

    自分がどちらのMPMを使っているか知りたい場合は
    $ /usr/sbin/httpd -V | grep “Server MPM”
    で確認しましょう。

    そしてセマフォが枯渇することが分かっているのなら泥縄的対処ではなくはじめから多めに確保すればいいんじゃないでしょうか?
    # sysctl -a | grep kernel.sem
    kernel.sem = 250 32000 32 128

    SEMOPMとSEMMNIの値を増やしたいなら

    (1) /proc/sys/kernel/sem 以下に直接値を叩き込む方法
    # echo “250 32000 128 1024″ > /proc/sys/kernel/sem

    (2) 恒久的に設定したいなら
    #vi /etc/sysctl.cof
    1行追加
    kernel.sem = 250 32000 128 1024
    #sycctl -p

    詳しくは RedHatの公式ドキュメント
    http://www.redhat.com/docs/manuals/enterprise/RHELTuningandOptimizationforOracleV11.pdf
    19ページ Setting Semaphoresを参照してくださいね

    日本語でかいつまんで説明しているドキュメントは ココ
    http://www.oracle.co.jp/2shin/no86/o35linux.html

  2. 有益な情報ありがとうございます!
    後ほど実機で確認して再まとめしたいと思います。

  3. [...] 以前まとめました、 httpd(Apache)が立ち上がらない時のまとめ にとても有益なコメントをコメントって改行できるのかな?さんより頂きました。 (名前は本意ではないかもしれませんが、 [...]

  4. [...] httpd(Apache)が立ち上がらない時のまとめ » # watch -d tail /var/log/ngsw.log にある “親プロセスは死んでるけど子プロセスが生きている” っていう状態だったようです。 [...]

 Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">

   
© 2012 # watch -d tail /var/log/ngsw.log Suffusion theme by Sayontan Sinha