介绍
HHVM是一个开源的虚拟机,用于执行 PHP 和 Hack代码。
HHVM 与其他 PHP 引擎不同,因为其 Just-in-Time (JIT) 编译方法。HHVM 将 PHP 代码编译成中间字节代码,然后直接进入 x64 机器指令。
HHVM是强大的和快速的,但它也是资源的要求,就像任何其他虚拟机(如JVM)一样。因此,HHVM需要更多的RAM和CPU,与其他更轻量级的PHP解释器(如PHP-FPM)相比。
在本文中,我们将向您展示如何安装 HHVM 并与 Nginx 集成。
前提条件
此指南已在 Ubuntu 14.04 上测试,描述的安装和配置在其他 OS 或 OS 版本上类似,但配置文件的命令和位置可能有所不同。
对于这个教程,你将需要:
- Ubuntu 14.04 Droplet 具有至少 1 GB 的 RAM
- 非 root sudo 用户(见 初始服务器设置与 Ubuntu 14.04)
- Nginx 已安装(以下是文章中的第一步 如何在 Ubuntu 14.04 上安装 Linux, Nginx, MySQL, PHP (LEMP) 堆栈)
本教程中的所有命令都应该作为非根用户运行,如果命令需要 root 访问,则将被sudo
提前。
安装
对于Ubuntu 14.04,有一个官方支持的HHVM存储库. 要添加这个存储库,你必须导入它的GnuPG公共密钥,并使用命令:
1sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0x5a16e7281be7a449
此后,您可以使用命令安全地安装HHVM的存储库:
1sudo add-apt-repository "deb http://dl.hhvm.com/ubuntu $(lsb_release -sc) main"
一旦你添加了存储库,你必须使apt,Ubuntu的软件经理,意识到有新的包可以与它一起安装。
1sudo apt-get update
最后,您可以使用以下命令安装 HHVM:
1sudo apt-get install hhvm
上面的命令会安装 HHVM 并首次启动它. 若要确保 HHVM 通过 Droplet 自动启动和停止,请用命令将 HHVM 添加到默认运行级别:
1sudo update-rc.d hhvm defaults
配置
HHVM 配备了一个脚本,使与 Nginx 集成非常容易. 只要你有一个默认的 Nginx 安装,你可以运行脚本,而没有任何这样的论点:
1sudo /usr/share/hhvm/install_fastcgi.sh
运行时,此脚本会将配置文件 /etc/nginx/hhvm.conf
添加到默认的 Nginx 服务器块配置 /etc/nginx/sites-enabled/default
. 它只适用于默认的 Nginx 配置而无需任何 FastCGI 配置。
如果您已经用自定义FastCGI配置更改了默认服务器块,例如PHP-FPM配置,那么您将不得不手动更换以前的FastCGI配置:
1[label /etc/nginx/sites-enabled/default]
2location ~ \.(hh|php)$ {
3 fastcgi_keep_conn on;
4 fastcgi_pass 127.0.0.1:9000;
5 fastcgi_index index.php;
6 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
7 include fastcgi_params;
8}
上面的意思是 Nginx 应该使用 HHVM 来处理任何所请求的 .php 或
.hh (hack) 文件。
您还需要重新启动 Nginx 以启用更改:
1sudo service nginx restart
它还假定您没有更改默认的 HHVM 配置,使服务可在 127.0.0.1:9000
上访问。
1[label /etc/hhvm/server.ini]
2; php options
3
4pid = /var/run/hhvm/pid
5
6; hhvm specific
7
8hhvm.server.port = 9000
9hhvm.server.type = fastcgi
10hhvm.server.default_document = index.php
11hhvm.log.use_log_file = true
12hhvm.log.file = /var/log/hhvm/error.log
13hhvm.repo.central.path = /var/run/hhvm/hhvm.hhbc
在上述配置中,您可能会注意到变量 hhvm.server.port 决定 HHVM 会听 TCP 端口 9000。
HHVM 被考虑用于负载环境,所以您可以做的第一个配置更改是让 HHVM 倾听接口而不是 TCP 端口,因此, Nginx 和 HHVM 之间的通信需要更少的 CPU 和内存。
要将 HHVM 配置为在插槽上聆听,请在您最喜欢的编辑器中打开 /etc/hhvm/server.ini’ 文件,例如
vim`:
1sudo vim /etc/hhvm/server.ini
然后删除从hhvm.server.port
开始的行,并在其位置添加以下一行:
1[label /etc/hhvm/server.ini]
2hhvm.server.file_socket=/var/run/hhvm/hhvm.sock
保存配置文件,然后使用命令重新启动 HHVM:
1sudo service hhvm restart
接下来,你必须让 Nginx 知道这个变化,为此打开文件 /etc/nginx/hhvm.conf
进行编辑:
1sudo vim /etc/nginx/hhvm.conf
在此文件中,请确保fastcgi_pass
指向 HHVM 接口,并看起来像这样:
1fastcgi_pass unix:/var/run/hhvm/hhvm.sock;
您还需要重新启动 Nginx,以便此更改生效。
1sudo service nginx restart
脚本 /usr/share/hhvm/install_fastcgi.sh
可以节省一些时间,但有些事情你必须手动调整,尤其是在你的 Nginx 服务器块方面。 例如,默认服务器块配置只打开作为索引文件 index.html
和 index.htm
文件,而目录列表是禁止的。 这是你应该肯定地改变的一件事,并将 index.php
文件列入索引文件中。 要这样做,用你最喜欢的编辑器重新打开默认服务器块的配置文件:
1sudo vim /etc/nginx/sites-enabled/default
然后进入服务器
部分,并在索引行中添加index.php
,使其看起来像这样:
1[label /etc/nginx/sites-enabled/default]
2index index.html index.htm index.php;
重新启动 Nginx 以便此设置生效:
1sudo service nginx restart
测试和调整HHVM
您可以进行的第一个测试是使用PHP命令行界面(cli) /usr/bin/php
,该界面指向 /etc/alternatives/php
,在术语中指向HHVM二进制 /usr/bin/hhvm
。
1/usr/bin/php --version
当您运行上述命令时,您应该看到印刷的 HHVM 的版本和存储信息如下:
1HipHop VM 3.8.1 (rel)
2Compiler: tags/HHVM-3.8.1-0-g3006bc45691762b5409fc3a510a43093968e9660
3Repo schema: 253b3802ce1bcd19e378634342fc9c245ac76c33
如果你在HHVM之前安装了PHP,你仍然可以看到旧PHP的输出。
1sudo /usr/bin/update-alternatives --install /usr/bin/php php /usr/bin/hhvm 60
接下来,您可以使用众所周知的phpinfo()函数查看HHVM的设置和选项。 为此,您可以用您喜爱的编辑器创建一个名为info.php
的新文件,在默认文档根中使用/usr/share/nginx/html
。
1sudo vim /usr/share/nginx/html/info.php
新文件应包含:
1[label /usr/share/nginx/html/info.php]
2<?php
3phpinfo();
4?>
确保所有 Nginx 网页文件都是 Nginx 用户 www-data
的所有者,因此将该文件的所有权更改为 www-data
命令:
1sudo chown www-data: /usr/share/nginx/html/info.php
现在尝试在您的Droplet的IP上访问此文件. 将其放入您的浏览器的URL应该看起来像http://your_server_ip/info.php
。
您的浏览器中的结果应该是这样的:
如果你看不到类似的页面,那么首先要确保你遵循前提中的安装指示正确。第二,在 Nginx 的错误日志(/var/log/nginx/error.log
)和 HHVM (/var/log/hhvm/error.log
)中寻找错误。
回到你的浏览器,你可能会注意到,这个页面类似于使用常规PHP的phpinfo()所产生的页面,事实上,大多数变量与常规PHP的变量相同,除非HHVM特定的变量开始于`hhvm。
在探索变量时,请注意,内存限制
等于17179869184字节,这略高于17 GB。这样的高内存资源限制肯定会杀死一些RAM的Dropplet,使其不响应性。
作为一个一般的例子,如果您的Droplet有2GB的RAM,应该安全地将大约 1.2 GB用于HHVM。 要做到这一点,请用您最喜欢的编辑器编辑文件 /etc/hhvm/php.ini
(sudo vim /etc/hhvm/php.ini
) 并在 ; php 选项
部分后添加一个新的变量:
1[label /etc/hhvm/php.ini]
2memory_limit = 1200M
类似的方式,你可以修改任何PHP设置和变量,以满足你的需求和喜好,只需确保在每次更改后重新启动HHVM,使用命令:
1sudo service hhvm restart
接下来,您可以使用一个常见的 Web 应用程序进行更复杂的测试。重要的是要知道 HHVM 与常见的 PHP 或所有流行的 PHP 框架不兼容 100%。我们在写这篇文章时进行的测试表明,许多 PHP Web 应用程序,如 WordPress,似乎正常工作。
当您使用完整的框架/Web 应用程序进行测试时,不应该考虑任何 HHVM 特定的内容。 安装和操作说明应该与常规的 LEMP 堆栈相同。
然而,在一些非常罕见的情况下,您可能需要为 HHVM 安装一个额外的模块,例如,如果您使用 PostreSQL 作为数据库服务器,您将需要pgsql
模块。
结论
正如本文所示,HHVM 可以很容易地安装、配置和与 Nginx 集成。如果您有足够的资源,您一定要尝试看看 HHVM 独特的 JIT 编译器在性能和稳定性方面如何为您工作。对于像 Facebook 这样具有复杂功能和无与伦比的流量的网站来说,必须有很好的理由信任它。