Amazon EC2(t1.micro)のPHP実行環境をHHVMにしてみた

Facebookが開発しているPHPを高速に実行するHHVMが気になっていたので、試しにこのブログを動かしているサーバにインストールさせてみました。

HHVM単体でサーバもたてれるようですが、今回はCentOS6 + Nginx + HHVM(Fastcgi)で動かしています。

HHVMをインストール

まずはHHVMをインストールします。RPMが配布されていますので、yumでサクッと(いきませんでした)。

$ wget http://www.hop5.in/yum/el6/hop5.repo
$ yum install hhvm
// libwarf が無いよって怒られる

$ yum install libdwarf --enablerepo=epel
$ yum install hhvm

$ hhvm
// liblcms2.so.2が無いよって怒られる

$ wget http://pkgrepo.linuxtech.net/el6/release/x86_64/liblcms2-2.4-1.el6.x86_64.rpm
$ yum install liblcms2-2.4-1.el6.x86_64.rpm

$ hhvm
// -> OK(メモリー不足エラーが出る)

t1.microでHHVMを動かす

デフォルトの設定ではt1.microインスタンスではメモリが足らず動きません。

探してみたところ、t1.microインスタンスで動かす 試行錯誤がなされた形跡がありましたので、その内容をconfig.hdfに追記します。

Eval {  
  Jit = true
  JitASize = 67108864
  JitAStubsSize = 67108864
  JitGlobalDataSize = 22554432
}

これでt1.microで動くようになりました。(php-fpmと同時実行は出来ませんでした)

Fastcgiモードで実行する場合は下記のようなコマンドを実行します。

// ポートを指定する場合
$ hhvm --mode daemon -vServer.Type=fastcgi -vServer.Port=9000
// socketを指定する場合(自環境の場合は上手く動きませんでした)
$ hhvm --mode daemon -vServer.Type=fastcgi -vServer.FileSocket=/var/run/hhvm/sock

今回はポートを指定して実行しています。

NginxのFastcgiをHHVMに変更する

最後にNginxのFastcgiをHHVMに変更します。
以前にメモっておいた設定ファイルの一部分だけ変更しました。

# ...

    upstream php-backend {
        # server unix:/path/to/php-fpm.socket; php-fpmの場合
        # server unix:/var/run/hhvm/sock; socket経由だと何故か動かず…
        server 127.0.0.1:9000;
    }

# ...

上手く動いたように見えましたが

HHVMも実行でき、Nginxも起動できましたが、ページは真っ白に…。エラーログを見てみると、

HipHop Fatal error: unexpected St13runtimeerror: locale::facet::Screatec_locale name not valid

と怒られてしまいました。

調べてみたところ、ロケールを指定しないと上手く動かないことがあるみたいです。

$ export LC_ALL=C
$ hhvm --mode daemon -vServer.Type=fastcgi -vServer.Port=9000

これで良さそうな感じです。

雑感

この記事を公開している時点では実際にHHVMで実行していますが、正常に見えていますでしょうか?

正直な所パフォーマンスは見ていないので、実際に良くなったのかは不明です。
試した人の記事を見ていると実際に利用するのはまだまだ、という声が多そうですね。

何気にインストールしないと行けないライブラリも多かったので、簡単に実装!というわけにはいきませんが、色々とチューニングをするよりは簡単に試せるので覚えておいても良さそうな気がします。
虚弱なサーバに無理矢理、という所もあるかと思いますが…

そういえばHerokuのPHPもHHVMみたいですね。そちらも気になります。

参考