Edited at

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

More than 3 years have passed since last update.


はじめに

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 に原因がありそうですがそこはわかってないです