GNU/Linux >> Linux の 問題 >  >> Linux

Dockerを使用して同じサーバー上で複数のWordPressサイトをセルフホストする方法

WordPressのインストールは大したことではありません。ローカル開発用のLAMPサーバーを使用してインストールできます。現実の世界に向けて、適切な公開されているLinuxサーバーにデプロイすることもできます。

Linode、DigitalOceanなどのクラウドサーバーには、WordPressで事前構成された新しいLinuxサーバーをデプロイするオプションもあります。さらに簡単ですよね?

しかし、単一のサーバーに複数のWordPressをインストールしたい場合はどうでしょうか。

簡単な方法は、ServerPilotのようなサービスを使用することです。サーバーを自動的に更新するだけでなく、同じサーバーに複数のWordPressインスタンスを簡単にデプロイできます。

それにはもう少しお金がかかります。それが望ましくない場合は、Dockerを使用して複数のWordPressインスタンスをデプロイできます。

このガイドでは、個々のコンテナから実行されるデュアルWordPressセットアップを簡単にセットアップし、インスタンスを追加する方法を学びます!

前提条件

必須ではありませんが、次の場合はチュートリアルを簡単に実行できます。

  • 基本的なLinuxコマンドの知識
  • Dockerに関するある程度の知識
  • DockerComposeの理解

SSLが有効なドメインとサブドメインを使用して、リバースプロキシコンテナの背後にWordPressをデプロイします。

前述のトピックに関する知識とは別に、次のインフラストラクチャ要件が必要になります。

  • 一般向けのUbuntuLinuxサーバー 。 Linodeのようなクラウドサービスプロバイダーを使用できます。この展開には、1GBのRAMを備えたNanoサーバーで十分です。ただし、より多くのWordPressインスタンスをセルフホストする予定がある場合は、アップグレードを検討してください。
  • ドメイン/サブドメインとそのDNS設定へのアクセス
  • LinuxサーバーにインストールされているDockerとDockerCompose。

ヘルプが必要な場合は、次のガイドに従うことができます:

  • UbuntuへのDockerのインストール
  • UbuntuにDockercomposeをインストールする
  • リバースプロキシDockerのセットアップ

Dockerを使用したセルフホスティングWebアプリケーションに基づく他のすべてのチュートリアルでは、NginxコンテナーとWebAppコンテナーを別々にデプロイすることについて説明しました。ただし、今回はDocker Composeを使用して、すべて1つのymlファイルに基づいて複数のWordPressコンテナーを設定します。

したがって、これは、単一のDockerComposeファイルを介してNginx構成をデプロイを検討しているWebアプリと統合する方法を示す例でもあります。

domain.comを使用します 最初のWordPressブログとwordpress.domain.comの例として 2番目の自己ホスト型ブログとして。最後に、ここで説明する構成に基づいてWordPressインスタンスを追加する方法についても説明します。

すべてのWordPress関連サービスの作業ディレクトリを設定します

ディレクトリを作成してアクティブにします。それをmulti-wordpressと呼びましょう 。

mkdir multi-wordpress

次に、cdコマンドを使用してこの新しく作成されたディレクトリに切り替えます。

cd multi-wordpress

WordPressファイルのアップロード制限を512MBに設定

このディレクトリ内に、 uploads.iniを保存します 最大512MBのサイズのファイルをアップロードするために必要なアップロード構成を持つファイル。ターミナルで次のコマンドを入力します:

[email protected]:~/multi-wordpress$ printf "file_uploads = On\nmemory_limit = 512M\nupload_max_filesize = 512M\npost_max_size = 512M\nmax_execution_time = 600" > uploads.ini

Nginxのファイルアップロード制限を設定します

追加の手段として、client_max_upload_size.confというファイルも作成します。 Nginxコンテナにマウントするために同じディレクトリに保存します。そのため、1GBに設定しました。これは、将来的に他のアプリを構成するのに役立ちます。

[email protected]:~/multi-wordpress$ printf "client_max_body_size 1G;" > client_max_upload_size.conf

Nginxを介したWWWリダイレクト(CNAMEの更新は不要)

WordPressでwwwからwwwへのリダイレクト以外を使用する場合は、Linuxサーバーでcatコマンドを使用してリダイレクターを設定できます。

[email protected]:~/multi-wordpress$ cat >> domain.com
rewrite ^/(.*)$ https://www.domain.com/$1 permanent;

