Ubuntu on UTMにWordPressの検証環境を作成する

# はじめに
[こちらの記事](https://qiita.com/matz1ppei/items/d2a41972327be41523bd)でUbuntuの初期設定まで行いました。せっかくなのでWordPressのメンテナンス用に検証環境を作成します。

# 環境
- ゲストOS：Ubuntu 24.04.1 LTS
- Nginx：1.24.0
- MariaDB：10.11.8
- PHP：8.3.6
- WordPress：6.6.2


# 手順
## 1. Nginxのインストール
Nginxをインストールし、サービスを起動して自動起動を有効にします。
```bash
# Nginxをインストールする
sudo apt install nginx -y

# サービスを起動する
sudo systemctl start nginx

# 自動起動を有効にする
sudo systemctl enable nginx
```

:::note warn
UFWを使用している場合、ポートを確認してください。
```bash
sudo ufw verbose
```
ポートが許可されていない場合は80と443を許可してください。
```bash
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload
```
:::

### 
UTM上のUbuntuに接続するため**ホスト側の/etc/hosts**にテスト用の設定を入れてください。
※接続先のIPを確認するには[こちら](https://qiita.com/matz1ppei/items/d2a41972327be41523bd#ssh%E8%A8%AD%E5%AE%9A)を参考にしてください。
```diff
+ 192.168.64.13 example.local
```

Nginxの仮想ホスト設定を作成します。
```bash
sudo vi /etc/nginx/sites-available/example.local.conf
```

以下の内容を記載します。（PHPのバージョンに注意してください）
```
server {
    listen 80;
    server_name example.local www.example.local;

    root /var/www/example.local;
    index index.php index.html index.htm;

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

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

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

シンボリックリンクを作成して有効にします。
```bash
# シンボリックリンクの作成
sudo ln -s /etc/nginx/sites-available/example.local.conf /etc/nginx/sites-enabled/

# Nginxの設定テスト
sudo nginx -t

# サービスの再読み込み
sudo systemctl reload nginx
```


## MariaDBのインストール
MariaDBをインストールし、セキュリティ設定を行います。
```bash
# MariaDBをインストールする
sudo apt install mariadb-server -y

# サービスを起動する
sudo systemctl start mariadb

# 自動起動設定を有効にする
sudo systemctl enable mariadb

# セキュリティ設定
sudo mysql_secure_installation
```

設定に関して質問されますのでそれぞれ回答してください。（参考までに自分の設定内容を記載しておきます）
```
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

注意: MariaDBサーバーを本番環境で使用する際には、このスクリプトのすべての部分を実行することが推奨されます！
各手順をよく読んでください！


In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.

MariaDBにログインしてセキュリティ設定を行うためには、rootユーザーの現在のパスワードが必要です。
もし、MariaDBをインストールしたばかりで、rootのパスワードをまだ設定していない場合は、ここでEnterキーを押してください。


Enter current password for root (enter for none):[ENTER]

rootの現在のパスワードを入力してください（設定していない場合はEnterキーを押してください）:

OK, successfully used password, moving on...


Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.

rootパスワードを設定するか、unix_socketを使用することで、適切な認証なしにMariaDBのrootユーザーにログインできないようにします。


You already have your root account protected, so you can safely answer 'n'.

すでにrootアカウントは保護されているため、「n」と答えても安全です。


Switch to unix_socket authentication [Y/n] n

unix_socket認証に切り替えますか？ [Y/n]

 ... skipping.


You already have your root account protected, so you can safely answer 'n'.

すでにrootアカウントは保護されているため、「n」と答えても安全です。


Change the root password? [Y/n] Y

rootパスワードを変更しますか？ [Y/n]


New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

デフォルトでは、MariaDBインストール時に匿名ユーザーが存在します。
これにより、ユーザーアカウントを作成せずに誰でもMariaDBにログインできるようになっています。
これはテスト目的のみであり、インストールを少しスムーズにするためのものです。
本番環境に移行する前に、これらを削除する必要があります。


Remove anonymous users? [Y/n] Y

匿名ユーザーを削除しますか？ [Y/n]

 ... Success!


Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

通常、rootは「localhost」からのみ接続できるようにすべきです。これにより、ネットワーク経由で誰かがrootパスワードを推測することを防ぎます。


Disallow root login remotely? [Y/n] Y

rootのリモートログインを無効にしますか？ [Y/n]

 ... Success!


By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

デフォルトでは、MariaDBには誰でもアクセスできる「test」という名前のデータベースが含まれています。これもテスト目的のみであり、本番環境に移行する前に削除する必要があります。


Remove test database and access to it? [Y/n] Y

テストデータベースとそのアクセス権を削除しますか？ [Y/n]

 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!


Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

権限テーブルを再読み込みすることで、これまでに行ったすべての変更が即座に反映されます。


Reload privilege tables now? [Y/n] Y

権限テーブルを今すぐ再読み込みしますか？ [Y/n]

 ... Success!

Cleaning up...


All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

すべて完了しました！ もし上記のすべての手順を完了していれば、MariaDBのインストールは安全になっているはずです。


Thanks for using MariaDB!
```

WordPress用にデータベースとユーザを作成します。
```bash
sudo mysql -u root -p
```

データベース名やユーザー名、パスワードに関しては使用するものに変更してください。
```sql
CREATE DATABASE examplelocal;
CREATE USER 'wpuser'@'localhost' IDENTIFIED BY '<YOUR PASSWORD>';
GRANT ALL PRIVILEGES ON examplelocal.* TO 'wpuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;
```

ユーザが正常に作成されたか確認を行います。
```bash
sudo mysql -u wpuser -p
```

## PHPのインストール
PHPと関連するモジュールをインストールします。
```bash
sudo apt install php-fpm php-mysql php-xml php-mbstring php-curl php-zip php-gd -y
```
### phpMyAdminのインストール
phpMyAdminをインストールしシンボリックリンクを作成します。
```bash
sudo apt install phpmyadmin
sudo ln -s /usr/share/phpmyadmin /var/www/example.local/phpmyadmin
```

`/etc/nginx/sites-available/example.local.conf`を編集します。
```
sudo vi /etc/nginx/sites-available/example.local.conf
```

編集内容
```diff
+    # phpMyAdminの設定
+    location /phpmyadmin {
+        root /var/www/example.local;
+        index index.php;
+    }

+    location ~ ^/phpmyadmin/(.+\.php)$ {
+        root /var/www/example.local;
+        fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
+        include snippets/fastcgi-php.conf;
+        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
+    }

+    location ~* ^/phpmyadmin/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ {
+        root /usr/share;
+    }

+    # 画像や静的ファイルのキャッシュ設定（任意）
+    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
+        expires 30d;
+    }
```

Nginxの設定ファイルを再読み込みします
```bash
sudo systemctl reload nginx
```


## WordPressのインストール
```bash
cd /tmp

# WordPressの最新版をダウンロード
curl -O https://wordpress.org/latest.tar.gz

# ダウンロードしたファイルの解凍
tar xzvf latest.tar.gz

# 実際のアクセスパスに配置
sudo mv wordpress/* /var/www/example.local/

# 権限設定
sudo chown -R www-data:www-data /var/www/example.local
sudo chmod -R 755 /var/www/example.local
```

### WordPressの初期設定
ホスト側でブラウザを立ち上げて以下のURLにアクセスすると初期設定が始まりますので、後はご自分の本番環境に合わせて設定してみてください。

`http://example.local/wp-login.php`