WordPress最速環境のKUSANAGIをさくらクラウドで試してみる

# はじめに
PrimeStrategyさんのWordPress最速環境と名高いKUSANAGIがさくらクラウドに来たので試してみました。

さくらクラウドでのアカウント設定などはこちらを参考にしました。

> KUSANAGI FOR さくらのクラウド
> http://kusanagi.tokyo/cloud/kusanagi-for-sakuracloud/

またサーバインスタンスを作成したあとはこちらの手順に従って進めました。
> KUSANAGIの初期設定
> http://kusanagi.tokyo/document/kusanagi-init/

ちなみにさくらクラウドでは「時間」の課金があり、最安は9円だそうです。お手軽に試せますね。

# さくらのクラウドのセットアップ

## アカウント開設
さくらクラウドでアカウントを開設します。
http://cloud.sakura.ad.jp/

さくらクラウドでは「契約に必要なアカウント」と「クラウドを管理するアカウント」が別々になります。
サーバを作成する前にクラウド用のアカウントを作成しましょう。

![Screen Shot 2015-10-14 at 10.35.25 AM.png](https://qiita-image-store.s3.amazonaws.com/0/47327/2ac311a8-277f-fab7-bab7-02f869fd0683.png)

ユーザの選択、IaaSの選択、リージョンを選択して「サーバ」を選択します。

次いでサーバインスタンスを作成します。
「アーカイブ選択」にある「KUSANAGI」を選択しましょう。

![Screen Shot 2015-10-14 at 10.29.49 AM.png](https://qiita-image-store.s3.amazonaws.com/0/47327/dadfd957-db37-f377-c3cc-c5a3d79e3723.png)

設定を終えたら3分ほど待ちます。

![Screen Shot 2015-10-14 at 10.30.51 AM.png](https://qiita-image-store.s3.amazonaws.com/0/47327/a0574b7e-d565-d86c-827a-a764aefaa455.png)

できました。

![Screen Shot 2015-10-14 at 10.39.06 AM.png](https://qiita-image-store.s3.amazonaws.com/0/47327/908a2c53-0504-b151-6929-80a3c66869b0.png)

## サンドボックス
さくらクラウドでは作成の流れをお試しする事もできます。
リージョンから「SandBox」を選択するとお試しができます。
もちろん課金されません。

http://cloud-news.sakura.ad.jp/sandbox/

ただし発行されるIPアドレスも特殊なもので、接続、動作させることはできません。あくまで作成の流れを掴むためのお試しですね。


## コンソールでの設定
インスタンスの作成が完了したらクラウド管理画面のコンソールから接続してみます。

![Screen Shot 2015-10-14 at 10.08.06 AM.png](https://qiita-image-store.s3.amazonaws.com/0/47327/bddebd4d-c133-7a3b-da09-f66b4192fef2.png)

きましたね！

どうやらセットアップされたOSはCentOSのようです。
日本ではCentOSの人気が高いですね。

続いてサーバの中身の設定を行いましょう。
クラウドのコンソールからrootで設定を行います。

操作用の一般ユーザを作成します。
(一昔前は「rootユーザで作業は行わないように！」というのが鉄則でした。
最近はこのKUSANAGIの公式マニュアルを含め、rootユーザで作業することを多く見かけるようになりました。
http://itpro.nikkeibp.co.jp/article/Keyword/20071130/288471/
)
ユーザの作成、パスワードの設定、sudo権限の付与(wheelグループへの追加)を行います。

```shell-session
# adduser yousan
# passwd yousan
# usermod -G wheel,kusanagi yousan
```

ユーザの作成が終わったらお好みでsshで接続します。
またお好みで環境を入れておきます。

```bash
$ sudo yum update
$ sudo yum install -y zsh emacs-nox telnet mlocate
$ sudo sh -c 'echo "HOSTNAME=srv1.example.com" >> /etc/sysconfig/network
```

ここまででサーバの基本的な設定はおしまいです。

# KUSANAGIの設定
KUSANAGIのプロビジョニングをおこないます。
(プロビジョニングって最近聞くようになった単語ですが、
プロビジョニング（英: Provisioning）は、本来は「準備、提供、設備」などの意味であり、現在では通常、音声通信やコンピュータなどの分野における、ユーザーや顧客へのサービス提供の仕組みを指す。
とのことです。
https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%83%93%E3%82%B8%E3%83%A7%E3%83%8B%E3%83%B3%E3%82%B0
)

公式マニュアル通りで問題ありません。

http://kusanagi.tokyo/document/kusanagi-init/

大まかな流れはつぎのようになります。

1. KUSANAGI自体の初期設定
1.1. KUSANAGIユーザのパスワード設定 
1.2. KUSANAGIユーザ用SSH公開鍵のパスフレーズ
1.3. mysql rootパスワードの設定

2. WordPressの初期設定
2.1. プロファイル名の設定
2.2. ホスト名の設定
2.3. データベース名の設定
2.4. データベースのユーザー名の設定
2.5. データベースユーザーのパスワードの設定

## KUSANAGIの初期設定

まずはKUSANAGI自体の初期設定を行います。
root権限で`kusanagi init`を実行します。

```shell-session
shell> sudo kusanagi init
Changing password for user kusanagi.
New password:
Enter passphrase (empty for no passphrase): 
Enter MySQL root password. Use [a-zA-Z0-9.!#%+_-] 8 characters minimum.
```

入力のプロンプトが出ているのでそれぞれ入力していきます。
全ての場面で二度ずつ入力を求められます。
この `kusanagi init` は一度だけの実行にしましょう。
試していませんが恐らくパスワード、公開鍵などがリセットされてしまいます。


## WordPressの初期設定

続いてWordPressのプロビジョニングです。
同じくroot権限で `kusanagi provision example`として進めて行きます。

```shell-session
shell> kusanagi provision example
Enter hostname(fqdn) for your website. ex) kusanagi.tokyo
Enter database name you create.
Enter user name for database
Enter password for database user 
```

ホスト名は取得したドメインを設定します。
今回はテストなのでここでは `www.example.com` を設定して手元のホストでhostsファイルを書き換えて接続しました。


FQDNとあるので最後のドットまで必要！とか思っていたら最近はそうでは無いみたいですね。
ちなみに最後のドットまで付けるとうまく動作しませんでした。これについては後述します。

以上の設定が済むと完了です。ブラウザで接続してみましょう。

![Screen Shot 2015-10-14 at 10.22.38 AM.png](https://qiita-image-store.s3.amazonaws.com/0/47327/a8a6e072-401d-4375-5408-2813f9862970.png)

きましたね！

管理画面にログインするとKUSANAGIのプラグインが動作しています。
![Screen Shot 2015-10-14 at 10.23.45 AM.png](https://qiita-image-store.s3.amazonaws.com/0/47327/ff9de8ea-47ea-f9aa-aa69-965304dafa17.png)

管理バー(ログインしていると上部にでるバー)にクエリの速度が表示されています。
![Screen Shot 2015-10-14 at 11.17.09 AM.png](https://qiita-image-store.s3.amazonaws.com/0/47327/63da712b-8c8c-388f-6e34-e060e944bd01.png)
カッコいいですね！

# 実運用の為の設定
実運用をしていくために追加で[行っている/行った]作業を追記しておきます。

## 作業ユーザをkusanagiグループに追加しておく
作業するときに~kusanagiが見れなかったりするので作業ユーザをkusanagiグループに追加しておきます。
その上でkusanagiのホームディレクトリをkusanagiの所有にしてrxを出しておきます。

```shell-session
shell> sudo usermond -G wheel,kusanagi yousan
shell> sudo chown kusanagi:kusanagi ~kusanagi
shell> sudo chmod g+rx ~kusanagi
```

## HDDの追加
標準のkusanagiはHDDイメージを利用していますので16GBになります。
実際に運用するには心許ないです。
HDDを追加して利用します。
HDDの追加作業自体は[他のサイト](http://knowledge.sakura.ad.jp/beginner/1220/)をご覧ください。

* マウント先を /mnt/www.example.com というドメイン名にしておく
* ~kusanagi/[provision名] を新HDDに移動する
* ~kusanagi/[provision名] をシンボリックリンクにする

```bash
$ sudo  fdisk -l /dev/vdb # 追加されたHDDのドライブレター？の確認
$ sudo mkfs.ext4 /dev/vdb 
$ sudo mkdir /mnt/www.example.com
$ sudo mount /dev/vdb /mnt/www.example.com # テスト的にマウントする
$ sudo blkid # UUIDの確認
(fstabへ書き込むなど必須ですが割愛します)
# UUID=0697edf4-b051-4dd1-8f1c-ca8bb6fdfd51 /mnt/www.example.com             ext4 defaults        1 1
$ sudo mv ~kusanagi/example /mnt/www.example.com/
$ sudo -u kusanagi ln -s /mnt/www.example.com/example ~kusanagi/
```

apacheの制約などもあるのでシンボリックリンクを作成するユーザはkusanagiにしておいた方が無難です。
`sudo -u kusanagi`とすることでkusanagiユーザで作成されます。

# さいごに
さくらの契約からKUSANAGIの起動まで1時間かかりませんでした。
時間単位で課金される事を考えると非常にお手軽で便利ですね。
また後述してあるとおりhhvmやapacheの切り替えがコマンド一発、そして高速に切り替えることができます。
「今回の案件はapacheとnginx、どちらが早いかなぁ」
「hhvmで高速にエラーなく動くかテストしたい」
といった要望にすぐ応えられること、すなわち時間課金で対応出来ることが非常に便利だと思いました。
やはりVPSやクラウドでサーバを立てるとなると、chefなどの自動化ツールを使ったとしても細々した設定などを含めて時間が掛かってしまいます。
その辺りを自動化出来るのは便利だと思いました。

# その他

## MySQLのパスワードについて
WordPressのプロビジョニングの途中で設定するパスワードについてです。

個人的な意見ですがデータベースのパスワードは **強力で他のパスワードとは違った物** にしてください。WordPressに限らずデータベースパスワードは平文(プレーンテキスト)で保存されることが多く、最も漏れやすいパスワードです。
漏れた際の被害を防ぐために他と違った長いランダムパスワードにしましょう。
個人的にはどうせ手入力することも少ない16桁ぐらいがおすすめです。

http://www.graviness.com/temp/pw_creator/

## FTPなど
KUSANAGIではセキュリティの観点からFTPは標準ではオフになっているようです。
SSHのサブセットであるSFTPを利用しましょう。

http://kusanagi.tokyo/FAQ/

## ホスト名の設定
ホスト名を間違えて設定してしまった場合には手動で変更が必要なようです。(2015/10/14現在)
`/etc/nginx/conf.d`にあるプロファイル名のconfでserver_nameを変更するとうまく行きます。


```shell-session:/etc/nginx/conf.d/example_http.conf
server {

        listen 80;
        server_name www.example.com.;
        access_log  /home/kusanagi/hoge/log/nginx/access.log main;
```
wwwありなしのエイリアスを書ける場合にもここを書き換えると良いはずです。

またKUSANAGIがデフォルトでnginxを採用しているので、apacheなどに変えた場合には適宜設定ファイルが変わると思われます。

## hhvm
最近ちまたで有名なhhvmも使用できます。

```shell-session
shell> kusanagi hhvm
use hhvm
```

![Screen Shot 2015-10-14 at 11.23.58 AM.png](https://qiita-image-store.s3.amazonaws.com/0/47327/54098ebe-9462-dc64-86c1-c520a2c88180.png)


簡単ですね！

その他、php-fpmの切り替えなどは公式ドキュメントに載っています。

http://kusanagi.tokyo/document/command/

## kusanagiコマンドで設定されるMySQL設定

公式マニュアルではkusanagiのプロビジョニングで
> innodb_buffer_pool_size = 768M
query_cache_size = 192M
http://kusanagi.tokyo/document/kusanagi-init/

とありましたが僕の環境では違っていました。

調べたところ

```shell-session:/usr/lib/kusanagi/lib/functions.sh
        if [ $RET -gt 3600 ]; then
                INNODB_BUFFER=1536
                QUERY_CACHE=256
        elif [ $RET -gt 1800 ]; then
                INNODB_BUFFER=768
                QUERY_CACHE=192
        elif [ $RET -gt 900 ]; then
                INNODB_BUFFER=384
                QUERY_CACHE=128
        else
                INNODB_BUFFER=128
                QUERY_CACHE=64
        fi
```
とあるようで、空きメモリによってMySQLのメモリ設定を変えているようです。
メモリが30G以上などの環境ではさらに変更すると良いかもしれないです。
とはいえKUSANAGIはキャッシュを効かせることで最速環境を出そうとしている(?)ので、MySQLのメモリが大量に必要 => キャッシュが効きにくいサービスということなので、そもそもKUSANAGIにはあわないかもしれません。
この場合にはMySQLやウェブサーバをLBでスケールアウトということになりそうですね。

## FQDNについて
今回僕はホスト名として`www.example.com`を設定を使用しました。
途中にFQDNの入力を求められたのですが、そこで`www.example.com.` (最後にドット付き)としてしまいました。
結果的にこれではうまく動かなかったのですが、FQDNについて改めて調べてみました。

> 厳密には、FQDNにはja.wikipedia.org.のように最後にルートを示すドットを付与しなければならない、という説明が見られることがあるが、そもそもFQDNの厳密な定義というものがあるわけではないので正確ではない。
https://ja.wikipedia.org/wiki/Fully_Qualified_Domain_Name

ということでした。FQDNは最後のドットが必要！と間違って覚えてしまっていましたね。
正しくは
>「TLDまで完全に指定された」ホスト名のことである。

とのことで、最後のドットはあっても無くてもTLDから指定されていればFQDNのようです。
(ちなみにFQDNを「ふぁっくどん」って読んでいるのはわしだけではないハズ…)
## 各種バージョンを調べてみました(2015/10/14現在)

| ソフトウェア | バージョン |
|:-----------|------------:|
| PHP | 5.6.13 |
| nginx | 1.8.0 |
| Apache | 2.4.6 |
| HHVM | 3.8.1-0 |