Enterキーを押してから、Ctrl+Dを押して保存します。 printfは使用しませんでした ここでは$1 上記のようにファイルに保存されません。すべての場合にリダイレクトを機能させたいので、これはURLに関する将来の問題につながる可能性があります。例:domain.com/test 常にwww.domain.com/testにリダイレクトする必要があります 。

Nginxを介した非WWWリダイレクト(CNAMEの更新は不要)

wwwからwww以外のリダイレクトを使用する場合は、同様の手順を繰り返して反対の操作を行います。

[email protected]:~/multi-wordpress$ cat >> www.domain.com
rewrite ^/(.*)$ https://domain.com/$1 permanent;
外部Dockerネットワークを作成する

netというネットワークを使用します このチュートリアルでは。したがって、次のコマンドで作成します。

docker network create net
単一のDockerComposeファイルをデプロイの準備をします

単一のdocker-compose.yml内の次の構成 ファイルを使用すると、リバースプロキシから最後のWordPressコンテナまで、目的に合った6つのコンテナすべてを一度に設定できます。最終的にすべてを1つのファイルにマージする前に、サービスごとに見てみましょう。

Nginxリバースプロキシコンテナ

両方のファイルをマウントしますclient_max_upload_size.conf およびwww.domain.com 読み取り専用モードで、ネットワークnetを指定します 手動で作成されました。

  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - html:/usr/share/nginx/html
      - dhparam:/etc/nginx/dhparam
      - vhost:/etc/nginx/vhost.d
      - certs:/etc/nginx/certs:ro
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./client_max_upload_size.conf:/etc/nginx/conf.d/client_max_upload_size.conf:ro
      - ./www.domain.com:/etc/nginx/vhost.d/www.domain.com:ro
    labels:
      - "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy"
    restart: always
    networks:
      - net

SSL証明書用のコンテナを暗号化しましょう

rwを使用していることに注意してください certsの場合 roとは異なりボリューム 前のセクションで。これは、SSL証明書を作成し、生成時にボリュームを適宜更新するために不可欠です。また、Let's Encryptからの通知のデフォルトの電子メールを設定し、同じ「net」を指定します 」ネットワーク。

  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: lets-encrypt-proxy-companion
    depends_on:
      - "nginx-proxy"
    volumes:
      - certs:/etc/nginx/certs:rw
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      DEFAULT_EMAIL: [email protected]
    restart: always
    networks:
      - net
最初のWordPressサイトのデータベースコンテナ

公式のWordPressDockerCompose構成に基づいて、以下に示すように必要な環境変数を設定し、内部ネットワークを指定します(mysqldb0として表示)。 ここでは、サービス名とボリューム名にも使用されます)。

このネットワークは、データベースコンテナとそれに対応するWordPressコンテナにのみ表示されます。デプロイすると、次のような資格情報を使用してMySQLデータベースが作成されます。

  mysqldb0:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: db0
      MYSQL_USER: db0user
      MYSQL_PASSWORD: secret
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - 'mysqldb0:/var/lib/mysql'
    restart: always
    networks:
      - mysqldb0
最初のWordPressコンテナ

WordPressコンテナーをデプロイすると、前のセクションで指定したデータベース構成が使用されます。データベースから見たのと同じ内部ネットワークに加えて(mysqldb0 )、このWordPressサービスは、netと呼ばれるNginxネットワークも参照する必要があります 外の世界のためのフロントエンドアプリケーションだからです。

  wordpress0:
    image: wordpress:5.8.0-php8.0-apache
    environment:
      WORDPRESS_DB_HOST: mysqldb0
      WORDPRESS_DB_USER: db0user
      WORDPRESS_DB_PASSWORD: secret
      WORDPRESS_DB_NAME: db0
      WORDPRESS_CONFIG_EXTRA: |
        define('AUTOMATIC_UPDATER_DISABLED', true);
      VIRTUAL_HOST: domain.com,www.domain.com
      LETSENCRYPT_HOST: domain.com,www.domain.com
    volumes:
      - 'wordpress0:/var/www/html/wp-content'
      - './uploads.ini:/usr/local/etc/php/conf.d/uploads.ini'
    restart: always
    depends_on:
      - mysqldb0
    networks:
      - mysqldb0
      - net

この時点で、単一のWordPressインスタンスをセットアップするための構成ができています。さらに設定するには、手順3と4を新しい名前で複製します。

どうぞ:

2番目のWordPressサイトのデータベースコンテナ

  mysqldb1:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: db1
      MYSQL_USER: db1user
      MYSQL_PASSWORD: secret
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - 'mysqldb1:/var/lib/mysql'
    restart: always
    networks:
      - mysqldb1
