Help us understand the problem. What is going on with this article?

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

scouty
「あらゆる事象を必然化し、 世の中のミスマッチをなくす」ことをミッションとし、AIヘッドハンティングサービスを開発・運営するスタートアップ
https://lapras.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away