WordPress構築 ①WordPressを立てる(DNSからSSLまで)

#Nginx #SSL #VPS #WordPress

すでに静的サイトを動かしているVPSに、勉強用のブログとしてWordPressを追加で立てた。
今回は blog.xxx.com のようにサブドメインを用意して動かす構成。

同じサーバーに2つのサイトを共存させるのは初めてだったので、その手順を整理しておく。

やりたかったこと

xxx.com         → 静的サイト(既存)
blog.xxx.com    → WordPress(今回追加)

1台のVPSの中で、ドメインごとに別々のサイトを動かす。

全体の流れ

やることを最初に並べておくと、こうなる。

  1. DNSにサブドメインのAレコードを追加
  2. データベース(MariaDB)とPHPの準備
  3. WordPress用のデータベース・ユーザーを作成
  4. WordPress本体を配置
  5. Nginxにサブドメイン用の設定を追加
  6. SSL証明書を発行してHTTPS化
  7. WordPressの初期設定

順番が大事で、特にSSLは「Nginxの設定ができてから」でないと取得できない。
理由は後述する。

1. DNSにサブドメインを追加

サブドメインを追加するといっても、やることはAレコードを1本足すだけだった。

エントリ名タイプデータ
blogAVPSのIPアドレス

ドメインを新規取得したときはネームサーバーの情報が世界中に伝わるのを待つ必要があって時間がかかったが、サブドメインの追加はレジストリへの登録が不要なので、浸透がずっと速かった。数分でIPが返ってくるようになった。

反映の確認はこれ。

dig blog.xxx.com

ANSWER SECTION にVPSのIPが出れば反映完了。

2. データベースとPHPの準備

WordPressはデータベースに記事を保存する。今回はMariaDBを使った。
MySQLでも動くが、Ubuntuの標準リポジトリと相性がよく軽いらしい。

sudo apt update
sudo apt install -y mariadb-server
sudo mysql_secure_installation

mysql_secure_installation は、匿名ユーザーの削除・テストDBの削除・リモートからのrootログイン禁止などをまとめてやってくれる初期セキュリティ設定。
聞かれた項目は基本的に削除・禁止する方向(Y)で答えた。

PHPはすでに入れてあったので、WordPressに必要なモジュールを追加した。

sudo apt install -y php8.3-mysql php8.3-xml php8.3-curl php8.3-gd php8.3-mbstring php8.3-zip php8.3-intl
sudo systemctl restart php8.3-fpm

php8.3-mysql がWordPressとデータベースをつなぐのに必須。

3. データベースとユーザーを作成

WordPress専用のデータベースと、それ専用のユーザーを作る。
rootを直接使わせず、専用ユーザーに必要な分だけ権限を渡すのがセキュリティの基本だと学んだ。

CREATE DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wp_user'@'localhost' IDENTIFIED BY '(強力なパスワード)';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wp_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

ここで「なるほど」と思ったのが2点。

文字コードを utf8mb4 にするのは、日本語や絵文字を正しく保存するため。
古い utf8 だと絵文字でエラーになることがあるらしい。

@'localhost' は「同じサーバー内からだけ接続できる」という指定。
外部からこのユーザーで入れないようにする意味がある。
そして付与する権限は wordpress.*、つまりこのデータベースだけ。他のデータベースには触れない。
これを「最小権限の原則」というそうだ。

4. WordPress本体を配置

ポートフォリオと混ざらないよう、ブログ専用のディレクトリを用意した。