2番目のWordPressコンテナ
  wordpress1:
    image: wordpress:5.8.0-php8.0-apache
    environment:
      WORDPRESS_DB_HOST: mysqldb1
      WORDPRESS_DB_USER: db1user
      WORDPRESS_DB_PASSWORD: secret
      WORDPRESS_DB_NAME: db1
      WORDPRESS_CONFIG_EXTRA: |
        define('AUTOMATIC_UPDATER_DISABLED', true);
      VIRTUAL_HOST: wordpress.domain.com
      LETSENCRYPT_HOST: wordpress.domain.com
    volumes:
      - 'wordpress1:/var/www/html/wp-content'
      - './uploads.ini:/usr/local/etc/php/conf.d/uploads.ini'
    restart: always
    depends_on:
      - mysqldb1
    networks:
      - mysqldb1
      - net

お気に入りのエディターを使用して、docker-compose.ymlを作成します この時点までに議論されたすべての内容を含むファイル(追加のパラメーターは以下に含まれています)。それに応じて、ドメイン名やその他の資格情報データを編集する必要があります。ここでは、Nanoを使用しました。

nano docker-compose.yml
version: '3.7'
services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - html:/usr/share/nginx/html
      - dhparam:/etc/nginx/dhparam
      - vhost:/etc/nginx/vhost.d
      - certs:/etc/nginx/certs:ro
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./client_max_upload_size.conf:/etc/nginx/conf.d/client_max_upload_size.conf
      - ./www.domain.com:/etc/nginx/vhost.d/www.domain.com
    labels:
      - "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy"
    restart: always
    networks:
      - net

  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: lets-encrypt-proxy-companion
    depends_on:
      - "nginx-proxy"
    volumes:
      - certs:/etc/nginx/certs:rw
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      DEFAULT_EMAIL: [email protected]
    restart: always
    networks:
      - net

  mysqldb0:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: db0
      MYSQL_USER: db0user
      MYSQL_PASSWORD: secret
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - 'mysqldb0:/var/lib/mysql'
    restart: always
    networks:
      - mysqldb0


  wordpress0:
    image: wordpress:5.8.0-php8.0-apache
    environment:
      WORDPRESS_DB_HOST: mysqldb0
      WORDPRESS_DB_USER: db0user
      WORDPRESS_DB_PASSWORD: secret
      WORDPRESS_DB_NAME: db0
      WORDPRESS_CONFIG_EXTRA: |
        define('AUTOMATIC_UPDATER_DISABLED', true);
      VIRTUAL_HOST: domain.com,www.domain.com
      LETSENCRYPT_HOST: domain.com,www.domain.com
    volumes:
      - 'wordpress0:/var/www/html/wp-content'
      - './uploads.ini:/usr/local/etc/php/conf.d/uploads.ini'
    restart: always
    depends_on:
      - mysqldb0
    networks:
      - mysqldb0
      - net

  mysqldb1:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: db1
      MYSQL_USER: db1user
      MYSQL_PASSWORD: secret
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - 'mysqldb1:/var/lib/mysql'
    restart: always
    networks:
      - mysqldb1


  wordpress1:
    image: wordpress:5.8.0-php8.0-apache
    environment:
      WORDPRESS_DB_HOST: mariadb1
      WORDPRESS_DB_USER: db1user   
      WORDPRESS_DB_PASSWORD: secret
      WORDPRESS_DB_NAME: db1
      WORDPRESS_CONFIG_EXTRA: |
        define('AUTOMATIC_UPDATER_DISABLED', true);
      VIRTUAL_HOST: wordpress.linuxhindi.com
      LETSENCRYPT_HOST: wordpress.linuxhindi.com
    volumes:
      - 'wordpress1:/var/www/html/wp-content'
      - './uploads.ini:/usr/local/etc/php/conf.d/uploads.ini'
    restart: always
    depends_on:
      - mysqldb1
    networks:
      - mysqldb1
      - net

volumes:
  certs:
  html:
  vhost:
  dhparam:
  mysqldb0:
  wordpress0:
  mysqldb1:
  wordpress1:

networks:
  mysqldb0:
    internal: true
  mysqldb1:
    internal: true
  net:
    external: true

各データベースとそれに対応するWordPressコンテナにのみ特定の内部ネットワークを割り当てていることに注意してください。データベースコンテナはNginxnetを見る必要はありません 通信網。 net フロントエンドのWordPressコンテナにのみ必要です。

