CloudAtCost, CentOS7, Nginx, hhvm, Wordpress

**CloudAtCost にCentOS7, nginx, hhvm をインストールして、ぼくのかんがえたさいきょうのWordpressが構築できるか検証します。**

#CloudAtCost とは
ある特定の人たちで人気の激安VPSです。
~~一度$35を支払えば、CloudAtCost社が破たんするまでVPSが利用できます。~~
**なんか、メンテナンス料を請求されるようになりました。**
**というわけで、もう使わない。**
50%割引とか70%割引とかキャンペーンをしょっちゅうやってますので、実際はもっと安く導入できます。
サーバ本体はカナダにあるようです。
良く落ちてます。
動いていても重いです。
商用サービスで使用することはお勧めしません。
「カネはないけど時間はある人」向けのマニアックなおもちゃです。

#CentOS7 を導入する
サーバを追加するときにCentOS7を選択するだけです。
ただインストールが開始されるまでにPendingのまますっげぇ待たされることがあります。
私は4日待ちました。
待った挙句にインストールに失敗することもよくあります。
これが最初の関門です。

DVD等からインストールする場合の「最小インストール」に相当するようです。
net-tools などは入れておいた方が後が楽です。

インストールが完了したら、速攻で「yum update」しておきましょう。

アップデート後に再起動するときもすっごい待たされます。（数時間とか）
失敗したと思ってサーバを削除しないようにしましょう。

私の環境ではアップデート後にDNSが引けなくなりました。
/etc/resolv.conf に

    nameserver 8.8.8.8
/etc/sysconfig/network-scripts/ifcfg-eth0 に

    DNS1=8.8.8.8
を追記しました。

#hhvm をインストールする
hhvm はなぜかRedHat系OSを冷遇しています。
公式ではバイナリパッケージが配布されていません。
頑張ってソースからコンパイルしようとしましたが、
コンパイルに5日かかった挙句、見事に失敗してしまったので心が折れました。
親切なインド人によって配布されているバイナリをありがたくインストールします。

