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の更新

[c] [root@localhost ~]# yum update -y [/c]

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

EPELリポジトリ更新

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

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

[c] [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 [/c]

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

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

[c] [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 [/c]

wgetが無い場合は

[c] [root@localhost ~]# yum install wget [/c]

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

HHVMのインストール

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

もしかしたら、この後

[c] [root@localhost ~]# yum install hhvm [/c]

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

HHVMのバージョン確認

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

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

HHVMを実行(PHPファイル)

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

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

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

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

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

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

HHVMを実行(Hack)

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

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

<?hh
echo "hellow Hack\
";

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

[c] [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 -d hhvm.hack.lang.look_for_typechecker=0 to disable this check (not recommended). [/c]

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

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

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

Apacheのインストール

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

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

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

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

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

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

Nghttp2のインストール

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

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

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

Apacheのインストール

[c] [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 [/c]

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

SSL関係のインストール

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

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

Firewallの設定

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

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

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

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

nginxのインストール

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

nginxの設定

[c] [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 [/c]

nginxのインストール

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

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

Apacheの停止してnginxの起動

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

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

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

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

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

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

ApacheとHHVMを連携

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

mod_fcgidのインストール

[c] [root@localhost ~]# yum install mod_fcgid [/c]

confファイルを設定します

[c] [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/" [/c]

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

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

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

Apacheの起動

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

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

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

[c] [root@localhost ~]# service httpd restart [/c]

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

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

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

nginxの連携

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

confファイルを編集

[c] [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; } [/c]

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

nginxの再起動

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

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

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

[c] [root@localhost ~]# service nginx restart [/c]

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

ブラウザで表示してみる

503エラー・・・

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

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

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

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

これで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になっているのか確認するには、以下のコマンドを使います。

[c] [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 [/c]

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

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

一度再起動します。

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

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

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

hhvmのserver.iniを修正?

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

まずはステータスで確認

[c] [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)... [/c]

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

[c] [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 [/c]

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

[c] [root@localhost ~]# reboot [/c]

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

[c] [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 [/c]

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

[c] [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)... [/c]

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

WordPressのインストール

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

Apacheの設定

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

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

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

nginxの設定

nginxも簡単です。

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

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