VPSサーバーに、Ubuntu 22.04 + Nginx + PHP8.1 + WordPress で環境構築をする。


# この記事について
[追記]
YouTubeにて実演してます(OSの選択から、独自ドメインのHTTPS化まで)。
[WordPress をVPSサーバー(Ubuntu)にNginxを用いて公開する方法。独自ドメイン + HTTPS化もするよ！](https://youtu.be/k__a8oD5anU "WordPress をVPSサーバー(Ubuntu)にNginxを用いて公開する方法。独自ドメイン + HTTPS化もするよ！")


VPSサーバーに、WordPressをインストールし公開することを目的とします。
この記事は、**2022年10月**のものです。


# 注意
あくまで、WordPressの公開を目的としており、細かい設定・カスタマイズはしていません。
・鍵認証はせず
・bashのまま
・その他の設定、カスタマイズはせず
・ローカルmacでは、zsh使ってます



# 環境
・さくらVPS
・Ubuntu22.04
・Nginx
・PHP8.1
・MySQL


## VPSにUbuntu22.04をインストール
さくらVPSの1Gメモリ、50G(SSD)プランを利用しています。

コントロールパネルから、**Ubuntu22.04**を選びインストールします。

さくらVPSの初期設定画面では、パケットフィルタを利用する/しないの選択肢があるのですが、ここでは、**パケットフィルタは利用しない**を選択しました。(あとで自分でファイアーウォールの設定を行います)

初期設定が終わり、Ubuntu22.04をインストールしたら、ログインできるか確認します。

ログイン名:ubuntu
```zsh
% ssh ubuntu@あなたのIPアドレス
```
パスワードが聞かれるので、初期設定できめたパスワードを入力してください。

## ユーザー作成
**user01**というユーザーを作成します。
・ubuntuのパスワード
・作成したユーザーのパスワード(ここではuser01)
・パスワードをもう一度
・Full Name [] ~は空白でおk
```bash
$ sudo adduser user01
[sudo] password for ubuntu:
Adding user `user01' ...
Adding new group `user01' (1001) ...
Adding new user `user01' (1001) with group `user01' ...
Creating home directory `/home/user01' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for user01
Enter the new value, or press ENTER for the default
	Full Name []:
	Room Number []:
	Work Phone []:
	Home Phone []:
	Other []:
Is the information correct? [Y/n] y
```

作成したユーザーに、sudo権限をもたせます。
```bash
$ sudo usermod -aG sudo user01
```

一旦、ローカルから作成したユーザーでログインできるか確認します。
```zsh
% ssh user01@あなたのIPアドレス
```
ログインできたら成功です。

sudoコマンドを打つたびにパスワードが聞かれるのが嫌なので、パスワード入力を省く設定をします。（自己責任でお願いします）
```bash
$ sudo visudo

末尾に、
user01 ALL=NOPASSWD: ALL
```


ubuntuでログインできないようにします。アカウントをロックします。
```bash
$ sudo passwd -l ubuntu
passwd: password expiry information changed.
```

ubuntuでログインできなくなったら成功です。ローカルから再度接続を試みます。
```zsh
% ssh ubuntu@あなたのIPアドレス
```
パスワードを入力しても、ログインできなかったら成功です。
再度作成したユーザー（user01）でログインし直してください。
```
% ssh user01@あなたのIPアドレス
```
## アップデート&アップグレード

パッケージの更新およびアップグレード。
```bash
$ sudo apt update -y
$ sudo apt upgrade -y
```
再起動し、再ログイン
```
$ sudo reboot

(ローカルから)
% ssh user01@あなたのIPアドレス
```

## sshの設定

sshの設定を変更します。

```
$ sudo vim /etc/ssh/sshd_config
```
・ポート番号の変更。register port の1024～49151番を避け、49152番～65535番から選びます。ここでは、57654としています。
・空パスワード禁止
・ルートログイン禁止


```csharp:/etc/ssh/sshd_config
#Port 22
↓
Port 57654

#PermitEmptyPasswords no
↓
PermitEmptyPasswords no

#PermitRootLogin prohibit-password
↓
PermitRootLogin no

```
sshの設定ファイルの文法チェック。
```
$ sudo sshd -t
$ sudo systemctl restart sshd
```

## ファイアウォールの設定
インストールします。
```
$ sudo apt install ufw
```
起動します
```
$ sudo ufw enable
```
ステータスの確認。status: **active** になっているか確認してください。
```
$ sudo ufw status
Status: active
To     Action      From
--     ------      ----
~
```
ssh設定ファイルで、設定したポートを開けます。
```
$ sudo ufw allow 57654
```
statusが以下のようになればおkです。
```
$ sudo ufw status                             
Status: active                                                               

To                         Action      From                                  
--                         ------      ----                                  
57654                      ALLOW       Anywhere                              
57654 (v6)                 ALLOW       Anywhere (v6)
```

ローカルからssh接続し、57654番で接続できるか確認します。ログインに失敗し、再ログインできなくなると困るので、ターミナルの別タブから試してください。
```
% ssh -p 57654 user01@あなたのIPアドレス
```
もし、失敗したらsshの設定ファイルかファイアウォールの設定ミスの可能性があります。

ファイアウォールが、22番ポートを開いていたら閉じます。
```
$ sudo ufw delete allow 22
```
この時点で開いているポートは、**57654番だけ**です。

## Nginxの導入
Webサーバーは、Nginxを使用します。
Nginxのインストール
```
$ sudo apt install nginx -y
```
起動
```
$ sudo systemctl start nginx
```
VPS再起動後も自動で起動させる
```
$ sudo systemctl enable nginx
Synchronizing state of nginx.service with SysV service script with /lib/systemd/systemd-sysv-install.
```

Nginxのルートディレクトリの確認
```
$ grep "root /" -r /etc/nginx/
/etc/nginx/sites-available/default:	root /var/www/html;
/etc/nginx/sites-available/default:#	root /var/www/example.com;
```
Nginxで使用する80番ポートを開ける。
```
$ sudo ufw allow 'Nginx HTTP'
```
**Nginx HTTP**と指定していますが、**80**でも大丈夫です。

Webブラウザで自分のIPアドレスにアクセスし、「Welcome to nginx!」が表示されれば成功です。

もし、さくらVPSを使用し、パケットフィルターを利用しているなら、うまく表示されない可能性があるのでパケットフィルタをオフにしてください。


## PHPの設定
phpのインストール
```
$ sudo apt install php -y
```
ubuntu22.04を使用している場合は、PHP8.*系が使われると思います。
ubuntu20.04なら、PHP7.4だったと思います。

phpのアプリケーションサーバーのインストール
```
$ sudo apt install php-fpm -y
```

php-mysqlのインストール
```
$ sudo apt install php-mysql -y
```

2022/10月現在では、**php8.1**がインストールされています。

phpの設定ファイルを変更
```
$ sudo vim /etc/php/8.1/fpm/php.ini
```
もし、versionがphp8.2になっているなら、
/etc/php/8.2/fpm/php.ini
などと変更してください。


#### ファイルのアップロードのサイズの上限を変更
```csharp:/etc/php/8.1/fpm/php.ini
upload_max_filesize = 2M
↓
upload_max_filesize = 128M

post_max_size = 8M
↓
post_max_size = 128M
```

#### apache2を削除
phpをインストールしたときに、自動でapache2がインストールされています。

今回は、Nginxを使用しますので、apache2は削除します。
```
$ sudo apt remove apache2 -y
$ sudo apt purge apache2 -y
$ sudo rm -rf /etc/apache2
```

Nginxを再起動
```
$ sudo systemctl restart nginx
```

## Nginxの設定(WordPress用)
wordpressファイルを置くルートディレクトリは、**/var/www/wordpress**　とします。

シンボリックリンクの設定(/**wordpress**は、Nginxの設定ファイル)
```
$ sudo ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/
```

```
$ sudo vim /etc/nginx/sites-available/wordpress
```
以下のserver情報を書き込みます。
```csharp:/etc/nginx/sites-available/wordpress
server {
   listen 80;
   listen [::]:80;

   server_name あなたのIPアドレス;

   root /var/www/wordpress;
   index index.php;

   location / {
       try_files $uri $uri/ =404;
   }

   location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/run/php/php8.1-fpm.sock;
   }
}
```
もし、phpのバージョンが違う場合は、fastcgi_pass unix:/run/php/**php8.***-fpm.sock;
のように適時変更してください。


#### phpの動作確認
wordpress フォルダを作成
```
$ sudo mkdir /var/www/wordpress
```
info.phpを作成
```
$ sudo vim /var/www/wordpress/info.php
```

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

Nginxを再起動させます。
```
$ sudo systemctl restart nginx
```

実際に、webブラウザで**あなたのIPアドレス/info.php**でphpのinfoページが表示されるか確認します。

```
http://あなたのIPアドレス/info.php
```


Apache2の削除・Nginxの再起動直後は、うまく表示できない可能性があります。(**あなたのIPアドレス**にアクセスしたら、Apache2が表示される)
この場合は、しばらく時間をおいたり、ブラウザで再読み込み（キャッシュ削除）、サーバーの再起動など試してください。

## MySQLの設定
インストール
```
$ sudo apt install mysql-server mysql-client -y
```
mysqlに接続
```
$ sudo mysql -u root -p
Enter password:
```
上で聞かれているpasswordは、任意でおkと思います。
そのままenter(空)でもいけました。


DB、ユーザー名、パスワード作成およびユーザーに権限付与。
```
CREATE DATABASE データベース名 CHARACTER SET UTF8 COLLATE UTF8_BIN;
CREATE USER 'ユーザー名'@'localhost' IDENTIFIED BY 'パスワード';
GRANT ALL ON wordpress.* to 'ユーザー名'@'localhost';
```
もし、
DB: wordpress
ユーザー名: user01
パスワード password
だった場合は以下になります。
```
mysql> CREATE DATABASE wordpress CHARACTER SET UTF8 COLLATE UTF8_BIN;
Query OK, 1 row affected, 2 warnings (0.01 sec)

mysql> CREATE USER 'user01'@'localhost' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.02 sec)

mysql> GRANT ALL ON wordpress.* to 'user01'@'localhost';
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye
```

## wordpressの導入
先程作った/var/www/内のwordpressフォルダ(仮)を一旦削除します。
あとで、wordpressフォルダを/var/www/にダウンロードするためです。
```
$ sudo rm -rf /var/www/wordpress
```
wordpressをwgetでダウンロードします。
まずは、wgetをインストールします。
```
$ sudo apt install wget 
```
現在地の移動
```
$ cd /var/www/
```

wordpressのダウンロード
```
$ sudo wget https://ja.wordpress.org/latest-ja.tar.gz
```
ダウンロードしたパッケージを解凍
```
$ sudo tar -xzvf latest-ja.tar.gz
```
wordpressの設定は、[wordpress.org](https://ja.wordpress.org/support/article/how-to-install-wordpress/ "wordpress.org")を参考にしました。

wordpressフォルダに移動
```
$ cd /var/www/wordpress/
```
wordpress.orgより引用
> wp-config-sample.php のファイル名を wp-config.php に変更し、wp-config.php ファイルの編集に従ってデータベースの情報を追加。

とありますので、wp-config-sample.php のファイル名を wp-config.php と変更します。
```
$ sudo mv wp-config-sample.php wp-config.php
```
さらに、このファイルを編集します。
```
$ sudo vim /var/www/wordpress/wp-config.php
```
データベース名、ユーザー名、パスワードを自分が設定したものに書き換えてください。
```csharp:/var/www/wordpress/wp-config.php
// ** データベース設定 - この情報はホスティング先から入手してください。 ** //
/** WordPress のためのデータベース名 */
define( 'DB_NAME', 'データベース名' );

/** データベースのユーザー名 */
define( 'DB_USER', 'ユーザー名' );

/** データベースのパスワード */
define( 'DB_PASSWORD', 'パスワード' );

/** データベースのホスト名 */
define( 'DB_HOST', 'localhost' );

/** データベースのテーブルを作成する際のデータベースの文字セット */
define( 'DB_CHARSET', 'utf8' );

/** データベースの照合順序 (ほとんどの場合変更する必要はありません) */
define( 'DB_COLLATE', '' );
```
もし、
DB: wordpress
ユーザー名: user01
パスワード password
に設定した場合は以下になります。

```csharp:/var/www/wordpress/wp-config.php
// ** データベース設定 - この情報はホスティング先から入手してください。 ** //
/** WordPress のためのデータベース名 */
define( 'DB_NAME', 'wordpress' );

/** データベースのユーザー名 */
define( 'DB_USER', 'user01' );

/** データベースのパスワード */
define( 'DB_PASSWORD', 'password' );

/** データベースのホスト名 */
define( 'DB_HOST', 'localhost' );

/** データベースのテーブルを作成する際のデータベースの文字セット */
define( 'DB_CHARSET', 'utf8' );

/** データベースの照合順序 (ほとんどの場合変更する必要はありません) */
define( 'DB_COLLATE', '' );

```

wordpressフォルダの所有権を書き換える。
```
$ sudo chown -R www-data:www-data /var/www/wordpress
```
この所有権の変更をしていないと、wordpressのダッシュボードで、以下のように表示されます。
![Screenshot 2022-09-07 9.56.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2803326/3f1949e4-5552-abf1-bda7-bc391d5b76d1.png)
このFTPの認証情報の入力は、wordpressフォルダの所有権を**www-data**に書き換えることで回避できます。

Nginxの再起動
```
$ sudo systemctl restart nginx
```
```
http://あなたのIPアドレス/
```

IPアドレスにWebブラウザからアクセスしたら、WordPressの設定画面が表示されます。

![Screenshot 2022-10-25 8.19.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2803326/48895db1-83a4-f9c8-38d1-d6878e8f15ee.png)


もし、**データベース接続確立エラー** と表示されたなら、MYSQLで作成したユーザー名、パスワード、データベース名と、wp-config.phpに書かれているユーザー名、パスワード、データベース名が違う可能性があります。

必要事項を入力し**WordPressをインストール**します。

先程、設定した**ユーザー名**と**パスワード**を入力しログインします。

## サイトヘルスステータスを良好にする。
ダッシュボードのトップ画面にサイトヘルスステータスを表示してあります。


![Screenshot 2022-10-25 9.46.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2803326/c04bab30-9f0c-9db5-5543-2e0c697b8c58.png)

**サイトヘルス画面にアクセス**へ進んでください。

![Screenshot 2022-10-25 8.21.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2803326/81a78e86-4afc-6d25-791a-2a818334f338.png)

**1つ以上の推奨モジュールが存在しません**と表示されています。まずここを改善させます。


![Screenshot 2022-10-25 8.22.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2803326/0d62deb0-accb-9c66-d6d8-823477088c3e.png)

上の画像の警告は、以下のモジュールをインストールさせればおkです。
```
$ sudo apt install php-curl -y
$ sudo apt install php-dom -y
$ sudo apt install php-imagick
$ sudo apt install php-gd -y
```
サイトヘルスが良好になったと思います。

しかし、**1つ以上の推奨モジュールが存在しません**とありますので、これも改善していきます。
![Screenshot 2022-10-25 8.28.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2803326/33921fe9-ef6e-3786-fd48-dfaf6e19b44f.png)


```
$ sudo apt install php-mbstring -y
$ sudo apt install php-zip -y
$ sudo apt install php-intl -y
```

![Screenshot 2022-10-25 8.33.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2803326/748cfb1e-81c2-e645-16d5-8d1eed79c213.png)

これで必要なモジュールをインストールでき、サイトヘルスも良好になってると思います。

一旦ここで終了したいと思います。

後日、独自ドメインの設定とhttps化を続編を考えています。

最後までありがとうございましたm(_ _)m