linux

在 CentOS 7 中 使用HHVM 替换php-fpm

发布时间:7年前热度: 3738 ℃评论数:

HHVM (HipHop Virtual Machine) 是一个用于执行以 PHP 和 Hack 语言编写的代码的虚拟环境。它是由 Facebook 开发的,提供了当前 PHP 7 的大多数功能。要在你的服务器上运行 HHVM,你需要使用 FastCGI 来将 HHVM 和 Nginx 或 Apache 衔接起来,或者你也可以使用 HHVM 中的内置 Web 服务器 Proxygen。

在这篇教程中,我将展示给你如何在 Nginx Web 服务器的 HHVM 上安装 phpinfo。这里我使用 CentOS 7 作为操作系统,所以你需要懂一点 CentOS 操作的基础。

先决条件

  • CentOS 7 – 64位
  • Root 权限

步骤 1 – 配置 SELinux 并添加 EPEL 仓库

在本教程中,我们将使用 SELinux 的强制模式,所以我们需要在系统上安装一个 SELinux 管理工具。这里我们使用 setools 和 setrobleshoot 来管理 SELinux 的各项配置。

CentOS 7 已经默认启用 SELinux,我们可以通过以下命令来确认:

  1. # sestatus
  2. # getenforce

31.png

验证 SELinux 运行状态

如图,你能够看到,SELinux 已经开启了强制模式。

接下来就是使用 yum 来安装 setools 和 setroubleshoot 了。

  1. # yum -y install setroubleshoot setools net-tools

安装好这两个后,再安装 EPEL 仓库。

  1. # yum -y install epel-release

步骤 2 – 安装 Nginx

Nginx (发音:engine-x) 是一个高性能、低内存消耗的轻量级 Web 服务器软件。在 CentOS 中可以使用 yum命令来安装 Nginx 包。确保你以 root 用户登录系统。

使用 yum 命令从 CentOS 仓库中安装 nginx。

  1. # yum -y install nginx

现在可以使用 systemctl 命令来启动 Nginx,同时将其设置为跟随系统启动。

  1. # systemctl start nginx
  2. # systemctl enable nginx

为确保 Nginx 已经正确运行于服务器中,在浏览器上输入服务器的 IP,或者如下使用 curl 命令检查显示结果。

  1. # curl 192.168.1.110

我这里使用浏览器来验证。

32.png

Nginx 正确运行

 

步骤 3 – 安装 HHVM

对于 HHVM,我们需要安装大量的依赖项。作为选择,你可以从 GitHub 下载 HHVM 的源码来编译安装,也可以从网络上获取预编译的包进行安装。在本教程中,我使用的是预编译的安装包。

为 HHVM 安装依赖项:

  1. # yum -y install cpp gcc-c++ cmake git psmisc {binutils,boost,jemalloc,numactl}-devel \
  2. > {ImageMagick,sqlite,tbb,bzip2,openldap,readline,elfutils-libelf,gmp,lz4,pcre}-devel \
  3. > lib{xslt,event,yaml,vpx,png,zip,icu,mcrypt,memcached,cap,dwarf}-devel \
  4. > {unixODBC,expat,mariadb}-devel lib{edit,curl,xml2,xslt}-devel \
  5. > glog-devel oniguruma-devel ocaml gperf enca libjpeg-turbo-devel openssl-devel \
  6. > mariadb mariadb-server libc-client make

然后是使用 rpm 安装从 HHVM 预编译包镜像站点 下载的 HHVM 预编译包。

  1. # rpm -Uvh http://mirrors.linuxeye.com/hhvm-repo/7/x86_64/hhvm-3.15.3-1.el7.centos.x86_64.rpm 
  2. # ln -/usr/local/bin/hhvm /bin/hhvm

安装好 HHVM 之后使用如下命令按了验证:

  1. # hhvm --version

为了能使用 PHP 命令,可以把 hhvm 命令设置为 php。这样在 shell 中输入 php 命令的时候,你会看到和输入 hhvm 命令一样的结果。

  1. # sudo update-alternatives --install /usr/bin/php php /usr/bin/hhvm 60
  2. # php --version

33.png

安装 HHVM

步骤 4 – 配置 HHVM

这一步中,我们来配置 HHVM 以系统服务来运行。我们不通过端口这种常规的方式来运行它,而是选择使用 unix socket 文件的方式,这样运行的更快速一点。

进入 systemd 配置目录,并创建一个 hhvm.service 文件。

  1. # cd /etc/systemd/system/
  2. # vim hhvm.service

复制粘贴如下配置到文件中去。

  1. [Unit]
  2. Description=HHVM HipHop Virtual Machine (FCGI)
  3. After=network.target nginx.service mariadb.service
  4. [Service]
  5. ExecStart=/usr/local/bin/hhvm --config /etc/hhvm/server.ini --user nginx --mode daemon -vServer.Type=fastcgi -vServer.FileSocket=/var/run/hhvm/hhvm.sock
  6. [Install]
  7. WantedBy=multi-user.target

保存文件退出 vim。

接下来,进入 hhvm 目录并编辑 server.ini 文件。

  1. # cd /etc/hhvm/
  2. # vim server.ini

