CentOS7にApache or nginx + hhvmでWordPressを動かしてみる

logwが重たいので何か改善をしようと思いました。そこで思いついたのが、PHP7ではなくhhvmにしたら早くなるのか?というのと何故か突然hhvmを使ってみたくなったので遊びでWordPressを構築してみとうという邪な理由からやってみました。1ヶ月近くかかりました・・・

nginx、Apacheどちらでも問題ありません。

環境

  • OS:CentOS7.4
  • Webサーバー:Apache(2.4系) or nginx(1.13系)
  • 実行環境:hhvm(3.15.3)
  • DBサーバー:MariaDB(5.5.56)
  • サーバー環境:さくらのクラウド(OSとSSHのみで基本的にApache、PHPなどは入っていない状態です)
  • ドキュメントルート:/var/www/html

となります。Conohaなど他の環境では試していません。基本的に全ての作業はrootユーザーで行っています。

HHVMのインストール

まずはHHVMのインストールをします。HHVMとHackを触ってみるというサイトを元にやっていきます。

CentOSの更新

[root@localhost ~]# yum update -y

CentOSを更新して最新版にします

EPELリポジトリ更新

[root@localhost ~]# rpm -Uvh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-9.noarch.rpm

依存関係のあるライブラリ更新

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

ここで、mariadbなどのインストールもしています。が、ここでエラーがでます。libc-client.so.2007()(64bit)がありませんというエラーがでます。
※ここで僕は躓きました。このままではhhvmもインストールできません。hhvmインストールするときも同じエラーがでます。

ライブラリのインストール

[root@localhost ~]# wget http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/l/libc-client-2007f-16.el7.x86_64.rpm
[root@localhost ~]# rpm -Uvh libc-client-2007f-16.el7.x86_64.rpm
[root@localhost ~]# yum install libc-client

wgetが無い場合は

[root@localhost ~]# yum install wget

でインストールができます。

HHVMのインストール

[root@localhost ~]# rpm -Uvh http://mirrors.linuxeye.com/hhvm-repo/7/x86_64/hhvm-3.15.3-1.el7.centos.x86_64.rpm

もしかしたら、この後

[root@localhost ~]# yum install hhvm

とやっていたかもしれません。色々調べて試したのでうろ覚えですいません。

HHVMのバージョン確認

[root@localhost ~]# hhvm --version
HipHop VM 3.15.3 (rel)

無事インストールできました。

HHVMを実行(PHPファイル)

HHVMが実際に動くか確認します。とりあえず、test.phpをドキュメントルート直下に作ってみます。

[root@localhost ~]# vi /var/www/html/test.php

<? php echo "hellow World\n"; ?>

単純に表示しているだけです。実行コマンドは以下になります。

[root@localhost ~]# hhvm /var/www/html/test.php
hellow World

無事実行できました。HHVMといえば、Hackです。Hackも実行できるかついでにやってみます

HHVMを実行(Hack)

Hackは拡張子が.hhなので、test.phpをコピーしてtest.hhにしていきます

[root@localhost ~]# cp /var/www/html/test.php /var/www/html/test.hh
[root@localhost ~]# vi /var/www/html/test.hh

<?hh
echo "hellow Hack\n";

Hackは始まりがhhになります。実行します

[root@localhost ~]# hhvm /var/www/html/test.hh 

Fatal error: /var/www/html/test.hh appears to be a Hack file, but you do not appear to be running the Hack typechecker. See the documentation at http://docs.hhvm.com/hack/typechecker/setup for information on getting it running. You can also set <code>-d hhvm.hack.lang.look_for_typechecker=0</code> to disable this check (not recommended).

エラーです。このエラーは、ドキュメントルート直下に.hhconfigというファイルを空でいいので置けば解決します。

[root@localhost ~]# vi /var/www/html/.hhconfig
[root@localhost ~]# hhvm /var/www/html/test.hh
hellow Hack

実行できました。これでインストール完了です。HHVMのインストールが終わったので今度はApacheからインストールします

Apacheのインストール

