Apacheのupstart-supervised initスクリプト?


16

Ubuntu 10.04でapacheを実行し、upstartで素敵な監視機能を使用したい(apache initスクリプトだけでなく、daemontoolsのような適切なサービス監視-つまり、Apacheが死んだときに再起動する、など)そのような)。

誰もubuntu 10.04でApacheを監視するための実行中の起動設定を持っていますか?

Googleは私にとって何の助けにもなりませんでしたが、私のgoogle-fuが弱い可能性があります。


2
私もこれについて知りたいです。私は多くのもの(主にDjangoプロセス)をホストしていますが、もう少し堅牢なもののために、壊れやすいinitスクリプトをダンプしたいと思います。成り上がりとは見なされませんが、それが動作するかどうか...していた
オリ

1
私が言うべきことは、私の通常の監視方法はdaemontoolsを使用することです。グーグルでわかる限り、新しい新興企業のubuntuの世界では、誰も新興企業のサービス監視を使用していないことに少し驚いています。私はそれが解決された問題になると期待していました。
ベンウィリアムズ

回答:


10

わーい!

confファイルをハッキングし、を使用して、ほぼ機能する独自のバージョンを作成しました-D NO_DETACH

最初にUserGroupから入力PidFileするの/etc/apache2/apache2.confではなく、手動で設定する必要がありました/etc/apache2/envvars。私はそれらを取得する方法を考え出すことができなかったことは正しくエクスポートされるようにvarsは(私は両方を試していないenvし、exportあたりなどhttp://manpages.ubuntu.com/manpages/lucid/man5/init.5.html、ない良いです)。

root@lucid:/etc/apache2# diff -u apache2.conf.orig apache2.conf
--- apache2.conf.orig   2010-09-20 13:46:33.857868534 +0930
+++ apache2.conf        2010-09-20 13:47:22.377842204 +0930
@@ -63,7 +63,7 @@
 # identification number when it starts.
 # This needs to be set in /etc/apache2/envvars
 #
-PidFile ${APACHE_PID_FILE}
+PidFile /var/run/apache2.pid

 #
 # Timeout: The number of seconds before receives and sends time out.
@@ -142,8 +142,8 @@
 </IfModule>

 # These need to be set in /etc/apache2/envvars
-User ${APACHE_RUN_USER}
-Group ${APACHE_RUN_GROUP}
+User www-data
+Group www-data

 #
 # AccessFileName: The name of the file to look for in each directory

次に、これは私の仕事/etc/init/apache2.confです:

# apache2 - http server
#
# Apache is a web server that responds to HTTP and HTTPS requests.
# Required-Start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog

description "apache2 http server"

start on runlevel [2345]
stop on runlevel [!2345]

pre-start script
    mkdir -p /var/run/apache2 || true
    install -d -o www-data /var/lock/apache2 || true
    # ssl_scache shouldn't be here if we're just starting up.
    # (this is bad if there are several apache2 instances running)
    rm -f /var/run/apache2/*ssl_scache* || true
end script

# Give up if restart occurs 10 times in 30 seconds.
respawn limit 10 30

exec /usr/sbin/apache2 -D NO_DETACH
respawn

start|stop|status|reload apache2有意義な結果を得ることができます。私kill -9がマスターApacheプロセスである場合、それはほとんどすぐに再生成され、予想どおり起動時に起動および停止します。だから、それはかなりうまく機能していると思う。


私が仕事をすることができなかった私が試みたものがありました。

  • -D NO_DETACH組み合わせて、削除しようとしました:
フォークを期待する
デーモンを期待する

サービスを開始できませんでした。

  • 同様の方法を使用し/etc/apache2/envvars${APACHE_*}変数を設定しようとしました:
APACHE_RUN_USER = www-dataをエクスポート
エクスポートAPACHE_RUN_GROUP = www-data
export APACHE_PID_FILE = / var / run / apache2.pid

それは開始に失敗し、についてのエラーを生成しましたapache2: bad user name ${APACHE_RUN_USER}

  • コンソール出力とコンソールのデフォルトオプションを試しました。この時点で、私は本当に意味のあるエラーメッセージを取得しようとしていることをほのめかしていました。違いはないようです。

    console output

  • これは、Apacheメッセージのデバッグに役立ちました。

    exec /usr/sbin/apache2 -X -e debug -E /var/log/apache2/foo.log

  • これは、変更しない別の試みで/etc/apache2/apache2.conf、失敗しました:

    exec APACHE_RUN_USER=www-data APACHE_RUN_GROUP=www-data APACHE_PID_FILE=/var/run/apache2.pid /usr/sbin/apache2 -D NO_DETACH -e debug -E /var/log/apache2/foo.log


注意が必要なのは、ネットワークインターフェースが設定される前に「ランレベル[2345]で開始」が開始される可能性があるためです。同様に、ローカルファイルシステムがない場合もあります。代わりに使用されている1つの標準は、start on(local-filesystems and net-device-up IFACE!= lo)です。
SpamapS

面白い!問題のマシンはしばらくの間リブートされていないので、テストしてみたいと思います。ヒントをありがとう。
ベンウィリアムズ

1
こんにちは、素晴らしい質問です、さらに良い答え:) envvarsは次のように動作します:script。の/ etc / apache2の/ envvarsの幹部は/ usr / sbinに/ apache2の-D NO_DETACH終了スクリプト
マーティン・カーペンター

5

まあ、このスクリプトは私のために働いた:

# apache2 - http server
#
# Apache is a web server that responds to HTTP and HTTPS requests.
# Required-Start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog

description "apache2 http server"

start on runlevel [2345]
stop on runlevel [!2345]

pre-start script
    mkdir -p /var/run/apache2 || true
    install -d -o www-data /var/lock/apache2 || true
    # ssl_scache shouldn't be here if we're just starting up.
    # (this is bad if there are several apache2 instances running)
    rm -f /var/run/apache2/*ssl_scache* || true
end script

limit cpu 300 300
env APACHE_RUN_USER=www-data
env APACHE_RUN_GROUP=www-data
env APACHE_PID_FILE=/var/run/apache2.pid

# Give up if restart occurs 10 times in 30 seconds.
respawn limit 10 30

exec /usr/sbin/apache2 -D NO_DETACH
respawn

3

私もこの問題に遭遇しましたが、別のアプローチを使用しました。env変数を取得する最も簡単な方法は、sourceコマンドを使用して、それをapache envvarsファイルにポイントすることです。その後、-D FOREGROUNDオプションを使用してapacheを実行できます。

したがって、基本的には次のようなスクリプトが必要です(私の場合は/etc/apache2/apache2_foreground.shにあります):

#!/bin/bash

read pid cmd state ppid pgrp session tty_nr tpgid rest < /proc/self/stat
trap "kill -TERM -$pgrp; exit" EXIT TERM KILL SIGKILL SIGTERM SIGQUIT


source /etc/httpd/envvars
apache2 -D FOREGROUND

次に、それを実行可能にし、スーパーバイザーをその場所に向けます。また、stopsignal 6を使用する必要があります。

command=/etc/apache2/apache2_foreground.sh
stopsignal=6

スクリプトの最初の2行は、スクリプトのプロセスグループIDをキャッチし、プロセスに渡されるシグナルで実行されるトラップを設定します。このトラップは、すべてのapache2プロセスを実行する親の負のプロセスIDでkillを実行します(スクリプトそれ自体)-負のPIDで殺すことは、そのようなプロセスのすべての子も殺すことを意味します(したがって、この場合、すべてのapache2プロセス)、それなしでは、スーパーバイザーにapache2プロセスを殺すことができませんでした

トラップを呼び出すことができる他の信号を見つけることができず、9はキャッチできず、2と3は何もしない(スクリプトは強制終了されない)ので、stopsignal 6が使用されます

その後は、apache2の構成をまったく変更せずに、スムーズに動作するはずです。


2

スコットジェームスレムナントからのトピックに関するいくつかの投稿を参考にしてください。


OK、だから彼らはデーモンを監視する新興企業の歴史のいくつかと、いくつかの厄介な詳細に入ります。まだ、新興企業が管理するApacheのスクリプトではありません。また、新興企業のドキュメントに詳細があります。これに対する最終的な答えは「自分で書いてください」と思われます。
ベンウィリアムズ

0

ああ、はい、通常、答えは「自分で書いてください」ですので、それに応じて私の典型的な提案は、入門-スタートアップページを参照し、入力します。

この問題について、私よりも知識のある人が、実用的なスタートアップスクリプトを思いつくことを願っています。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.