sudo mkdir -p /var/www/blog
cd ~
wget https://ja.wordpress.org/latest-ja.tar.gz
tar -xzvf latest-ja.tar.gz
sudo cp -r wordpress/* /var/www/blog/

配置したら、所有者をWebサーバーの実行ユーザー(www-data)に変更する。

sudo chown -R www-data:www-data /var/www/blog
sudo find /var/www/blog -type d -exec chmod 755 {} \;
sudo find /var/www/blog -type f -exec chmod 644 {} \;

これをやらないと、WordPressがテーマの追加や画像のアップロード、自動更新でファイルを書き込めない。
「Webサーバーが扱うファイルは、Webサーバーのユーザーが所有する」という考え方。

5. Nginxにサブドメインの設定を追加

ここが今回の肝。
同じサーバーで2つのサイトを共存させる部分だ。
ブログ専用の設定ファイルを新しく作る。

server {
    listen 80;
    listen [::]:80;
    server_name blog.xxx.com;

    root /var/www/blog;
    index index.php index.html;

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

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    }

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

設定したら有効化して反映する。

sudo ln -s /etc/nginx/sites-available/blog /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

仕組みを理解できたポイントが2つあった。

ひとつは server_name。
Nginxはアクセスされたドメイン名を見て、どの設定ブロックで処理するかを振り分けている。
だから xxx.com 宛は静的サイトの設定へ、blog.xxx.com 宛はこのWordPressの設定へ、と同じサーバーの中で振り分けられる。

もうひとつは try_files $uri $uri/ /index.php?$args; の行。
これがWordPressのきれいなURLを実現している。
「実ファイルがあればそれを返し、なければ index.php に処理を渡す」という意味で、
WordPressが内部でURLを解釈してページを表示できるようになる。
Apacheの .htaccess がやっていることを、Nginxではこの一行で書くわけだ。

この時点で http://blog.xxx.com にアクセスすると、WordPressのセットアップ画面が出た。

6. SSLでHTTPS化

セットアップ画面が出たが、ここで先にSSL化をやっておく。
理由は、WordPressの初期設定でサイトのURLが記録されるから。
先に https:// にしておけば、最初から正しいURLでセットアップできて二度手間にならない。

sudo certbot --nginx -d blog.xxx.com

ここで理解したのが、SSL証明書はドメイン名ごとに必要だということ。
ポートフォリオ用に取った証明書は blog.hrn-i.com には使えない。
証明書は「このドメイン名が正当だと証明するもの」だから、名前が違えば別の証明書が必要。

そして証明書を取る順番にも理由がある。
certbotは発行前に「本当にこのドメインを管理しているか」を、実際にそのドメインへアクセスして確認する。
だからNginxの設定を先に作って、HTTPで応答できる状態にしてからでないと取得できない。
SSLを後回しの手順にしたのはこのためだった。

証明書の自動更新の仕組みは既存のものがそのまま使えて、新しく追加した証明書も一緒に更新される。
追加設定は不要だった。

sudo certbot renew --dry-run

で、既存サイトと今回のブログ、両方の証明書がシミュレーションされるのを確認できた。

7. WordPressの初期設定

https://blog.xxx.com でセットアップ画面を開き、控えておいたデータベース情報を入力する。

項目値
データベース名wordpress
ユーザー名wp_user
パスワード(3で設定したもの)
データベースのホストlocalhost
テーブル接頭辞wp_

接続できると、サイトのタイトルや管理者アカウントを決める画面になる。

ここで意識したことが2つある。管理者のユーザー名に admin は使わない。
WordPressへの不正ログイン攻撃は admin を狙うものが大半なので、推測されにくい文字列にするだけでかなり安全になる。そして、ログイン用のユーザー名と、記事に表示される名前(表示名)は別に設定できる。
ログインIDは秘密の文字列にして、表示名は読者に見せる名前にする、という二段構えにした。

もうひとつ、「検索エンジンがサイトをインデックスしないようにする」というチェックボックス。
構築中はインデックスしてほしくなかったのでチェックをいれて作業を進めた。
構築完了後の外し忘れに注意。

できあがった構成

1台のVPS(Ubuntu)
├ xxx.com        → 静的サイト(/var/www/html)
└ blog.xxx.com   → WordPress(/var/www/blog)
                     ├ MariaDB に記事を保存
                     ├ Nginx が server_name で振り分け
                     └ Let's Encrypt で HTTPS(自動更新)

やってみて分かったこと

1台のサーバーに複数のサイトを乗せるのは、最初は難しそうに感じたが、要は「Nginxがドメイン名で振り分ける」という一点を理解すれば見通しが立った。ディレクトリを分け、設定ファイルを分け、証明書をそれぞれ取る。やることは静的サイトのときの繰り返しが多くて、これまで学んだことがそのまま積み上がっている感覚があった。

特に、DNSのAレコード、ファイルの所有権、SSL証明書がドメインごとに必要なこと――この3つは別の作業でも出てきた考え方で、「一度理解したことが応用で効く」のを実感できたのが一番の収穫だった。

次はいよいよ、用意したデザインをWordPressのテーマに落とし込んでいく。