AmazonLinux2+Nginx+NginxUnitでWordPressを複数サイト動かす

表題の通り。できたので、やり方をまとめておきます。

### 参考にしたページ
##### Amazon公式
(1) [チュートリアル: Amazon Linux 2 に LAMP ウェブサーバーをインストールする](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-lamp-amazon-linux-2.html)
(2) [チュートリアル: Amazon Linux を使った WordPress ブログのホスティング](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/hosting-wordpress.html)
(3) [チュートリアル: Amazon Linux 2 で SSL/TLS を使用できるように Apache ウェブサーバーを設定する](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/SSL-on-an-instance.html)

##### Nginx公式
(5) [Installation](http://unit.nginx.org/installation/)
(4) [Installing WordPress with NGINX Unit](https://www.nginx.com/blog/installing-wordpress-with-nginx-unit/)

site1.com, site2.com の2サイトを作成する。DNS設定はすでにこのサーバー向きに設定されているとする。

## （ステップ１）　ミドルウェアのインストールと初期設定

#### MariaDB, PHP, Nginx

AL2用のNginx Unitのバイナリが5.4対応のためPHP 5.4をインストールする

```
sudo yum update -y
sudo yum install -y mariadb-server php php-devel php-mysqlnd
sudo amazon-linux-extras install nginx1.12

// 起動もここで行う
sudo systemctl start mariadb
sudo systemctl enable mariadb
sudo systemctl start nginx
sudo systemctl enable nginx

// MariaDBの初期設定
sudo mysql_secure_installation
*** 適当に全てyと応える。rootユーザのパスワードも設定する。*** 
```
参考)[データベースサーバーをセキュリティで保護する](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-lamp-amazon-linux-2.html#SecuringMySQLProcedure)


#### Nginx Unit
```
sudo vi /etc/yum.repos.d/unit.repo
```

```/etc/yum.repos.d/unit.repo
[unit]
name=unit repo
baseurl=https://packages.nginx.org/unit/amzn2/$releasever/$basearch/
gpgcheck=0
enabled=1
```

```
sudo yum install -y unit unit-devel unit-php

// 起動
sudo systemctl start unit
sudo systemctl enavle unit

// Nginx Unitの PHP用初期設定
sudo curl -X PUT --data-binary @/usr/share/doc/unit-php/examples/unit.config --unix-socket /var/run/unit/control.sock http://localhost/config
```

### （ステップ２）　WordPressのインストール

今回は `/var/www/site1`, `/var/www/site2`のように配置する。ステップ２は普通のWordPress導入と同じで特別なことはない。

（既存WordPressの引越しの場合、データベースのダンプをMariaDBに入れ、`wordpress`フォルダを丸々`site1`などの名前でここに置き、パーミッションをいい感じにnginxに付ける(後述)。）

以下新規の場合

#### WordPress本体の配置
```
// 最新のWordPressを持ってくる
wget https://wordpress.org/latest.tar.gz
tar -xzf latest.tar.gz

// 2サイト分コピー
sudo mkdir /var/www/site1
sudo cp -r wordpress/* /var/www/site1/
sudo mkdir /var/www/site2
sudo cp -r wordpress/* /var/www/site2/

// パーミッション設定
sudo usermod -a -G nginx ec2-user
sudo chown -R nginx /var/www
sudo chgrp -R nginx /var/www
sudo chmod 2775 /var/www
find /var/www -type d -exec sudo chmod 2775 {} \;
find /var/www -type f -exec sudo chmod 0664 {} \;
```

#### DBの作成
```
mysql -u root -p
> CREATE USER 'wordpress-user'@'localhost' IDENTIFIED BY 'your_strong_password';
> CREATE DATABASE `wordpress-db`;
> FLUSH PRIVILEGES;

// これをもう1サイト分
> CREATE USER 'wordpress-user2'@'localhost' IDENTIFIED BY 'your_strong_password2';
> CREATE DATABASE `wordpress-db2`;
> FLUSH PRIVILEGES;
```

#### wp-confgの設定

以下作業は`site1`についてのみ。`site2`についても同様に行う。

```
cd /var/www/site1
cp wp-config-sample.php wp-config.php
vi wp-config.php
```

```wp-config.php
// 更新が必要な行のみを記している。
define('DB_NAME', 'wordpress-db');
define('DB_USER', 'wordpress-user');
define('DB_PASSWORD', 'your_strong_password');

define('AUTH_KEY',         'Yv+g6TVojj-:49!Gye?<$#-.6y`w)v^>Em&7.L!|x##n>,D<g*K;wQTIDNtz&jj<');
define('SECURE_AUTH_KEY',  'qCrymu+AJu.W3$7HVD-WF]XCL_z4P+C`O-;mV tk`@XPXO`0%0K%}((r3-z(m-(M');
define('LOGGED_IN_KEY',    '6<R7 vXjj PVb-)Bnm2-GgH-NGXnYhWxi!6^6BR>HbG~c5wLe~g&m[m~o?DR`j<&');
define('NONCE_KEY',        '@*|zA-#8bB+kD,1~Tfv9UtHm+*|BJq_ei8hC/yc>^ uZe :1%RN6I&LUcCbyU6!-');
define('AUTH_SALT',        'FL9X=tt~xJ}|F>S-::s[NN)_N:GR?_,86t,tl*2|tLi4eB~b9ni)0QQ?W4xia`a)');
define('SECURE_AUTH_SALT', 'P; lpAD^0?=`z||>j0C8)C+UHvjn1%(DlPA_/)E>O@HR]0OXdcYlF f/tN02nzMw');
define('LOGGED_IN_SALT',   'v&d8!DOhFaJ1Ox0%&Ej8@RH<{u.it^C8*l%Q)`CD_S/f,-SG4fFo.OWK;b ub_cO');
define('NONCE_SALT',       ';dXT*@6!Y#:s|$`/ccgM{-6Xh8}0wvs-aqG&ts#(R;|ugwpkdAx!vHA#wTV0Iw1H');
```

## （ステップ３）　Nginx と Nginx Unit と WordPress の結合

#### Nginx Unit の設定
```
vi /var/www/wordpress.conf
```

```/var/www/wordpress.conf
{
    "listeners": {
        "127.0.0.1:8090": {
            "application": "script_index_php_1"
        },
        "127.0.0.1:8091": {
            "application": "direct_php_1"
        },
        "127.0.0.1:8092": {
            "application": "script_index_php_2"
        },
        "127.0.0.1:8093": {
            "application": "direct_php_2"
        }
    },

    "applications": {
        "script_index_php_1": {
            "type": "php",
            "processes": {
                "max": 20,
                "spare": 5
            },
            "user": "nginx",
            "group": "nginx",
            "root": "/var/www/site1",
            "script": "index.php"
        },
        "direct_php_1": {
            "type": "php",
            "processes": {
                "max": 5,
                "spare": 0
            },
            "user": "nginx",
            "group": "nginx",
            "root": "/var/www/site1",
            "index": "index.php"
        },
        "script_index_php_2": {
            "type": "php",
            "processes": {
                "max": 20,
                "spare": 5
            },
            "user": "nginx",
            "group": "nginx",
            "root": "/var/www/site2",
            "script": "index.php"
        },
        "direct_php_2": {
            "type": "php",
            "processes": {
                "max": 5,
                "spare": 0
            },
            "user": "nginx",
            "group": "nginx",
            "root": "/var/www/site2",
            "index": "index.php"
        }
    }
}
```

```
sudo curl -X PUT --data-binary @/var/www/wordpress.config --unix-socket /var/run/unit/control.sock http://localhost/config
```

#### Nginxの設定
```
vi /etc/nginx/conf.d/site1.conf
```

```/etc/nginx/conf.d/site1.conf
upstream index_php_upstream_1 {
    server 127.0.0.1:8090; # NGINX Unit backend address for index.php with
                           # 'script' parameter
}

upstream direct_php_upstream_1 {
    server 127.0.0.1:8091; # NGINX Unit backend address for generic PHP file handling
}

server {
    listen      80;
    server_name site1.com;
    root        /var/www/site1/;

    location / {
        try_files $uri @index_php;
    }

    location @index_php {
        proxy_pass       http://index_php_upstream_1;
        proxy_set_header Host $host;
    }

    location /wp-admin {
        index index.php;
    }

    location ~* .php$ {
        try_files        $uri =404;
        proxy_pass       http://direct_php_upstream_1;
        proxy_set_header Host $host;
    }
}
```
site2についても同様に `/etc/nginx/conf.d/site2.conf` を作成する。

以上で設定が完了したのでリロードし、`http://site1.com`でアクセスできることが確認できるはず。

```
sudo nginx -s reload
```


## （ステップ４）　HTTPS 設定
certbotを使ってLet's Encrypt 証明書を導入します。

```
sudo wget -r --no-parent -A 'epel-release-*.rpm' http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/
sudo rpm -Uvh dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-*.rpm
sudo yum-config-manager --enable epel*
sudo yum install -y certbot
sudo certbot
*** 指示に従う ***
```

`/etc/nginx/conf.d/site1.conf`
を以下のように更新

```/etc/nginx/conf.d/site1.conf
upstream index_php_upstream_1 {
    server 127.0.0.1:8100; # NGINX Unit backend address for index.php with
                           # 'script' parameter
}

upstream direct_php_upstream_1 {
    server 127.0.0.1:8101; # NGINX Unit backend address for generic PHP file handling
}

server {
    listen       443 ssl http2;
    server_name  site1.com;
    root        /var/www/site1/;

    ssl_certificate "/etc/letsencrypt/live/site1.com/cert.pem";
    ssl_certificate_key "/etc/letsencrypt/live/site1.com/privkey.pem";

    ssl_session_timeout  10m;
    ssl_protocols TLSv1.2;
    ssl_ciphers EECDH+AESGCM:EECDH+AES;
    ssl_ecdh_curve prime256v1;
    ssl_prefer_server_ciphers on;

    keepalive_timeout    70;
    sendfile             on;
    client_max_body_size 0;

    proxy_set_header    Host    $host;
    proxy_set_header    X-Real-IP    $remote_addr;
    proxy_set_header    X-Forwarded-Host       $host;
    proxy_set_header    X-Forwarded-Server    $host;
    proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;

    location / {
        try_files $uri @index_php;
    }

    location @index_php {
        proxy_pass       http://index_php_upstream_1;
        proxy_set_header Host $host;
    }

    location /wp-admin {
        index index.php;
    }

    location ~* .php$ {
        try_files        $uri =404;
        proxy_pass       http://direct_php_upstream_1;
        proxy_set_header Host $host;
    }
}
```

wp-config.phpを更新

```wp-config.php
$_SERVER['HTTPS']='on'; // https化のためにはこの行が必要
```


### 雑感
アクセスのほとんどないサイトを運営し続けたいことが時々あります。t2インスタンス時代にはt2.microでも辛かったWordPressですが、今ではt3.nanoで複数サイトを運営できるようになっている感じがあります。
複数言語で動かせるAPサーバーということでNginx Unitに注目していましたが、実際に触ったところ、案外すんなりできました。しかし、まだまだ情報が少ないので、どんどん利用者が増えるといいなと思いました。