Ubuntu 16.04 LTSへWordPressをインストール

- Ubuntu 16.04 LTS　へWordPressをインストールした際のメモ。
  - MySQL
  - Apache2
  - PHP7
  - インストール後にIPアドレスを変更し、サイト表示がおかしくなった場合の対処
  - 前段にリバースプロキシがある場合の`wp-config.php`

# `sysv-rc-conf`を導入

```shell-session
$ sudo apt install -y sysv-rc-conf
```

# MySQL

## インストール

```shell-session
$ sudo apt install -y mysql-server
$ sudo mysql_secure_installation
```

- `root`のパスワードを控えておく

## セットアップ

- rootユーザでログイン

```shell-session
$ mysql -u root -p
```

- wordpressデータベースを作成する

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

- サービスを自動起動にする

```shell-session
$ sudo sysv-rc-conf mysqld on
```

# Apache2

## インストール

- WordpressはNginxよりApacheでの構築の方が楽っぽい。

```shell-session
$ sudo apt install -y apache2
```

## PHP

```shell-session
$ sudo apt install -y php libapache2-mod-php php-mysql
```

- 必要に応じてPHPのモジュールをインストール
  - php-mbstring: 日本語
  - php-mcrypt: 暗号化
  - php-curl: CURL
  - php-gd: 画像
  - php-xml: XML

```shell-session
$ sudo apt install -y php-mbstring php-mcrypt php-curl php-gd php-xml
```

- 動作確認のためのファイルを作成

```php:/var/www/html/info.php
<?php phpinfo();
```

- Apacheを再起動

```shell-session
$ sudo systemctl restart apache2
```

- サービスを自動起動にする

```shell-session
$ sudo sysv-rc-conf apache2 on
```

- PHPの動作を確認
`http://[IP]/info.php`

# WordPress

## Apacheの設定ファイルを変更

- 設定ファイルをバックアップ

```shell-session
$ sudo cp /etc/apache2/apache2.conf /etc/apache2/apache2.conf.original
```

- WordPressのインストール先を追加

```apache:/etc/apache2/apache2.conf
<Directory /var/www/html/wordpress>
        AllowOverride All
</Directory>
```

- 設定ファイルのチェック
 - `Syntax OK`の出力を確認

```shell-session
$ sudo apache2ctl configtest
```

- mod_rewriteを有効化し、Apacheを再起動

```shell-session
$ sudo a2enmod rewrite
$ sudo systemctl restart apache2
```

## WP-CLIインストール

```shell-session
$ 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
```

## Wordpressのインストール

- WP-CLIで`/var/www/html/wordpress`にインストール

```shell-session
$ sudo su -
$ wp core download --locale=ja --path=/var/www/html/wordpress --allow-root
$ touch /var/www/html/wordpress/.htaccess
$ chmod 660 /var/www/html/wordpress/.htaccess
$ cp /var/www/html/wordpress/wp-config-sample.php /var/www/html/wordpress/wp-config.php
$ mkdir /var/www/html/wordpress/wp-content/upgrade
$ sudo chown -R [作業ユーザ名]:www-data /var/www/html/wordpress
$ 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
$ sudo chmod -R g+w /var/www/html/wordpress/wp-content/upgrade
$ sudo chmod -R g+w /var/www/html/wordpress/wp-content/languages
```

### `wp-config.php`の変更

- セキュアなランダム文字列の生成し、ファイルを編集する

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

- データベース接続を変更

```php:wp-config.php
define('DB_NAME', 'wordpress');
define('DB_USER', 'root');
define('DB_PASSWORD', 'password');
```

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

```php:wp-config.php
define('FS_METHOD', 'direct');
```

## WordPress用のApacheバーチャルホスト設定

- 既存のファイルをコピーして新しいサイトの設定ファイルを作る

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

### `wordpress.conf`の変更

- `DocumentRoot`を`/var/www/html/wordpress`に変更する。

```apache:/etc/apache2/sites-available/wordpress.conf
<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>
```

- 設定ファイルのチェック
　 - `Syntax OK`の出力を確認

```shell-session
$ sudo apache2ctl configtest
```

- デフォルトのサイトを無効化し、Wordpressのサイトを有効化

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

## インストール後にIPアドレスを変更し、サイト表示がおかしくなった場合の対処

- インストール先のディレクトリで`wp`コマンドを利用する

```shell-session
$ cd /var/www/html/wordpress
```

- 現在の設定を調べる

```shell-session
$ wp option get home
$ wp option get siteurl
```

- `wp`コマンドで修正する
  - 旧IPアドレスのURLを、新IPアドレスのURLに置換する

```shell-session
$ wp search-replace 'http://[Old Ip Address]' 'http://[New Ip Address]'
```

## リバースプロキシ配下での設定

- 前段にNginxのリバースプロキシがある想定
  - インターネットからはNginxのリバースプロキシ経由、ローカルネットワークでは直接ホストへ接続するようなケース
  - リバースプロキシから送られるヘッダを利用し、`home`と`siteurl`を動的に変更している

```php:wp-config.php
if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
    $_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST'];
    $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
    define('WP_HOME', $_SERVER['HTTP_X_FORWARDED_PROTO'] . '://' . $_SERVER['HTTP_X_FORWARDED_HOST']);
    define('WP_SITEURL', $_SERVER['HTTP_X_FORWARDED_PROTO'] . '://' . $_SERVER['HTTP_X_FORWARDED_HOST']);
    if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
        $_SERVER['HTTPS'] = 1;
}
```

- ちなみにNginxのWordPressホストへのプロキシ設定

```nginx
    # HTTP -> HTTPS Redirect
    location / {
        if ($scheme = http) {
            return 301 https://$server_name$request_uri;
        }
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;
        proxy_redirect   http:// https://;
        proxy_pass       http://[WordPressのホスト]/;
    }
```