Apacheのインストールをします。IUSリポジトリを使います。CentOS標準のでも別に問題ないです。IUSにしたのは、httpd2でやってみたいからと思ったぐらいです(簡単にできるだろうと思っていたので)なので、別にIUSでなくても問題ありません。

CentOS7にApache2.4最新版をyum installするというサイトを参考にインストールします

IUSのリポジトリをインストール

[root@localhost ~]# yum -y install https://centos7.iuscommunity.org/ius-release.rpm

IUSのリポジトリをインストールする

[root@localhost ~]# vi /etc/yum.repos.d/ius.repo
[ius]
...
enabled=0 #enabled=1から変更
...

Nghttp2のインストール

[root@localhost ~]# yum --enablerepo=epel -y install nghttp2

/etc/mime.typesのインストール

[root@localhost ~]# yum -y install mailcap

Apacheのインストール

[root@localhost ~]# yum --disablerepo=base,extras,updates --enablerepo=ius install httpd

[root@localhost ~]# httpd -v
Server version: Apache/2.4.29 (CentOS)
Server built:   Oct 23 2017 14:34:32

インストールできました。SSL関係もインストールします

SSL関係のインストール

[root@localhost ~]# yum -y install openldap-devel expat-devel
[root@localhost ~]# yum -y install --enablerepo=ius -y install httpd24u-devel mod_ssl

Apacheのインストール完了です。

Firewallの設定

Firewallの設定を変更します。コマンドの参考はCentOS7のコマンドを見て下さい

[root@localhost ~]# firewall-cmd --permanent --add-service=htt

とりあえず80番ポートだけ空けておきます。

ブラウザで確認してデフォルトページがでていればOKです。

nginxのインストール

nginx僕がやり始めたときはソースからインストールしかできなかったのですが、最近はyumからでもインストールできるみたいです
参考サイト:CentOS 7 (5, 6) で "安定版 (最新版)" のNginxをインストールする方法

nginxの設定

[root@localhost ~]# vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1

nginxのインストール

[root@localhost ~]# yum  --enablerepo=nginx install nginx
[root@localhost ~]# nginx -v
nginx version: nginx/1.13.10

nginxのインストールも終わりました。というわけで実際にnginxが表示されるか確認します

Apacheの停止してnginxの起動

[root@localhost ~]# service httpd stop
[root@localhost ~]# service nginx start

nginxのウエルカムページが表示されていればOKです

ブラウザでtest.phpにアクセスしてみる

apacheでもnginxでもいいので、ブラウザでtest.phpにアクセスしてみてください。おそらくこんなページが表示されます。(僕はApacheでやっています)

<?php echo "hellow World\n"; ?>

実行されていません。これはApache(nginx)とHHVMが連携していないからになります。ここから連携をしていきます。

ApacheとHHVMを連携

ApacheとHHVMの連携をします。ApacheとHHVMはfastcgiで連携します
参考サイト:【Apache】FastCGIで使用しているモジュールをmod_fastcgi → mod_fcgidに切り替える

mod_fcgidのインストール

[root@localhost ~]# yum install mod_fcgid

confファイルを設定します

[root@localhost ~]# vi  /etc/httpd/conf/httpd.conf
<Directory "/var/www/html">
#----追加------
AddHandler fcgid-script .php
Options FollowSymLinks ExecCGI
FcgidWrapper /usr/local/bin/php-wrapper .php
#----追加------    
<FilesMatch "\.php$">
   SetHandler "proxy:fcgi://127.0.0.1:9001/"
</FilesMatch>
  </Directory>

基本的に追加します。Optionsは元の設定はコメントアウトしています。proxy:fcgi://127.0.0.1:9001/は。HHVMの設定をみます

[root@localhost ~]# cat /etc/hhvm/server.ini 
hhvm.server.port = 9001 ←ポートが9001になっているので↑の方も9001を設定

保存をしたらApacheを起動します

Apacheの起動

nginxが起動していてApacheが停止している場合は以下のコマンドになります

[root@localhost ~]# service nginx stop
[root@localhost ~]# service httpd start

nginxが停止している場合は以下のコマンドになります。