談話に関する前回の記事では、 --volumes-fromを使用しました nginx-proxyを使用するためのフラグ letsencryptを使用したコンテナのボリューム 。同様に、同じフラグに相当するものはvolumes_fromでした 、かなり前にDockerによって削除されました。したがって、docker-compose.yml内のNginxおよびLet'sEncryptコンテナの共通ボリュームを明示的に指定しました ファイル–つまり、証明書 html vhost および/var/run/docker.sock

次に、次のdocker-composeを使用してセットアップをデプロイします 同じmulti-wordpressからのコマンド 最初に作成したディレクトリ:

docker-compose up -d

次の確認が表示されます:

Creating network "multi-wordpress_mysqldb0" with the default driver
Creating network "multi-wordpress_mysqldb1" with the default driver
Creating volume "multi-wordpress_certs" with default driver
Creating volume "multi-wordpress_html" with default driver
Creating volume "multi-wordpress_vhost" with default driver
Creating volume "multi-wordpress_dhparam" with default driver
Creating volume "multi-wordpress_mysqldb0" with default driver
Creating volume "multi-wordpress_wordpress0" with default driver
Creating volume "multi-wordpress_mysqldb1" with default driver
Creating volume "multi-wordpress_wordpress1" with default driver
Creating multi-wordpress_mysqldb0_1   ... done
Creating nginx-proxy                  ... done
Creating multi-wordpress_mysqldb1_1 ... done
Creating multi-wordpress_wordpress1_1 ... done
Creating multi-wordpress_wordpress0_1 ... done
Creating lets-encrypt-proxy-companion ... done

最初の2つは内部ネットワークで、次にボリューム、最後にコンテナが続きます。外部ネットワークnet このチュートリアルの最初に手動で作成したので、すでに存在しています。

しばらく待ちます。インターネットブラウザを開き、www.domain.comと入力します 。 domain.comにリダイレクトされます WordPressセットアップウィザードがあなたを待っています:

ご希望の言語を選択し、[続行]をクリックして、サイト管理の申し立てを続行してください。

wordpress.domain.comの場合 、同じ結果が得られます。既存のコンテナに示されているのと同様の構文に従って、手順5(データベースサービス)と手順6(WordPressサービス)を繰り返すことで、WordPressサイトをさらに追加できます。また、volumesも忘れずに改訂してください。 およびnetworks それに応じてYAMLファイルのセクション。

新しいサイトごとに、新しいWordPressコンテナとそれに対応するMySQLデータベースコンテナが作成されます。上記のdocker-compose.ymlファイルに相当するコマンドラインを知りたい場合は、ここで調べることができます。

セルフホストのWordPressインスタンスを維持するためのヒント

長期的にWordPressインスタンスを維持するのに役立ついくつかのヒントを次に示します。

WordPressログをリアルタイムで監視

リアルタイムでデプロイされているWordPressコンテナのログ(このチュートリアルで説明されている最初のログなど)を確認したい場合は、次のコマンドを実行できます:

docker logs -f multi-wordpress_wordpress0_1

このデプロイメントに関連する他のすべてのコンテナー内で何が起こっているのかをトラブルシューティングまたは学習したい場合は、Dockerログを効率的に使用することが重要になる可能性があります。

ダウンタイムなしでWordPressボリュームをバックアップおよび復元

クラウド+ローカルアプローチを使用すると、ダウンタイムなしでWordPressボリュームをバックアップおよび復元できます。

ダウンタイムなしでWordPressコンテナを更新

--scaleを使用 Docker Composeのフラグを使用すると、最新バージョンのWordPressに基づいて新しいコンテナーを作成できます。完了したら、古いものを削除できます。これにより、ダウンタイムがゼロになります。

この記事がお役に立てば幸いです。ご意見、ご感想、ご提案がございましたら、下のコメント欄でお知らせください。


Linux
  1. ApacheWebサーバーで複数のWebサイトを構成する方法

  2. UbuntuにDockerでWordPressをインストールする方法

  3. Nginxを使用して1つのIPに複数のSSLを設定する方法

  1. Debian10でDockerを使用してダイナミックDNSサーバーをデプロイする方法

  2. 複数のホストアドレス/ポートなどで同じSshエイリアスを使用する方法は?

  3. CentOS / RHEL 6 :NTP サーバーとの NTP 同期を強制する方法

  1. UbuntuでRancherを使用してDockerコンテナを管理する方法

  2. サブドメインを同じサーバーの別のポートにリダイレクトするにはどうすればよいですか?

  3. 同じサブネット上の IP を持つ複数の物理インターフェイス