エンジニア

HHVM + nginxでMessagePackを使う

投稿日:2014年7月4日 更新日:

こんにちは、サーバー担当の山内です。

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としても良さそうですが大差はないかと思います。

※ cat /proc/cpuinfo
$ 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をビルドされる方の参考になれば幸いです。

採用情報

ワンダープラネットでは、一緒に働く仲間を幅広い職種で募集しております。

-エンジニア
-,

© WonderPlanet Inc.