VPSにWordPress(Ubutnu18.04 + nginx + PHP7.3-fpm)をインストールするメモ

# はじめに
久しぶりに安いVPSを探していたら、WebARENA IndigoというVPSサービス(メモリ1GBのプランだと月349円)を見つけたので、WordPressをインストールしてみました。その時のインストール手順のメモです。

# 出来上がるもの

* Ubutnu18.04 + nginx1.14.0 (HTTP/2) + PHP7.3-fpm で動くWordPressサイト

# 各種アップデート
VPSを起動したらまずはupdateを実施します。

```
sudo apt update
sudo apt upgrade
```

# マシンの設定
## 作業用ユーザの追加
デフォルトではubuntuというroot権限の付与されたユーザのみが存在します。
今回はそれとは別に作業用ユーザを追加します。

```
adduser user
sudo gpasswd -a user sudo
```

ubuntuユーザの公開鍵を作業用ユーザの.ssh配下へ移設し、ubuntuユーザは削除しました。

## rootパスワードの変更

rootのパスワードが設定されていなかったため変更します。

```
sudo su
passwd
```

## host名の変更
デフォルトのhost名はわかりづらいため変更します。

```
user@i-10100000002311:~$ sudo vim /etc/hostname 
```

## タイムゾーンを日本時間へ変更
お好みですが、VPSのタイムゾーンを日本時間(JST)に変更しました。
参考: https://qiita.com/zaki-lknr/items/cd9844fa6a1efa58cab1

```
timedatectl set-timezone Asia/Tokyo
```

変更前

```
user@hostname:~$ timedatectl
                      Local time: Sun 2019-12-08 12:52:33 UTC
                  Universal time: Sun 2019-12-08 12:52:33 UTC
                        RTC time: Sun 2019-12-08 12:52:34
                       Time zone: Etc/UTC (UTC, +0000)
       System clock synchronized: yes
systemd-timesyncd.service active: yes
                 RTC in local TZ: no
```
変更後

```
user@hostname:~$ timedatectl
                      Local time: Sun 2019-12-08 21:53:38 JST
                  Universal time: Sun 2019-12-08 12:53:38 UTC
                        RTC time: Sun 2019-12-08 12:53:39
                       Time zone: Asia/Tokyo (JST, +0900)
       System clock synchronized: yes
systemd-timesyncd.service active: yes
                 RTC in local TZ: no
```

# ミドルウェアのインストール

WordPressの動作に必要になるミドルウェア等をインストールしていきます。
今回は、nginx、PHP7.3、MySQL、ufw(ファイアウォール)、certbot(HTTPS対応のため)もインストールします。

## nginxのインストール

```
sudo apt install -y nginx
```
nginx 1.14.0が入りました。

```
user@hostname:~$ nginx -v
nginx version: nginx/1.14.0 (Ubuntu)
```

## PHP7.3のインストール
デフォルトだとPHP7.2がインストールされ、WordPressのサイトヘルス機能で警告が出るためPHP7.3をインストールします。

```
sudo apt install software-properties-common
sudo apt-add-repository ppa:ondrej/php
sudo apt install -y php7.3-fpm php-curl php7.3-bcmath php7.3-gd php7.3-mbstring php7.3-mysql php7.3-xml php7.3-zip
```

## MySQLのインストール
```
sudo apt install -y mysql-server mysql-client
```

## ufwのインストール
念のためファイアウォールを入れておきます。

```
sudo apt install -y ufw
```

## certbotのインストール

```
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get install certbot python-certbot-nginx
```

# ミドルウェアの設定
続いてミドルウェアの設定をしていきます。
設定の変更が済んだらプロセスの再起動を忘れずに実施します。

## nginx
nginxの設定ファイル `/etc/nginx/sites-available/default` を設定します。


