HHVMをApache2.2(Ubuntu 12.04)とApache2.4(Ubuntu 14.04)にセットップしたときのメモ。
HHVMのインストール
以下を実行して、aptにHHVMリポジトリを追加する。
lsb_release -r|grep 12.04 >/dev/null && sudo add-apt-repository ppa:mapnik/boost
curl -L http://dl.hhvm.com/conf/hhvm.gpg.key | sudo apt-key add -
echo deb http://dl.hhvm.com/ubuntu $(lsb_release -cs) main | sudo tee /etc/apt/sources.list.d/hhvm.list
あとは、apt-get でインストールできる。
sudo apt-get install hhvm
hhvm --version
HHVMは、デフォルトでポート9000でサービスとして起動するが、ポート9000は、他のサービスや実験とよくぶつかるので、ここでは、/etc/hhvm/server.ini を編集してポート9955 に変更する。
hhvm.server.port = 9955
また、デフォルトではタイムゾーンが設定されていないが、実際に使い始めると、エラーログを出すようになるので、/etc/hhvm/php.ini にタイムゾーンを設定する。
date.timezone = "Asia/Tokyo"
HHVMサービスを起動する。
sudo service hhvm start
また、実行ログが /var/log/hhvm/error.log に記録されるが、時に大量にエラーが記録されることがあるので、別途、ログをローテートする設定をしておいたほうがよい。
Apache の設定をする (Ubuntu 12.04)
Ubuntu 12.04 は Apache 2.2 なので、FastCGIの少々手間と設定の理解がいる。
HHVM は、サービスとして起動しているので、fastcgiで接続するが、そのときに特定のディレクトリに対して、fastcgiを設定する。
まずは、必要なモジュールのインストールと有効化する。
sudo apt-get intall libapache2-mod-fastcgi
sudo a2enmod fastcgi
sudo a2enmod alias
sudo a2enmod actions
すでに phpを使っているときは、ぶつかることがあるので、無効化する。
sudo a2dismod php5
HHVMの設定は、/etc/apache2/mods-available/hhvm_proxy_fcgi.conf に行われているが、デフォルトは、proxy_fcgi のない Apache 2.2では動作しないので、デフォルトの内容を削除して、以下のようにする。
<IfModule mod_fastcgi.c>
<FilesMatch \.php$>
SetHandler hhvm-php-extension
</FilesMatch>
<FilesMatch \.hh$>
SetHandler hhvm-hack-extesion
</FilesMatch>
Alias /hhvm /var/www/hhvm
Action hhvm-php-extension /hhvm virtual
Action hhvm-hack-extension /hhvm virtual
FastCgiExternalServer /var/www/hhvm -host 127.0.0.1:9955 -pass-header Authorization -idle-timeout 300
</IfModule>
一見すると、ブラウザで /hhvm にアクセスする必要がありそうだが、/var/www/hhvm に配置したスクリプトが、URLのルートからのアクセスで実行される( /hhvm からもアクセスできる)。
また、このモジュールを有効化しておく。
sudo ln -s /etc/apache2/mods-available/hhvm_proxy_fcgi.conf /etc/apache2/mods-enabled
Apacheを再起動する。
sudo service apache2 restart
Apache の設定をする (Ubuntu 14.04)
Ubuntu 14.04 の Apache は、Apache2.4なので設定は、非常に簡単で、proxy_fcgi モジュールをインストールして、hhvm_proxy_fcgi.confのパスとポートを見直して有効化するだけである。
sudo a2enmod proxy_fcgi
sudo ln -s /etc/apache2/mods-available/hhvm_proxy_fcgi.conf /etc/apache2/mods-enabled
ProxyPassMatch /(.+\.(hh|php)(/.*)?)$ fcgi://127.0.0.1:9955/var/www/html/$1
Apacheを再起動する。
sudo service apache2 restart
サンプルスクリプトの配置と実行確認
ここで、ディレクトリ /var/www/hhvm を作成し、そこにスクリプトを配置する。
拡張子は、.hh を使っているが .php も実行されるので、PHPのスクリプトをそのまま、配置してもよい。
sudo mkdir /var/www/hhvm
sudo chown www-data:www-data /var/www/hhvm
sudo -u www-data sh -c "ruby -e 'puts %Q{<?hh\necho "Hello Hack!";}' > /var/www/hhvm/hello.hh"
HHVMは、スクリプト実行時に hh_client で文法チェックをするようだが、このとき、.hh_config というファイルがないと文法チェックに失敗するので、作成しておく。
sudo -u www-data touch /var/www/hhvm/.hh_config
アクセスして、動作を確認する。
curl -v http://localhost/hello.hh
結果がおかしい場合、実行時のログ /var/apache2/error.log や /var/log/hhvm/error.log を確認する。
以上、お疲れさまでした。