読者です 読者をやめる 読者になる 読者になる

WonderPlanet DEVELOPER BLOG

ワンダープラネットの開発者ブログです。モバイルゲーム開発情報を発信。

HHVM + nginxでMessagePackを使う

Hack HHVM

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

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