Facebookが開発しているHHVMは既に大分有名になっているかと思いますがCentOS上でサービスとしてデーモン化することについて扱っている日本語記事が少ないようです。
インストールするところまで、単体でデーモンモードでコマンドラインから起動する方法は紹介されてましたがパッと見service(init.d)を使って起動しているものが見つかりません…Debian系だとか英語記事だとかだと結構あるみたいだけど…
とりあえず今回はHHVMのインストールからFastCGIでNginx鯖のバックエンドとして利用するまでの手順を書きます。(記憶を手さぐりに後からまとめているので抜けがあるかもしれません。もしあればコメント等から報告ください。)
yumでHHVMをインストール
これは多くの記事で紹介されてますね。
1 2 3 4 |
$ cd /etc/yum.repos.d $ sudo wget http://www.hop5.in/yum/el6/hop5.repo $ sudo yum clean all $ sudo yum install hhvm |
ちなみに私はImageMagick-lastを入れていたので競合してコケました。その他依存関係が色々アップデートされるかと思います。
参考:インストールログ
ServiceでHHVMを起動出来るように設定する
yumでインストールしたHHVMはデフォルトで/etc/init.d/hhvmがついてきていますが、このスクリプトは正常に動作せず、FastCGI用にはなっていないため設定ファイルを書き換えます。
今回はUnixドメインソケット/var/run/hhvm/hhvm.sock
でListenするようにしています。事前に/var/run/hhvm/
をnginx:nginxで作っておいてください。
まず/etc/init.d/hhvm
を修正。編集例は次の通り
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
#!/bin/bash # # /etc/rc.d/init.d/hhvm # # Starts the hhvm daemon # # chkconfig: 345 26 74 # description: HHVM (aka the HipHop Virtual Machine) is an open-source virtual machine designed for executing programs written in Hack and PHP # processname: hhvm ### BEGIN INIT INFO # Provides: hhvm # Required-Start: $local_fs # Required-Stop: $local_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: start and stop hhvm # Description: HHVM (aka the HipHop Virtual Machine) is an open-source virtual machine designed for executing programs written in Hack and PHP ### END INIT INFO # Source function library. . /etc/init.d/functions start() { echo -n "Starting hhvm: " /usr/bin/hhvm --config /etc/hhvm/server.hdf --user nginx --mode daemon touch /var/lock/subsys/hhvm } stop() { echo -n "Shutting down hhvm: " killproc -p /var/run/hhvm/hhvm.pid hhvm rm -f /var/lock/subsys/hhvm } case "$1" in start) start ;; stop) stop ;; status) status -p /var/run/hhvm/hhvm.pid hhvm ;; restart) stop start ;; reload|condrestart|probe) echo "$1 - Not supported." ;; *) echo "Usage: hhvm {start|stop|status|reload|restart[|probe]" exit 1 ;; esac exit $? |
変更した行をハイライトしました。
次に/etc/hhvm/server.hdf
をfastcgi用に修正します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
PidFile = /var/run/hhvm/hhvm.pid Server { # TCPポートでListenする場合はFileSocketの代わりにPortで任意のポートを。 # Port = 9000 Type = fastcgi FileSocket = /var/run/hhvm/hhvm.sock User = nginx } Log { Level = Warning AlwaysLogUnhandledExceptions = true RuntimeErrorReportingLevel = 8191 UseLogFile = true UseSyslog = false File = /var/log/hhvm/error.log Access { * { File = /var/log/hhvm/access.log Format = %h %l %u % t \"%r\" %>s %b } } } Repo { Central { # Path = /var/log/hhvm/.hhvm.hhbc Path = /var/tmp/hhvm.hhbc } } #include "/usr/share/hhvm/hdf/static.mime-types.hdf" StaticFile { FilesMatch { * { pattern = .*\.(dll|exe) headers { * = Content-Disposition: attachment } } } Extensions : StaticMimeTypes } MySQL { TypedResults = false } |
各設定についてはhttps://github.com/facebook/hhvm/wiki/INI-Settingsを参照。
また、合わせて/etc/hhvm/php.ini
も設定。php-fpmで使っている設定を参考にすればいいはず。最低限
1 2 |
[Date] date.timezone = "Asia/Tokyo" |
があればいいという話も。
Nginxのリバースプロクシを設定する
/etc/nginx/nginx.conf
のphp-fpmとかのupstreamを定義してる辺りに同様に書き足す。
1 2 3 |
upstream hhvm { server unix:/var/run/hhvm/hhvm.sock; } |
あとは変更する各バーチャルホストのfastcgi_passをfastcgi_pass hhvm;
にする。
※参考:Amimotoの場合バーチャルホスト毎に1か所とwp-singlesiteに1か所ある。php-fpmのWPと共存させる場合後者は複製して該当部分を変えたものを作ればいい。
アクセスしてみる
ここまでの設定がすんだら
1 2 |
$ sudo service hhvm start $ sudo service nginx restart |
で設定の反映、起動をする。エラーとかが出ててHHVMが起動出来ていないこともあるかと思うのでsudo service hhvm status
して起動していないようなら/var/log/hhvm/error.log
辺りをチェック。
設定したバーチャルホストに実際にアクセスしてみて問題なくきどうしているようならばサービスの自動起動を設定しておく。
1 |
$ sudo chkconfig hhvm on |
問題点とか…
実際にこの手順を試したところ起動は出来るようになってPHPより早くはなったと思うんだけどMySQL辺りで文字化けが発生した。どうやら設定のMySQLの文字コードがちゃんと反映されてないっぽいけど実際にどのエンコードが使われてるかとかは未検証。後から追加するデータは問題無く表示できるように見えるがもちろんphpMyAdminとかで見てみると文字化けしていることが確認できる。
後日確認したところCentOS向けのbuildに何らかの問題があってutf8mb4との相性が悪い模様。Ubuntu,debian向け公式buildでは同問題は発生しないようです。
なお現在WordPressは対応環境ではutf8mb4を使う方向で開発されているようなので注意が必要かもしれません。utf8mb4非対応の古いバージョンのMySQLドライバでビルドされているためです。WordPress4.2ではこのような環境ではutf8mb3を使い続けるため使用に問題は無くなりました。他で配布されているHHVMについては未検証です。
「CentOS6.6でHHVMのFastCGIを使う (with Nginx)」への2件のフィードバック