将HHVM安装到Apache中

在安装HHVM到Apache2.2(Ubuntu 12.04)和Apache2.4(Ubuntu 14.04)时的备忘录。

安装HHVM

执行以下操作,将HHVM存储库添加到apt。

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 中,但有时会记录大量错误,因此最好设置一个单独的日志轮转配置。

在Ubuntu 12.04上进行Apache的配置

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

在Ubuntu 14.04上配置Apache。

在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。

(Note: The provided translation is in simplified Chinese script. If you prefer the traditional Chinese script, please let me know.)

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。

这次会议辛苦了。