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