【個人開発】低スペックVPSでも安心!Docker + NginxでWordPressを立ち上げる方法

こんにちは、skkです。
今回のテーマは、今更ながらWordPressです。

今回は、メモリ1GB程度の軽量VPSでも安定して動作させるための設定から、Docker Composeによる構築、Nginxでのリバースプロキシ設定、そしてSSL化(HTTPS)までを一気に解説します。

事前に以下を準備する必要があります。
・VPSサーバ(Nginxインストール済であること)
・独自ドメイン

1. メモリ不足対策:スワップ領域の作成

今回使用しているVPSは、以前から使用しているAPIサーバと同一のサーバです。

プランは最小のプランなので、初期状態のVPSではメモリが不足し、DBが落ちることがあります。まずは1GBのスワップ領域を確保しておきます。

# 1GBのファイルを作成してスワップとして登録
sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# 再起動後も有効にする設定
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

# 確認(Swap領域があることを確認)
free -m

                 total        used        free      shared  buff/cache   available
Mem:             957         348         217          13         391         434
Swap:           1023           0        1023

2. Docker / Docker Compose のインストール

APIサーバとしても使用しているため、環境に影響を与えないためにDockerをインストールします。

# パッケージ更新
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg

# 公式GPG鍵の追加とリポジトリ登録
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update

# インストール
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

3. WordPressの環境構築(Docker Compose)

次に、WordPressとデータベース(MariaDB)の構成を定義します。
まずは、作業ディレクトリ(~/wordpress)を作成します。

mkdir -p ~/wordpress/html ~/wordpress/db
cd ~/wordpress

次にdocker-compose.yamlファイルを作成します。
サーバ自体のメモリが少ないので、deploy.resources.limits でメモリ使用量を制限し、DBのバッファサイズも節約設定にしているところがポイントです。

services:
  db:
    image: mariadb:10.6
    container_name: wp-db
    restart: always
    volumes:
      - ./db:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: your_root_password
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wp_user
      MYSQL_PASSWORD: wp_password
    deploy:
      resources:
        limits:
          memory: 256M
    command: 
      - --innodb_buffer_pool_size=128M

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    container_name: wp-app
    restart: always
    ports:
      - "8080:80"
    volumes:
      - ./html:/var/www/html
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wp_user
      WORDPRESS_DB_PASSWORD: wp_password
      WORDPRESS_DB_NAME: wordpress
    deploy:
      resources:
        limits:
          memory: 256M

コンテナ起動

sudo docker compose up -d

この時点で http://[サーバIP]:8080 でアクセス可能になりますが、SSL化が終わるまでは落としておきましょう。

4. NginxによるリバースプロキシとSSL化

独自ドメインでアクセスできるようにし、Let’s EncryptでSSL化します。

Nginx設定ファイルの作成 /etc/nginx/sites-available/wordpress を作成し、以下の内容を記述します。

server {
    listen 80;
    server_name your-domain;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        client_max_body_size 64M;
    }
}

設定の反映とSSL証明書の取得

# シンボリックリンク作成とテスト
sudo ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

# CertbotでSSL化
sudo apt install python3-certbot-nginx -y
sudo certbot --nginx -d your-domain

5. WordPressの初期設定とセキュリティ

無事に https://your-domainでアクセスできたら、管理画面から以下の設定を行います。

  1. URL確認: [設定] > [一般] でURLが https になっているか確認。
  2. 管理画面URLの変更: プラグイン WPS Hide Login を導入し、/wp-admin を独自のURLに変更(wp-adminはwordpressのデフォルトの管理URLであり攻撃対象になるため。変更後のURLを必ずブックマークに登録しておいてください)。
  3. 高速化: WP Super Cache を導入し、キャッシングを有効化。
  4. 不要プラグインの削除: 初期状態の Hello Dolly 等は削除。

プラグインをインストールしすぎると、容量を食うので最小限にしています。

まとめ

今回の構成により、メモリを抑えつつセキュアで高速なWordPress環境が整いました。Dockerを使っているため、別のサーバへの引っ越しもディレクトリごと移動するだけで簡単です。

また、料金は449円/月+独自ドメイン1300円くらい(ドメインによって異なります)です。

では、また。

コメント

タイトルとURLをコピーしました