将第 7 行 hhvm.server.port 替换为 unix socket,如下:

  1. hhvm.server.file_socket = /var/run/hhvm/hhvm.sock

保存文件并退出编辑器。

我们已在 hhvm 服务文件中定义了 hhvm 以 nginx 用户身份运行,所以还需要把 socket 文件目录的属主变更为 nginx。然后我们还必须在 SELinux 中修改 hhvm 目录的权限上下文以便让它可以访问这个 socket 文件。

  1. # chown -R nginx:nginx /var/run/hhvm/
  2. # semanage fcontext --httpd_var_run_t "/var/run/hhvm(/.*)?"
  3. # restorecon -Rv /var/run/hhvm

服务器重启之后,hhvm 将不能运行,因为没有存储 socket 文件的目录,所有还必须在启动的时候自动创建一个。

使用 vim 编辑 rc.local 文件。

  1. # vim /etc/rc.local

将以下配置粘贴到文件末行。

  1. # mkdir -/var/run/hhvm/
  2. # chown -R nginx:nginx /var/run/hhvm/
  3. # semanage fcontext --httpd_var_run_t "/var/run/hhvm(/.*)?"
  4. # restorecon -Rv /var/run/hhvm

保存文件并退出 vim。然后给文件赋予执行权限。

  1. # chmod +/etc/rc.local

重新加载 systemd 服务,启动 hhvm 并设置为随系统启动。

  1. # systemctl daemon-reload
  2. # systemctl start hhvm
  3. # systemctl enable hhvm

要确保无误,使用 netstat 命令验证 hhvm 运行于 socket 文件。

  1. # netstat -pl | grep hhvm

34.png

Check the HHVM socket file

步骤 5 – 配置 HHVM 和 Nginx

在这个步骤中,我们将配置 HHVM 已让它运行在 Nginx Web 服务中,这需要在 Nginx 目录创建一个 hhvm 的配置文件。

进入 /etc/nginx 目录,创建 hhvm.conf 文件。

  1. # cd /etc/nginx/
  2. # vim hhvm.conf

粘贴以下内容到文件中。

  1. location ~ \.(hh|php){
  2. root /usr/share/nginx/html;
  3. fastcgi_keep_conn on;
  4. fastcgi_pass unix:/var/run/hhvm/hhvm.sock;
  5. fastcgi_index index.php;
  6. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  7. include fastcgi_params;
  8. }

然后,保存并退出。

接下来,编辑 nginx.conf 文件,添加 hhvm 配置文件到 include 行。

  1. # vim nginx.conf

添加配置到第 57 行的 server 指令中。

  1. include /etc/nginx/hhvm.conf;

保存并退出。

然后修改 SELinux 中关于 hhvm 配置文件的权限上下文。

  1. # semanage fcontext --httpd_config_t /etc/nginx/hhvm.conf
  2. # restorecon -/etc/nginx/hhvm.conf

测试 Nginx 配置并重启服务。

  1. # nginx -t
  2. # systemctl restart nginx

记住确保测试配置没有错误。

步骤 6 – 通过 HHVM 和 Nginx 创建虚拟主机

在这一步中,我们要为 Nginx 和 hhvm 创建一个新的虚拟主机配置文件。这里我使用域名 zhl123.com 来作为例子,你可以使用你主机喜欢的域名,并在配置文件中相应位置以及 phpinfo 安装过程中进行替换。

进入 nginx 的 conf.d 目录,我们将在该目录存储虚拟主机文件。

  1. # cd /etc/nginx/conf.d/

使用 vim 创建一个名为 vps.conf 的配置文件。

  1. # vim vps.conf

粘贴以下内容到虚拟主机配置文件中。

  1. server {
  2. listen 80;
  3. server_name zhl123.com;
  4. # note that these lines are originally from the "location /" block
  5. root /var/www/html;
  6. index index.php index.html index.htm;
  7. location / {
  8. try_files $uri $uri/ =404;
  9. }
  10. error_page 404 /404.html;
  11. location = /50x.html {
  12. root /var/www/html;
  13. }
  14. location ~ \.php$ {
  15. try_files $uri =404;
  16. fastcgi_pass unix:/var/run/hhvm/hhvm.sock;
  17. fastcgi_index index.php;
  18. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  19. include fastcgi_params;
  20. }
  21. }

保存并退出。

在这个虚拟主机配置文件中,我们定义该域名的 Web 根目录为 /var/www/html。目前该目录还不存在,所有我们要创建它,并变更属主为 nginx 用户和组。

  1. # mkdir -/var/www/html
  2. # chown -R nginx:nginx /var/www/html
  3. # vim /var/www/html/phpinfo.php

接下来,为该文件和目录配置 SELinux 上下文。

  1. # semanage fcontext --httpd_config_t "/etc/nginx/conf.d(/.*)?"
  2. # restorecon -Rv /etc/nginx/conf.d

最后,测试 nginx 配置文件以确保没有错误后,重启 nginx:

  1. # nginx -t
  2. # systemctl restart nginx

使用,替换

手机扫码访问