こんにちは、サーバー担当の山内です。
HHVMにMessagePack Extensionを導入したのでご紹介します。
1. 環境
AWSのc3.large(Xeon E5-2680 v2 @ 2.80GHz,メモリ3.75GB)でビルドしました。このクラスのマシンであればビルドに要する時間はおよそ90分です。ストレージは16GBあれば大丈夫です。
シングルコアだとビルド途中でハングアップすることがありましたので、デュアルコア以上のマシンでのビルドをおすすめします。また、HHVMは32bit OSでの実行をサポートしていないので64bit OSを選択します。今回はUbuntu 14.04LTSを使用しました。
2. 準備
# apt-get install \ autoconf automake binutils-dev build-essential cmake g++ git \ libboost-dev libboost-filesystem-dev libboost-program-options-dev \ libboost-regex-dev libboost-system-dev libboost-thread-dev libbz2-dev \ libc-client-dev libldap2-dev libc-client2007e-dev libcap-dev \ libcurl4-openssl-dev libdwarf-dev libelf-dev \ libexpat-dev libgd2-xpm-dev libgoogle-glog-dev \ libgoogle-perftools-dev libicu-dev \ libjemalloc-dev libmcrypt-dev libmemcached-dev \ libmysqlclient-dev libncurses-dev \ libonig-dev libpcre3-dev libreadline-dev libtbb-dev libtool \ libxml2-dev zlib1g-dev libevent-dev libmagickwand-dev \ libinotifytools0-dev libiconv-hook-dev libedit-dev \ libiberty-dev libxslt1-dev ocaml-native-compilers \ php5-imagick # apt-get update && apt-get upgrade # git clone git://github.com/facebook/hhvm.git && \ cd hhvm && \ git submodule update --init --recursive && \ cd ..
3. HHVMのビルド
make -jオプションで並列コンパイルするとビルド時間の短縮が見込めます。c3.largeの物理コア数は1と認識※されていたので並列実行数は2としました。論理コア数が2なので3としても良さそうですが大差はないかと思います。
$ cd hhvm && cmake . && make -j 2 && sudo make install && cd ..
4. MessagePack Extensionのビルド
MessagePack Extensionのビルドをします。
$ git clone https://github.com/reeze/msgpack-hhvm.git && \ cd msgpack-hhvm && \ hphpize && \ cmake . && \ make -j 2 && \ sudo make install && \ cd ..
5. nginxのインストール
# apt-get install nginx
/etc/nginx/sites-available/defaultを修正します。
server { index index.php index.html index.htm; # Make site accessible from http://localhost/ server_name localhost; include hhvm.conf;
hhvm.confを新規作成します。
$ vim /etc/nginx/hhvm.conf
location ~ \.(hh|php)$ {
fastcgi_keep_conn on;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
nginxを再起動します。
# service nginx restart
6. HHVMの設定
hhvmの設定ファイルを設置します。設置場所はどこでも構いません。
# mkdir /etc/hhvm # vim /etc/hhvm/php.ini
[date] date.timezone = Asia/Tokyo [php] error_reporting = E_ALL & ~E_NOTICE [hhvm] hhvm.log.level = Warning hhvm.log.always_log_unhandled_exceptions = true hhvm.log.runtime_error_reporting_level = 8191 hhvm.log.use_log_file = true hhvm.log.file = /var/log/hhvm/error.log hhvm.error_handling.notice_frequency = 1 hhvm.error_handling.warning_frequency = 1 hhvm.http.slow_query_threshold = 0 hhvm.mysql.typed_results = false
HHVMのログ出力先ディレクトリを作成します。
# mkdir /var/log/hhvm
7. MessagePack Extensionの読み込み
msgpack.soをコピーします。
# mkdir /etc/hhvm/extensions # cp /home/ubuntu/msgpack-hhvm/msgpack.so /etc/hhvm/extensions/.
Extensionを読み込むためのconfigファイルを作成します。
# vim /etc/hhvm/config.hdf
DynamicExtensions {
msgpack = /etc/hhvm/extensions/msgpack.so
}
HHVMをデーモンモードで起動します。
# hhvm --config /etc/hhvm/config.hdf --config /etc/hhvm/php.ini \ --mode daemon -vServer.Type=fastcgi -vServer.Port=9000
MessagePack Extensionが有効になっているか確認します。
# vim /usr/share/nginx/html/index.php
<?hh var_dump(extension_loaded("msgpack")); var_dump(function_exists("msgpack_pack")); var_dump(function_exists("msgpack_unpack")); var_dump(function_exists("msgpack_serialize")); var_dump(function_exists("msgpack_unserialize"));
ブラウザからアクセスして
bool(true) bool(true) bool(true) bool(true) bool(true)
と表示されれば正常です。msgpack_serialize()はmsgpack_pack()のエイリアスになっています。
8. おわりに
HHVMは日々アップデートされているので今回ご紹介した方法でうまくいかなくなる可能性がありますが、これからHHVMをビルドされる方の参考になれば幸いです。