```
server {
        listen 80;
        listen [::]:80;

        root /var/www/html/example;

        index index.html index.htm;
        client_max_body_size 20M;
        server_name example.org;

        location / {
                index index.php index.html index.htm;
                try_files $uri $uri/ /index.php?$args;
        }

        # pass PHP scripts to FastCGI server
        location ~ [^/]\.php(/|$) {
                fastcgi_index index.php;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/run/php/php7.3-fpm.sock;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO $fastcgi_path_info;
        }

        location ~ /\.ht {
                deny all;
        }
}
```

## PHP
`/etc/php/7.3/fpm/php.ini` を開き `upload_max_filesize` を変更します。

```
upload_max_filesize = 20M
```

## MySQL

(お好みで)文字コードをutf8mb4を使用するように変更

**2019/12/27 追記: utf8だと寿司ビール問題が起きるため、utf8mb4を用いたほうが良いとコメントを頂いたため修正しました。**

```
[mysqld]
character-set-server = utf8mb4
[mysql]
default-character-set=utf8mb4
```
WordPress用のデータベース作成

```
CREATE DATABASE wordpress;
CREATE USER 'user'@'localhost' IDENTIFIED BY 'hogehoge'
grant all on wordpress.* to 'user'@'localhost';
```

## ufwの有効化
ファイアウォールを有効化し、SSHとHTTP以外の通信はブロックするようにします。
参考: https://qiita.com/shimakaze_soft/items/c3cce2bfb7d584e1fbce

設定内容

```
sudo ufw enable
sudo ufw default DENY
sudo ufw allow 80
sudo ufw allow 443
sudo ufw limit 22
```
設定内容を確認

```
sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
80                         ALLOW       Anywhere                  
443                        ALLOW       Anywhere                  
22                         LIMIT       Anywhere                  
22 (v6)                    LIMIT       Anywhere (v6)             
80 (v6)                    ALLOW       Anywhere (v6)             
443 (v6)                   ALLOW       Anywhere (v6)  
```

## certbotの設定
certbotを実行し、SSL/TLS証明書をnginxへ適用します。

```
sudo certbot --nginx
```
詳しくは公式ドキュメントに書かれています。(以下はUbuntu 18.04かつnginx向け)
https://certbot.eff.org/lets-encrypt/ubuntubionic-nginx

実行を終えたら、nginxの設定ファイル(  `/etc/nginx/sites-available/default` )に公開鍵のパス情報が記載されていることを確認します。(便利で感動しました。)
ついでにHTTPのアクセスはHTTPSへリダイレクトするように変更します。

```
server {
        listen 80;
        listen [::]:80;
        server_name example.org;
        return 301 https://$host$request_uri;
}
server {
        root /var/www/html/example;

        index index.html index.htm;
        client_max_body_size 20M;
        server_name example.org;

        location / {
                index index.php index.html index.htm;
                try_files $uri $uri/ /index.php?$args;
        }

        # pass PHP scripts to FastCGI server
        location ~ [^/]\.php(/|$) {
                fastcgi_index index.php;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/run/php/php7.3-fpm.sock;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO $fastcgi_path_info;
        }

        location ~ /\.ht {
                deny all;
        }

    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl http2; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/example.org/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.org/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
```

# WordPressのインストール
WordPressの最新版をダウンロードし、nginxのrootディレクトリへ配置します。

```
wget https://ja.wordpress.org/latest-ja.tar.gz
tar -xzvf latest-ja.tar.gz 
```

あとは、WordPressのURLへアクセスしセットアップを行えば完了です。

# あとがき
慣れると2時間程度でできるとはいえ、毎回やるのはしんどいので自動化したいですね。
または最近流行のDockerでコンテナを立てればもっと楽にできそう。次回は別の方法で挑戦したいなと思いました。

WebARENA Indigoは ConoHa VPSと比べるとCPU性能は6~7割程度だったり、CPUが `Intel Xeon E312xx (Sandy Bridge)` だったりと若干不安ではありました。ただ、WordPressを動かす程度でしたら特に問題なく、私は満足しています。