WordPressをDockerで環境構築する方法【(擬似)マルチサイト対応】

Docker

Dockerとは

Dockerとは、アプリケーションの開発や運用を容易にするためのコンテナ型の仮想化技術です。アプリケーションやミドルウェアなどの実行環境を一つにまとめたコンテナを用意し、コンテナ管理ソフトウェア上で稼働させることで利用OSに依存しないアプリケーション実行環境を構築することができます。

コンテナのイメージ

DockerでWordpressの環境を構築するメリット

DockerでWordpressの環境を構築するメリットとしては以下が挙げられます。

  • ローカルとサーバ上で同じ動作が保証されるので、ローカル(テスト)環境での検証が容易になる
  • 失敗してもコンテナ外には影響を及ぼさないので何度も試行錯誤できる
  • 一つのコンテナ内に依存関係をまとめて管理できるので、環境やアプリケーションの互換性による不具合を回避することができ、運用が安定する
  • 必要に応じてバックエンドサーバやリバースプロキシを設置するなど柔軟にシステムを変更することができる

WordPressのマルチサイトとは

WordPressマルチサイトとはサーバにインストールした1つのWordPress上で複数のサイトを制作・運用することです。通常は1つのサイトごとにWordPressをインストールする必要がありますが、マルチサイト機能を導入することで1つのドメインで複数のサイトを構築することが可能になります。

しかし、マルチサイトには以下のようなデメリットがあります。

  • テーマやプラグインによってはマルチサイトに未対応のものがある。
  • 1つのWordpressアプリケーション上に複数サイトを構築するため、ある1つのエラーが複数サイトに影響を及ぼす恐れがある。
  • マルチサイトに対応しているレンタルサーバを選ぶ必要がある。

そこで今回はDockerを用いて擬似的なマルチサイト環境を構築していきたいと思います。

システム構成

今回構築するシステムの構成

上図は今回構築するシステムの概略図です。各コンテナの役割は以下の通りです。

  • https-poral:自動で通信をHTTPS化する(HTTPSサーバを自動構築するDockerコンテナ)
  • nginx:https-portalからの通信を受け取り、ドメイン・ポートで宛先を振り分ける
  • wordpress_A:https://A.example.comの宛先サーバ
  • wordpress_B:https://B.example.comの宛先サーバ
  • mysql_A:wordpress_Aコンテナで使用するDBサーバ
  • mysql_B:wordpress_Bコンテナで使用するDBサーバ

WordPressのマルチサイト機能を使用する場合に比べて、今回のシステムは二つのWordpressサーバが論理的に分割されているのでバックアップが容易になったり、障害を切り分けることができるなどのメリットがあります。

コード

今回のシステムはDocker Composeを用いて作成していきます。

Docker Composeとは複数のDockerコンテナを定義、実行するサービスでコンテナ間通信など、複数コンテナを協調して稼働させたい場合に使用します。

以下のようにファイル・ディレクトリを用意してください

wordpress/
 ├ nginx/
 │ └ nginx.conf
 │ └ conf.d/
 │   └ wordpress_A.conf
 │    └ wordpress_B.conf
 └ docker-compose.yml

docker-compose.yml

version: '3'
services:

  https-portal:
    image: steveltn/https-portal:1
    ports:
      - 80:80
      - 443:443
    depends_on:
      - nginx
    restart: always
    volumes:
      - ./certs:/var/lib/https-portal
    environment:
# 本番運用の際はコメントアウトを外します
      #STAGE: 'production'
      DOMAINS: >-
        A.example.com -> http://nginx:8880,
        B.example.com -> http://nginx:8881,
      WORKER_PROCESSES: auto
      WORKER_CONNECTIONS: 2048
      CLIENT_MAX_BODY_SIZE: 128M

  nginx:
    image: nginx:stable 
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/log:/var/log/nginx
      - ./nginx/www:/var/www
    ports:
       - "8880:8880"
       - "8881:8881"
    depends_on:
      - wordpress_A
      - wordpress_B
    restart: always

  mysql_A:
    image: mysql:5.7
    volumes:
      - data_A:/var/lib/mysql
    ports:
      - "9990:3306"
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress

  wordpress_A:
    depends_on:
      - mysql_A
    image: wordpress:latest
    volumes:
      - ./html_A:/var/www/html # マウントするディレクトリを指定
    restart: always
    environment:
      WORDPRESS_DB_HOST: mysql_A:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress


  mysql_B:
    image: mysql:5.7
    volumes:
      - data_B:/var/lib/mysql
    ports:
      - "9991:3306"
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress

  wordpress_B:
    depends_on:
      - mysql_B
    image: wordpress:latest
    volumes:
      - ./html_B:/var/www/html 
    restart: always
    environment:
      WORDPRESS_DB_HOST: mysql_B:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress

volumes:
  data_A:
  data_B:

wordpress_A.conf

server {
        listen 8881;
        server_name A.example.com;

        location / {
                proxy_pass http://wordpress_A/;
                proxy_redirect          off;

                # リクエストヘッダーの情報を下位のサービスに伝える
                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_connect_timeout   10;
                proxy_send_timeout      10;
                proxy_read_timeout      60;

                # 画像や動画をアップロードへの対応
                client_body_buffer_size 128M;
                client_max_body_size    128M;
                proxy_buffer_size       32K;
                proxy_buffers           50 32K;
                proxy_busy_buffers_size 64K;
        }
}

wordpress_B.conf

server {
        listen 8882;
        server_name B.example.com;

        location / {
                proxy_pass http://wordpress_B/;
                proxy_redirect          off;

                # リクエストヘッダーの情報を下位のサービスに伝える
                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_connect_timeout   10;
                proxy_send_timeout      10;
                proxy_read_timeout      60;

                # 画像や動画をアップロードへの対応
                client_body_buffer_size 128M;
                client_max_body_size    128M;
                proxy_buffer_size       32K;
                proxy_buffers           50 32K;
                proxy_busy_buffers_size 64K;
        }
}

特にdocker-compose.ymlのCLIENT_MAX_BODY_SIZE、wordpress_A.conf・wordpress_B.confのclient_body_buffer_size,client_max_body_sizeには注意してください。

小さすぎる値を指定すると、テーマやプラグインを追加できなくなる恐れがあるので余裕を持って値を設定するのが良いかと思います。

実行(運用)

実行するには用意したwordpressディレクトリにて以下を実行します。

$ docker compose up -d

これでhttps://A.example.netやhttps://B.example.netで該当Wordpressにアクセスできるようになったはずです。

終わりに

以上、Dockerを用いてマルチサイトなWordpress環境を構築する手順のご説明でした。

少々複雑かもしれませんが前出の図を参照しながらコードをご覧いただければ幸いです。

ご清覧ありがとうございました。

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