Pacemaker 資料一覧

Apacheのリソースが起動後すぐに停止してしまう

2015/10/07更新

対応バージョン: Pacemaker 1.0.13, Heartbeat 3.0.5

以下のようなApacheのリソース定義がある(VIP定義とのグルーピング)。

# crm configure show
:
primitive httpd ocf:heartbeat:apache \
        params configfile="/etc/httpd/conf/httpd.conf" statusurl="http://192.168.1.101/" \
        op start interval="0" timeout="90" on-fail="restart" \
        op monitor interval="10" timeout="60" on-fail="restart" \
        op stop interval="0" timeout="300" on-fail="block"
primitive vip_httpd ocf:heartbeat:IPaddr2 \
        params ip="192.168.1.101" nic="eth1" cidr_netmask="24" \
        op monitor interval="10"
group web vip_httpd httpd \
        meta target-role="Started"
:

Apacheのサービスをserviceコマンドで普通に起動した場合はうまく動作するが、Pacemakerのリソースとして起動した場合は一瞬起動してすぐに停止してしまう。

正常
# service httpd start
Starting httpd: [  OK  ]

# tail /var/log/httpd/error_log
:
[notice] Apache/2.2.15 (Unix) DAV/2 configured -- resuming normal operations
起動後すぐに停止
# crm resource start web

# crm_mon -f
:
Online: [ s1 s2 ]

 Resource Group: web
     vip_httpd  (ocf::heartbeat:IPaddr2):  Started s1
     httpd      (ocf::heartbeat:apache):   Stopped

Migration summary:
* Node s1: 
   httpd: migration-threshold=1000000 fail-count=1000000
* Node s2: 

Failed actions:
    httpd_start_0 (node=s1, call=281, rc=1, status=complete): unknown error

# tail /var/log/httpd/error_log
:
[notice] Apache/2.2.15 (Unix) DAV/2 configured -- resuming normal operations
[error] [client 127.0.0.1] Directory index forbidden by Options directive: /var/www/html/
[notice] caught SIGWINCH, shutting down gracefully

これはPacemakerのApache Resource Agent(/usr/lib/ocf/resource.d/heartbeat/apache)がApacheの動作をモニタする際に以下の動きをするからである。

1.apache_monitor_basic()においてリソース定義のstatusurl=に指定したURLにアクセスし(358行目)、HTMLファイルが取得できないと次の処理に移り、363行目で呼び出したattempt_index_monitor_request()関数内において$OCF_RESKEY_statusurlに上記URLが設定されている(340行目)ために1を返し、結果的に371行目でエラー($OCF_ERR_GENERIC)を返す。

328 attempt_index_monitor_request() {
:
340     if [ -n "$OCF_RESKEY_statusurl" ]; then
341         return 1;
342     fi
:
357 apache_monitor_basic() {
358     if ${ourhttpclient}_func "$STATUSURL" | grep -Ei "$TESTREGEX" > /dev/null
359     then
360         return $OCF_SUCCESS
361     fi
362 
363     attempt_index_monitor_request
364     if [ $? -eq 0 ]; then
365         return $OCF_SUCCESS
366     fi
367 
368     if ! ocf_is_probe; then
369         ocf_log err "Failed to access httpd status page."
370     fi
371     return $OCF_ERR_GENERIC
372 }

2.エラーを受け取った上位の関数はapache_stop()を呼び出しApacheを停止する。

191     while : # wait until the user set timeout
192     do
193         apache_monitor
194         ec=$?
195         if [ $ec -eq $OCF_NOT_RUNNING ]
196         then
197             tries=`expr $tries + 1`
198             ocf_log info "waiting for apache $CONFIGFILE to come up"
199             sleep 1
200         else
201             break
202         fi
203     done
204 
205     if [ $ec -ne 0 ] && silent_status; then
206         apache_stop
207     fi

これを回避するにはドキュメントルート(httpd.confのDocumentRootで指定したディレクトリ、/var/www/html等)にダミーのindex.htmlを置いておけばよい。

ダミーなので以下のような内容で構わない。

<html>
</html>

この対処を行えばリソースは正常に起動する。

# crm resource cleanup httpd s1

# crm_mon -f
:
Online: [ s1 s2 ]

 Resource Group: web
     vip_httpd  (ocf::heartbeat:IPaddr2):  Started s1
     httpd      (ocf::heartbeat:apache):   Started s1
:

関連資料・記事