EC2 上の CentOS 6.6 で Nginx + HHVM を使う


はじめに

Facebook が開発した PHP の超高速実行環境 HHVM (HipHop Virtual Machine)
どんなものか確かめてみるべく Nginx + HHVM を使ってみました

yum でサクッと入れるだけだと思っていたら、2016/1 時点で配布されているビルド済みパッケージは Ubuntu、Debian、Mint しかサポートされていないんです

HHVMの公式サポート対象

CentOS 上にインストールしたかったのですがなかなか情報が見つからず
ソースからビルドするのはハードルも高いしメンテナンスを考えると躊躇してしまうので、非公式らしいですか yum でインストールする方法を調べました

環境をつくるまでの道のりが意外と長かったので、
CentOS 6.6 上に Nginx + HHVM で PHP を動かす環境を作るときのメモです
※仮想マシンは EC2 を利用しています

ググると Hop5 のリポジトリからインストールしている記事が多いですが、HHVM のバージョンが古いのと HACK が動かないらしいです
あと起動スクリプトも中途半端な状態なので微妙でした

今回の方法では gleeze リポジトリを利用するので、最新のHHVM3.5を入れることがきでます

Nginx インストール

nginx のインストールは超簡単です
CentOS の公式リポジトリにある nginx はめっちゃ古いバージョンなので、nginx の公式リポジトリから最新版をインストールします

$ sudo rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm

$ sudo yum install nginx

HHVM インストール

Github で公開されている CentOS へのインストール手順では、ソースからビルドするか コミュニティの方が用意した非公式リポジトリからインストールするよう書かれています
公式のインストール手順

ですが、この通りにやっても依存関係のエラーが出てインストールできません・・・

なので、以下のようにして epel、remi、gleeze のリポジトリからそれぞれ必要なパッケージをインストールします
HHVM は gleeze リポジトリで配布されているんですがこれが出処不明のサーバーです
--nogpgcheck をつけないといけないところがヤバイ

# epel リポジトリの追加とパッケージのインストール
$ sudo rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo yum install libmcrypt-devel glog-devel jemalloc-devel tbb-devel libdwarf-devel mysql-devel libxml2-devel libicu-devel pcre-devel gd-devel boost-devel sqlite-devel pam-devel bzip2-devel oniguruma-devel openldap-devel readline-devel libc-client-devel libcap-devel libevent-devel libcurl-devel libmemcached-devel

# remi リポジトリの追加とパッケージのインストール
$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
$ sudo yum --enablerepo=remi install libwebp mysql mysql-devel mysql-lib

# gleez リポジトリの追加と HHVM のインストール
$ sudo rpm -Uvh http://yum.gleez.com/6/x86_64/gleez-repo-6-0.el6.noarch.rpm
$ sudo yum install --nogpgcheck hhvm

インストールが完了したら設定を修正してそれぞれのサーバーを起動します

Nginx セットアップ

php にアクセスがあった時に FastCGI で HHVM と通信する設定を入れます

/etc/nginx/conf.d/default.conf
location ~ \.php$ {
    root          /usr/share/nginx/html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
}
$ /etc/init.d/nginx start

HHVM セットアップ

ドキュメントルートと実行ユーザーを設定します

/etc/hhvm/server.ini
; ドキュメントルート
hhvm.server.source_root = /usr/share/nginx/html/
; 実行ユーザー
hhvm.server.user = nginx
; error.log の各行に日時を出力する
hhvm.log.header = true
$ /etc/init.d/hhvm start

まとめ

php-fpm + OPcache と比較した時に軽い処理だと php-fpm の方が速い場合もありました
HHVM は1プロセスでマルチスレッドで動作してますが、php-fpm はマルチプロセスなので、CPU 使用率は HHVM の方が低かったです

DB アクセスして JSON を返すだけの API だとむしろ php-fpm のがちょっと速いくらいでほとんど差はみられませんでした

jmeter で負荷を掛けて確認したところ、どちらを利用した場合でも負荷が1つのコアに偏っていて、マルチコアのサーバーでも CPU が遊んでる状態になっていました
HHVM、php-fpm に原因がありそうですがそこはわかってないです