[root@localhost ~]# service httpd restart

もし構文が心配などありましたら、以下のコマンドで構文チェックするとOKです

[root@localhost ~]# service httpd configtest
Syntax OK

とでていれば問題無いです。これで連携は完了です。連携完了しても表示はされません。多分503エラーです

nginxの連携

今度はnginxの連携をします。Apacheのだけで使いたい方は特に設定しなくても良いです。この後の作業に入って下さい

confファイルを編集

[root@localhost ~]# vi /etc/nginx/conf.d/default.conf

location / {
         root           /var/www/html;
        index  index.html index.htm;
    }

location ~ \.php$ {
        root           /var/www/html;
        fastcgi_pass   127.0.0.1:9001;
        fastcgi_index  index.php;
	fastcgi_split_path_info ^(.+\.php)(.*)$;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

と設定します。設定したら再起動してください。

nginxの再起動

Apacheが起動しているかたは以下のコマンドになります。

[root@localhost ~]# service httpd stop
[root@localhost ~]# service nginx start

nginxが起動している場合は以下になります

[root@localhost ~]# service nginx restart

これで設定は終わりです。

ブラウザで表示してみる

503エラー・・・

Apacheもnginxでも503エラーになると思います。(もし503になっていない場合は問題ないですが、CentOS7の問題があるので設定はお勧めします)

CentOS7では/var/runを再起動すると削除してしまう

CloudAtCost, CentOS7, Nginx, hhvm, WordPressのサイトをみると、/var/run/hhvmが無くなって、hhvmが起動しなくなります。とあります。実際にコマンドを入れてみるとhhvmがないのがあわかります。サイトのようにconfファイルをいれてみます。

[root@localhost ~]# vi /etc/tmpfiles.d/www.conf
d /var/run/hhvm 0700 nginx nginx

これでOKです。ここで再起動しても問題無く起動するようになります。これでApacheでもnginxでもHHVMがブラウザでも実行されます。ただし、hhvmの実行ユーザーがnginxになるので、Apacheで実行すると場合によっては503エラーとなります。

Apacheにすると503エラー

/var/run/hhvm ですが、これの設定を例えばd /var/run/hhvm 0700 apache apache にしても、503エラーになります。これは、hhvmの実行ユーザーがnginxになっているためになります。nginxでhhvmを動かす場合は特に設定はいりませんが、Apacheでhhvmを実行するには設定ファイルを編集する必要があります

まずはなぜ実行ユーザーがnginxなのか確認する

hhvmの実行ユーザーがなぜnginxになっているのか確認するには、以下のコマンドを使います。

[root@localhost ~]# ps auxw | grep hhvm
nginx     470  0.1 25.4 1199016 258312 ?      SLsl  3月26   1:34 /usr/local/bin/hhvm --config /etc/hhvm/server.ini --user nginx --mode daemon -vServer.Type=fastcgi -vServer.Port=9001

nginxが実行者になっていました。つまり、/var/runs/hhvmはapacheで実行しているのに、hhvmの実行ユーザーはnginxになっていました。これでは・・・apacheで503がでます。というわけで実行ユーザーを変えればapacheでも起動できることになります。まずはファイル編集します

[root@localhost ~]# vi /etc/tmpfiles.d/www.conf
d /var/run/hhvm 0700 apache apache

[root@localhost ~]# reboot

一度再起動します。

再起動後に/var/runを確認します

[root@localhost ~]# ls -all /var/run/ | grep hhvm
drwx------   2 apache apache   60  3月 27 15:08 hhvm

apacheになっています。しかし、今の段階ではhhvmの実行者はnginxなので、hhvmの実行者を変えるようにします

hhvmのserver.iniを修正?

ネットで検索すると、server.iniを修正すると良い記述がありましたが、僕の環境では意味無かったです。実行者がapacheになることはありませんでした。

まずはステータスで確認

[root@localhost ~]# service hhvm status
Redirecting to /bin/systemctl status hhvm.service
● hhvm.service - HHVM HipHop Virtual Machine (FCGI)
   Loaded: loaded (/usr/lib/systemd/system/hhvm.service; enabled; vendor preset: disabled)
   Active: active (running) since 火 2018-03-27 15:19:47 JST; 24s ago
 Main PID: 468 (hhvm)
   CGroup: /system.slice/hhvm.service
           └─468 /usr/local/bin/hhvm --config /etc/hhvm/server.ini --user nginx --mode daemon -vServer.Type=fastcgi -vServer.Port=9001

 3月 27 15:19:47 localhost.localdomain systemd[1]: Started HHVM HipHop Virtual Machine (FCGI).
 3月 27 15:19:47 localhost.localdomain systemd[1]: Starting HHVM HipHop Virtual Machine (FCGI)...

どうやら、(/usr/lib/systemd/system/hhvm.serviceのとこでデーモンファイルを読み込んでいるみたいです。これはCentOS7のデフォルトになります。CentOS7では/etc/systemd/system/配下にカスタマイズ内容をいれるようになっています。というわけで、以下の情報を入れていきます。
参考サイト:CentOS7導入時に調べたsystemdの話

[root@localhost ~]# vi /etc/systemd/system/hhvm.service
[Unit]
Description=HHVM HipHop Virtual Machine (FCGI)

[Service]
ExecStart=/usr/local/bin/hhvm --config /etc/hhvm/server.ini --user apache --mode daemon -vServer.Type=fastcgi -vServer.Port=9001

[Install]
WantedBy=multi-user.target

やっている内容はuserをapacheに変えただけです。OSの再起動します

[root@localhost ~]# reboot

OSの再起動後に、hhvmの実行者を確認します

[root@localhost ~]# ps auxw | grep hhvm
apache     467  0.4 17.9 774332 182016 ?       SLsl 15:41   0:01 /usr/local/bin/hhvm --config /etc/hhvm/server.ini --user apache --mode daemon -vServer.Type=fastcgi -vServer.Port=9001

Apacheになっています。これで問題無いです。念のためhhvmのステータスも確認してみます

[root@localhost ~]# service hhvm status
Redirecting to /bin/systemctl status hhvm.service
● hhvm.service - HHVM HipHop Virtual Machine (FCGI)
   Loaded: loaded (/etc/systemd/system/hhvm.service; enabled; vendor preset: disabled)
   Active: active (running) since 火 2018-03-27 15:41:49 JST; 9min ago
 Main PID: 467 (hhvm)
   CGroup: /system.slice/hhvm.service
           └─467 /usr/local/bin/hhvm --config /etc/hhvm/server.ini --user apache --mode daemon -vServer.Type=fastcgi -vServer.Port=9001

 3月 27 15:41:49 localhost.localdomain systemd[1]: Started HHVM HipHop Virtual Machine (FCGI).
 3月 27 15:41:49 localhost.localdomain systemd[1]: Starting HHVM HipHop Virtual Machine (FCGI)...

読み込みファイルも、/etc/systemd/system/hhvm.serviceに変っています。

WordPressのインストール

WordPressのインストールは特に何かWordPressのファイルを変えるなどはありません。しかし、このままだと今度はインストールが成功しても403エラーになります。(管理画面が表示できない)というわけでそれぞれのconfファイルを変えます。

Apacheの設定

Apacheはconfファイルの修正をします

[root@localhost ~]# vi  /etc/httpd/conf/httpd.conf
<Directory "/var/www/html">
  DirectoryIndex index.php index.htmm ←これを追加
 </Directory>

これで終わりです。Apacheを再起動すれば表示されます。

nginxの設定

nginxも簡単です。

[root@localhost ~]# vi /etc/nginx/conf.d/default.conf
location / {
root /var/www/html;
index index.php index.html index.htm; ←index.phpの優先順位を変える
}

ふたつとも優先順位を変えることで問題無く表示することができました。

個人支援・寄付について

サイトラボでは個人支援・寄付を受けております。ご協力いただける方はお願いいたします。当サイトではビットコインで受け付けております。

  • ビットコイン:3LHnADwZwUbic2L45EnVJEykiG6KfbqrwS