hhvm プロセスはあるけど http(s) 応答がないときの monit スクリプト
検証環境
- Conoha で配っている kusanagi ディストリビューション(CentOS7)を使用
- hhvm + apache + monit は同一サーバーに配置
-
/var/log/monit.logなど kusanagi ディストリビューションの設定です - もうすでに WordPress などが稼働しているものとします
- kusanagi 自身のインストール方法には触れません
起きている問題と解決する monit 設定ファイル
PHP 実行環境 hhvm で WordPress を 3 つ動かしたあたりからやたら hhvm が落ちだします。そういうのは想定済みたいで、kusanagi 標準添付の monit の hhvm.conf では hhvm の無応答またはプロセスが落ちたことを検出して再起動をかけくれます。しかし、時々次のような現象が起きます:
- hhvm プロセスは残ったままで
- hhvm のポート(9000/tcp)も開いたまま
- でも apache 経由でアクセスすると一切応答がない
- この状態で
service hhvm stopするとやたら時間がかる - 一番ひどいときは 180 秒くらい
- hhvm を再起動すると復活するつまり apache の問題ではない
以上、hhvm プロセスが残ったまま http(s) の応答がないケースにも対応させるために以下 hhvm.conf の置き換えで アプリケーション層 にて再起動を判断し、また、service hhvm stop にやたら時間がかかる現象にも対応します:
check host heartbeathhvm with address heartbeat.selfnavi.com
start program = "/bin/systemctl start hhvm.service"
stop program = "/bin/systemctl stop hhvm.service" with timeout 360 seconds
depends on httpd
if failed
port 80
protocol http
and request /
with content = "It works!"
with timeout 3 seconds
then restart
if 3 restarts within 3 cycles then unmonitor
group hhvm
heartbeat.selfnavi.com は生死判定をするサイトで、同一サーバー内に設置してください。各自設置時はこの名前からは変更しなければなりませんが、この記事では heartbeat.selfnavi.com とします。 wget で It works! が出力されることを確認しときます。
<?php
echo "It works!";
$ wget -qO - http://heartbeat.selfnavi.com
It works
以上でわかればここで終わり。もう少し詳しい説明が必要なら読み進めてください:
- 生死判定をするサイトの設置
- monit の設定
-
/etc/monit.d/hhvm.confについての検証
生死判定をするサイトの設置
- kusanagi コマンドで apache の設定まで終わらせます
-
Webサイトで使用するホスト名(FQDN) はなんでも構わないのでご自身のものとしてください
-
上記 FQDN は kusanagi により
/etc/hostsに追記され、 127.0.0.1 を指すようになります -
データベースを作らないと先に進んでくれませんので後でけします
kusanagi provision --lamp heartbeat
ターゲットディレクトリは /home/kusanagi/heartbeat に変更されました。
↵
Webサイトで使用するホスト名(FQDN)を入力してください。 例) kusanagi.tokyo
heartbeat.selfnavi.com
Webサイトで使用するホスト名(FQDN)をもう一度入力してください。
heartbeat.selfnavi.com
↵
Let's Encryptを使用される場合、Let's Encrypt の使用規約に同意される必要があります。
使用規約に同意される場合、あなたのメールアドレスを入力してください。同意されない場合、Enterキーを二回押してください。
使用規約は次のURLより確認できます: https://letsencrypt.org/repository/
[Enter]
メールアドレスを再入力してください。
[Enter]
データベース名を入力してください。
heartbeat
データベース名を再度入力してください。
heartbeat
heartbeat のユーザー名を入力してください。
heartbeat
heartbeat のユーザー名を再度入力してください。
heartbeat
データベースユーザ'heartbeat'のパスワードを入力してください。[a-zA-Z0-9.!#%+_-]の文字列が使用できます。最小は8文字以上です。
heartbeat
再度 'heartbeat' のパスワードを入力してください。
heartbeat
Job for nginx.service invalid.
heartbeat のプロビジョニングは完了しました。heartbeat.selfnavi.com にアクセスし、lampをインストールしてください!
完了しました。
2. kusanagi コマンドで作ってしまったデータベースを消します
* `your_mysql_root_password` は、ご自身の mysql root パスワードに置き換えてください
```shell-session
$ mysql -uroot -pyour_mysql_root_password
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 1847575
Server version: 10.0.29-MariaDB-wsrep MariaDB Server, wsrep_25.16.rc3fc46e
↵
Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.
↵
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
↵
MariaDB [(none)]> drop user 'heatbeat'@'localhost';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> drop database heatbeat;
Query OK, 0 rows affected (0.48 sec)
MariaDB [(none)]> exit
-
生きていると応答をする php スクリプトの配置
/home/kusanagi/heartbeat/DocumentRoot/index.php