さくらVPSでUbuntu 16.04のサーバにWordpress環境を作る

## さくらVPSのセットアップ

1Gプラン（メモリ1GB、CPU 仮想2コア、SSD 30GB）で契約。

Ubuntu 16.04のインストール方法は、公式に[カスタムOSインストールガイド](https://help.sakura.ad.jp/app/answers/detail/a_id/2581/~/%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0os%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A4%E3%83%89---ubuntu-16.04)があるので割愛。

ハマりどころとして、HTML5コンソールがFirefoxでLoading中のまま固まってしまうという現象があった。Chromeだとちゃんと動いた。あと、HTML5コンソールだと、クリップボードの文字列をペーストできない問題があり、シリアルコンソールを使う必要があった。

## 下準備

シリアルコンソール等を使って、`/home/ログインユーザ/.ssh/authorized_keys`に公開鍵を登録し、SSH接続できる状態にしておく。SSHのデフォルトポート(22番)に対する攻撃は非常に多いので、SSHのログインポート変更と、パスワードによるログインの無効化はやっておいたほうがいい。

ログインしたら、パッケージマネージャ(apt)の情報を最新に更新する。

```
$ sudo apt update
```

ついでにvim、curl、gitも入れておく。

```
$ sudo apt install vim curl git
```

## Apacheのインストール

WebサーバはApacheを導入する。Nginxでもいいけど、Wordpressの構築はApacheの方が簡単。

```
$ sudo apt install apache2
```

ファイアウォールの設定を確認しておく。以下のようになればOK（80と443が開いてる）。

```
$ sudo ufw app list
Available applications:
  Apache
  Apache Full
  Apache Secure
  OpenSSH
```

この段階で、サーバに設定されたIPアドレスを確認すれば、Apache2のデフォルトページが表示されるはず。

## MySQLのインストール

Wordpressが前提としているDBサーバはMySQLかMariaDB。Ubuntu 16.04ではMySQLを使うのが手軽。

```
$ sudo apt install mysql-server
```

インストール中にrootユーザのパスワードの設定を促されるので、設定する。

インストールが終わったら、MySQLの初期設定を行う。

```
$ sudo mysql_secure_installation
```

はじめに、VALIDATE PASSWORDプラグインを有効にするか聞かれる。これを有効にすると、弱いパスワードを設定しようとするとエラーになる。セキュリティを重視するなら有効にしたほうがいいかも。

その後もいくつか質問される。Yesの方がセキュアな答えなので、迷ったらYesを選んでおけばよい。

* rootのパスワードを変更するか？
* 匿名ユーザを削除するか？
* リモートからのrootでのログインを禁止するか？
* testデータベースを削除するか？
* テーブルのアクセス権をいますぐリロードするか？

## MySQLのセットアップ

以下のコマンドでMySQLにログインできる。パスワードを聞かれるので、先ほど設定したパスワードを入力する。

```
$ mysql -u root -p
```

ログインすると`mysql>`というプロンプトが表示される。以下のSQLで、Wordpress用のデータベースを作成する。名前はなんでも良いけど、ここでは「wordpress」としている。

```
mysql> CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
```

## PHPのインストール

PHP本体と、PHPをApacheモジュールとして動かすためのライブラリ、PHPからMySQLに接続するためのライブラリをインストールする。

```
$ sudo apt install php libapache2-mod-php php-mysql
```

この他、以下のようなライブラリもあらかじめ入れておくとよいかも。

* php-mbstring: 日本語を扱うなら必須
* php-mcrypt: 暗号化
* php-curl: 外部サービスのAPIを使う際に使うことがある
* php-gd: 画像処理
* php-xml: XMLを扱う

インストールに成功すれば、`php`コマンドが使えるようになっているはず。

```
$ php -v
PHP 7.0.4-7ubuntu2.1 (cli) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies
```

Apacheモジュールとして動作することも確認するため、テスト用ファイルを`/var/www/html/info.php`というパスに作成する。

```php
<?php phpinfo();
```

Apacheを再起動しておく。

```
$ sudo systemctl restart apache2
```

`http://IPアドレス/info.php`にアクセスして、PHPの設定情報が表示されればOK。

## Apache設定

`.htaccess`によってApacheの設定をディレクトリ単位で変更できるよう、Apacheの設定を変更する。ここでは、`/var/www/html`以下にwordpressのディレクトリを作成することを前提にしている。

```
# 編集前の状態に戻せるようにバックアップしておく
$ sudo cp /etc/apache2/apache2.conf /etc/apache2/apache2.conf.bk
$ sudo vim /etc/apache2/apache2.conf
```

以下のような設定があるはず。

```
<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>
```

上記設定の下に、以下を追記する。ドキュメントルートの設定は後で行うので省略。

```
<Directory /var/www/html/wordpress>
        AllowOverride All
</Directory>
```

設定ファイルを書き換えたら、以下のコマンドでエラーがないか確認しておく。

```
$ sudo apache2ctl configtest
```

「Syntax OK」と表示されればOK。エラーが出たら編集前の状態に戻す。

次に、URLの書き換えを行うmod_rewriteを有効化し、Apacheを再起動する。

```
$ sudo a2enmod rewrite
$ sudo systemctl restart apache2
```

## WP-CLIの導入

必須ではないが、便利に使えるかもしれないので入れておく。

```
$ cd
$ curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
$ chmod +x wp-cli.phar
$ sudo mv wp-cli.phar /usr/local/bin/wp
$ wp --info
PHP binary:	/usr/bin/php7.0
PHP version:	7.0.4-7ubuntu2.1
php.ini used:	/etc/php/7.0/cli/php.ini
WP-CLI root dir:	phar://wp-cli.phar
WP-CLI packages dir:	/home/ryo/.wp-cli/packages/
WP-CLI global config:
WP-CLI project config:
WP-CLI version:	0.23.1
```

## Wordpressのインストール

WP-CLIを使い、Wordpressのソースコードをダウンロードする。`--locale=ja`を設定すると、日本語用のパッチが当たった状態のWordpressがダウンロードできる。

```
$ wp core download --locale=ja --path=/tmp/wordpress
```

ここでは、`/tmp/wordpress`でセットアップして、最後に`/var/www/html/wordpress`にコピーを行う。`/tmp`はパーミッションが緩いので一時的な作業ディレクトリに向いている。なお、サーバを再起動すると`/tmp`の中身は消去される。

設定ファイルを準備する(.htaccessはWordpressのインストール時に勝手に設定されるので、ファイルだけ用意して権限を設定しておく)。

```
$ touch /tmp/wordpress/.htaccess
$ chmod 660 /tmp/wordpress/.htaccess
$ cp /tmp/wordpress/wp-config-sample.php /tmp/wordpress/wp-config.php
```

`upgrade`ディレクトリもあらかじめ作っておくのがおすすめ。これがないと、パーミッションの問題で自動アップグレードに失敗することがある。

```
$ mkdir /tmp/wordpress/wp-content/upgrade
```

終わったら、ディレクトリを丸ごとコピーする。コピー元の末尾に.を入れることで、.から始まるファイル名のファイルもコピーされる。

```
$ sudo cp -a /tmp/wordpress/. /var/www/html/wordpress
```

ディレクトリのオーナーを設定する。自分の作業ユーザで読み書きでき、apacheユーザ(`www-data`)から読み取り可能な設定が望ましい。

```
$ sudo chown -R 作業ユーザ名:www-data /var/www/html/wordpress
```

`wp-content`ディレクトリについては、ファイルアップロード等に使うため、`www-data`ユーザでも書き込めるようにする。

```
$ sudo chmod g+w /var/www/html/wordpress/wp-content
$ sudo chmod -R g+w /var/www/html/wordpress/wp-content/themes
$ sudo chmod -R g+w /var/www/html/wordpress/wp-content/plugins
```

次に、`wp-config.php`の設定を行う。まず、以下のコマンド等を使用して、セキュアなランダム文字列を生成する。

```
$ curl -s https://api.wordpress.org/secret-key/1.1/salt/
```

取得した文字列を、`wp-config.php`の`define('AUTH_KEY',         '...');`といった設定が並んでいるセクションに設定する。

次に、MySQLのDB接続設定を行う。以下の箇所に、必要な文字列を設定する。

```
define('DB_NAME', 'wordpress'); # 本記事の手順通りならwordpress
define('DB_USER', 'root'); # 本記事の手順通りならrootだけど、別ユーザを作ったほうがセキュア
define('DB_PASSWORD', 'password'); # パスワードを設定する
```

以下の設定の追記も推奨。この設定が無い場合、プラグインの更新時等にFTPのログイン情報が求められることがある。ここでは、`wp-content`配下のプラグイン・テーマのディレクトリへの`www-data`ユーザへの書き込みを許可しているので、Apacheに直接書き込ませる（FS_METHOD = direct）。

```
define('FS_METHOD', 'direct');
```

最後に、Wordpressサイト用のApache設定ファイルを用意する。まず。既存のファイルをコピーして新しいサイトの設定ファイルを作る。

```
$ sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/010-wordpress.conf
```

## Wordpress用のVirtualHost設定

`/etc/apache2/sites-available/010-wordpress.conf`を編集して、DocumentRootを`/var/www/html/wordpress`に変更する。他は変更しなくてもOK。

```
<VirtualHost *:80>
        # ドメインがあれば設定、無い場合はコメントアウトのまま
        #ServerName www.example.com

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html/wordpress

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
```

`sudo apache2ctl configtest`して、Syntax OKか確認する。

次に、デフォルトのサイトを無効化し、Wordpressのサイトを有効化する。

```
$ sudo a2dissite 000-default
$ sudo a2ensite 010-wordpress
$ sudo systemctl restart apache2
```

ここまで終われば、`http://サイトのIPアドレス`にアクセスると、Wordpressの初回セットアップ画面が表示されるはず。
以降はユーザ設定だけでインストール完了です。

## SSLの導入（Let's Encrypt）

無料SSLの[Let's Encrypt](https://letsencrypt.org/)を使用。なお、下記手順は *初回セットアップ方法ではない*。すでにLet's Encryptのセットアップが済んでいる状態で、別のサーバを立ててLet's Encryptの証明書を取得する手順。

初回セットアップに関しては、以下の記事がおすすめ。

[Let's Encrypt の使い方](https://letsencrypt.jp/usage/)

### クライアント(certbot)のインストール

```
$ mkdir ~/bin
$ cd ~/bin
$ git clone https://github.com/certbot/certbot
$ cd certbot
```

下記コマンドを初めて実行すると、パスワードを聞かれ、その後依存パッケージ(Python等)がインストールされる。

```
$ ./certbot-auto
```

自分の環境では、上記コマンドの実行時に、`OSError: Command ~/.local/...ncrypt/bin/python2.7 - setuptools pkg_resources pip wheel failed with error code 1`というエラーが出て終了してしまった。
`export LC_ALL="C"`してから再度コマンドを打つと上手くいった。ロケールがja_JPになっていたのがまずかった模様。

参考: [OSError: Command ~/.local/...ncrypt/bin/python2.7 - setuptools pkg_resources pip wheel failed with error code 1](https://github.com/certbot/certbot/issues/3104)