基本的に、[GitHubのPrebuilt Packages on Centos 7.x](https://github.com/facebook/hhvm/wiki/Prebuilt-Packages-on-Centos-7.x) に書いてある方法のままです。
さっきは公式では配布されていないと書きましたが、上記ディレクトリを見ると、もしかしたら公式なのかもしれません。

```bash
rpm -Uvh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm

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 zeromq-devel -y

rpm -Uvh http://mirrors.linuxeye.com/hhvm-repo/7/x86_64/hhvm-3.12.0-1.el7.centos.x86_64.rpm
```
c++ とか make 関連はいらないような気もしますが、考えるのがめんどくさいです。

もしかしたら最後の rpm コマンドで依存パッケージが足りないとか言われるかもしれません。
geoip とか libなんちゃらを2～3個追加で入れたような気がします。

2016/10/01 追記

```
rpm -Uvh http://mirrors.linuxeye.com/hhvm-repo/7/x86_64/hhvm-3.12.0-1.el7.centos.x86_64.rpm
の代わりに、
yum install http://mirrors.linuxeye.com/hhvm-repo/7/x86_64/hhvm-3.14.4-1.el7.centos.x86_64.rpm
ってやれば、依存関係はすべてやってくれるみたいです。知らんかった。
```
 
hhvm が無事インストールできたら、/etc/hhvm/server.ini でタイムゾーンを修正します。

```
[date]
date.timezone = Asia/Tokyo
```
hhvm --version
で、

```
HipHop VM 3.12.1 (rel)
Compiler: tags/HHVM-3.12.1-0-gf516f1bb9046218f89885a220354c19dda6d8f4d
Repo schema: f2e5f39b2ad4a08bcbd90b5d8bcb580f40fba6c8
```
とか出てくればバッチリです。

最後に hhvm の起動設定をしておきます。hhvm はfastcgi として動作するので、WWWサーバのバックエンドとして動かしておかないといけません。

```
systemctl enable hhvm
systemctl start hhvm
```

上記 rpm でインストールした場合、hhvm のポートが 9001 になっています。
普通は 9000 を使うのですが、将来 php-fpm で比較とかするかもしれませんので、とりあえずそのままにしておきます。

#CentOS7 + hhvm での注意
OSが再起動されると「/var/run」が掃除されて「/var/run/hhvm（実際は/run/hhvm）」が無くなって、hhvmが起動しなくなります。
/etc/tmpfiles.d/ にwww.conf とか作って以下の1行を書いておきましょう。

```/etc/tmpfiles.d/www.conf
d /var/run/hhvm 0700 nginx nginx
```

#Nginx のインストール
CentOS 公式ではパッケージがありませんのでNginx 公式から頂いてインストールします。

```
yum install http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum install --enablerepo=nginx nginx
```
インストールはこれでおしまいです。
##Nginxの設定
/etc/nginx/conf.d/default.conf をいじります。
以下わかりやすいようにコメントを日本語で書いていますが、実際の設定ファイルは英語のほうが安心な気がします。

hhvm へのブリッジ、Wordpressのパーマリンク対応、画像のブラウザキャッシュ、gz圧縮などの設定を入れています。

```
server {
    listen       80;
    server_name  www.example.com;

    access_log  /var/log/nginx/log/host.access.log  main;

    # Wordpressのパーマリンク対応入り
    location / {
        try_files $uri $uri/ @wordpress;
        root   /path/to/htdocs;
        index  index.php index.html index.htm;
    }

    # phpはhhvmにぶんなげる（ここもパーマリンク対応）
    location ~ \.php$ {
        try_files $uri @wordpress;
        root           /path/to/htdocs;
        fastcgi_pass   127.0.0.1:9001;
        fastcgi_index  index.php;
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        fastcgi_param  SCRIPT_FILENAME  /path/to/htdocs$fastcgi_script_name;
        include        fastcgi_params;
    }

    # 画像類はブラウザキャッシュさせる（例は8日）
    # WordPressの設定が終わったら、cssやjsもキャッシュさせていいと思う
    location ~ \.(jpg|gif|png|svg|woff)$ {
        expires 8d;
        root   /path/to/htdocs;
    }

    # パーマリンクの実際の処理
    location @wordpress {
        fastcgi_pass   127.0.0.1:9001;
        fastcgi_index  index.php;
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        fastcgi_param  SCRIPT_FILENAME  /path/to/htdocs/index.php;
        include        fastcgi_params;
    }

    # .htで始まるファイルをアクセス禁止
    location ~ /\.ht {
        deny  all;
    }

    # gz圧縮を使う
    gzip              on;
    gzip_min_length   1024;
    gzip_buffers      4 8k;
    gzip_http_version 1.0;
    gzip_comp_level   2;
    gzip_proxied      any;
    gzip_types        text/plain text/css application/javascript
                      text/xml application/atom+xml application/xml+rss
                      application/json text/json text/javascript+json
                      image/svg+xml application/xml;
    gzip_disable      "MSIE [1-6].";
    gzip_disable      "Mozilla/4";
}
```

これで基本的には設定も終わりですが、Wordpress をいろいろメンテしていると、やたらとタイムアウトがでましたので、hhvm のタイムアウト関連を変更しました。

/etc/hhvm/server.ini で以下を変更・追加しました。

```
hhvm.server.request_timeout_seconds = 300
default_socket_timeout = 300
```
hhvm の設定を変更したら、忘れずに、
systemctl restart hhvm
です。

あとは nginx を起動します。

```
systemctl enable nginx
systemctl start nginx
```
もしかすると、/var/run/hhvm が書き込めねぇとか文句垂れるかもしれません。
そのときは、
chown nginx:nginx /run/hhvm
とかしておけばよかったような気がします。
#Wordpress のインストール
nginx + hhvm だからといって特別なことはやっていません。
普通にインストールして、普通にチューニングするだけです。

Wordpressのページキャッシュなしでも、Google PageSpeed Insights で安定して90が出るようになりました。

以下は今回のインストールで実際に動いているサイトです。（2016年5月時点）
更新は放置されています。

http://www.mixp.net

CloudAtCost でもそこそこ実用的な速度が出ていると思います。
今後コンテンツが増えてきたり、プラグインを追加したりしたらわかりませんが。
というわけで今回はここまで。

#追伸：phpMyAdmin 動かしたら100%落ちます。