如何在 Ubuntu 14.04 上使用 Nginx 安装 HHVM

介绍

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 版本上类似,但配置文件的命令和位置可能有所不同。

对于这个教程,你将需要:

本教程中的所有命令都应该作为非根用户运行,如果命令需要 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.htmlindex.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

您的浏览器中的结果应该是这样的:

HHVM's PHP info

如果你看不到类似的页面,那么首先要确保你遵循前提中的安装指示正确。第二,在 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 这样具有复杂功能和无与伦比的流量的网站来说,必须有很好的理由信任它。

Published At
Categories with 技术
Tagged with
comments powered by Disqus