著者は、 Write for DOnations プログラムの一環として、国連財団を選択して寄付を受け取りました。
このチュートリアルの元のWordPressバージョンは、 KathleenJuellによって作成されました。
序章
Drupal は、 PHP で記述され、オープンソースの GNU General Public Licenseの下で配布されるコンテンツ管理システム(CMS)です。 世界中の人々や組織がDrupalを使用して、政府のサイト、個人のブログ、企業などに電力を供給しています。 Drupalが他のCMSフレームワークと異なる点は、成長するコミュニティと、安全なプロセス、信頼性の高いパフォーマンス、モジュール性、適応する柔軟性などの一連の機能です。
Drupalでは、 LAMP (Linux、Apache、MySQL、およびPHP)または LEMP (Linux、Nginx、MySQL、およびPHP)スタックをインストールする必要がありますが、個々のコンポーネントのインストールには時間がかかります。タスク。 DockerやDockerCompose などのツールを使用して、Drupalのインストールプロセスを簡素化できます。 このチュートリアルでは、Dockerイメージを使用してDockerコンテナー内に個々のコンポーネントをインストールします。 Docker Composeを使用することで、データベース、アプリケーション、およびそれらの間のネットワーク/通信用の複数のコンテナーを定義および管理できます。
このチュートリアルでは、Docker Composeを使用してDrupalをインストールし、コンテナー化を利用してDrupalWebサイトをサーバーにデプロイできるようにします。 MySQL データベース、 Nginx Webサーバー、およびDrupalのコンテナーを実行します。 また、サイトに関連付けたいドメインのLet’sEncryptを使用してTLS/ SSL証明書を取得することにより、インストールを保護します。 最後に、 cronジョブを設定して証明書を更新し、ドメインのセキュリティを維持します。
前提条件
このチュートリアルに従うには、次のものが必要です。
- Ubuntu18.04を実行しているサーバーとroot以外のユーザー
sudo
特権とアクティブなファイアウォール。 これらの設定方法のガイダンスについては、この初期サーバー設定ガイドを参照してください。 - Ubuntu18.04にDockerをインストールして使用する方法の手順1と2に従ってサーバーにDockerをインストールします。 このチュートリアルはバージョン19.03.8でテストされています。
- Ubuntu 18.04にDockerComposeをインストールする方法のステップ1に従って、サーバーにDockerComposeをインストールします。 このチュートリアルはバージョン1.21.2でテストされています。
- 登録されたドメイン名。 このチュートリアルでは、
your_domain
全体を通して。 Freenom で無料で入手するか、選択したドメインレジストラを使用できます。 - 次の両方のDNSレコードがサーバー用に設定されています。 DigitalOceanアカウントに追加する方法の詳細については、このDigitalOcean DNSの概要をフォローしてください(使用している場合)。
- とのAレコード
your_domain
サーバーのパブリックIPアドレスを指します。 - とのAレコード
www.your_domain
サーバーのパブリックIPアドレスを指します。
- とのAレコード
ステップ1—Webサーバー構成の定義
コンテナを実行する前に、NginxWebサーバーの構成を定義する必要があります。 構成ファイルには、Drupal固有のロケーションブロックと、証明書の自動更新のためにLet’sEncryptの検証要求をCertbotクライアントに送信するロケーションブロックが含まれます。
まず、Drupalセットアップ用のプロジェクトディレクトリを作成しましょう。 drupal
:
- mkdir drupal
新しく作成したディレクトリに移動します。
- cd drupal
これで、構成ファイル用のディレクトリを作成できます。
- mkdir nginx-conf
nanoまたはお気に入りのテキストエディタでファイルを開きます。
- nano nginx-conf/nginx.conf
このファイルでは、サーバー名とドキュメントルートのディレクティブを含むサーバーブロックと、証明書、PHP処理、静的アセットリクエストに対するCertbotクライアントのリクエストを送信するロケーションブロックを追加します。
次のコードをファイルに追加します。 必ず交換してください your_domain
あなた自身のドメイン名で:
server {
listen 80;
listen [::]:80;
server_name your_domain www.your_domain;
index index.php index.html index.htm;
root /var/www/html;
location ~ /.well-known/acme-challenge {
allow all;
root /var/www/html;
}
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
rewrite ^/core/authorize.php/core/authorize.php(.*)$ /core/authorize.php$1;
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass drupal:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location ~ /\.ht {
deny all;
}
location = /favicon.ico {
log_not_found off; access_log off;
}
location = /robots.txt {
log_not_found off; access_log off; allow all;
}
location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
expires max;
log_not_found off;
}
}
サーバーブロックには、次の情報が含まれています。
ディレクティブ:
-
listen
:これはNginxにポートでリッスンするように指示します80
、これにより、証明書要求にCertbotのwebrootプラグインを使用できるようになります。 ポートは含まれていないことに注意してください443
ただし、証明書を正常に取得したら、SSLを含むように構成を更新します。 -
server_name
:これは、サーバー名と、サーバーへのリクエストに使用するサーバーブロックを定義します。 必ず交換してくださいyour_domain
この行に独自のドメイン名を付けます。 -
index
:indexディレクティブは、サーバーへのリクエストを処理するときにインデックスとして使用されるファイルを定義します。 ここでデフォルトの優先順位を変更し、移動しましたindex.php
の前にindex.html
Nginxが呼び出されたファイルに優先順位を付けるようにindex.php
可能であれば。 -
root
:rootディレクティブは、サーバーへのリクエストのルートディレクトリに名前を付けます。 このディレクトリ、/var/www/html
は、Drupal Dockerfileの指示により、ビルド時にマウントポイントとして作成されます。 これらのDockerfile命令は、Drupalリリースのファイルがこのボリュームにマウントされていることも確認します。 -
rewrite
:指定された正規表現の場合(^/core/authorize.php/core/authorize.php(.*)$
)はリクエストURIに一致し、URIは置換文字列で指定されたとおりに変更されます(/core/authorize.php$1
).
ロケーションブロック:
-
location ~ /.well-known/acme-challenge
:このロケーションブロックは、.well-known
ディレクトリ。Certbotは、ドメインのDNSがサーバーに解決されることを検証するための一時ファイルを配置します。 この構成が適切に行われると、Certbotのwebrootプラグインを使用して、ドメインの証明書を取得できるようになります。 -
location /
:このロケーションブロックでは、try_files
個々のURI要求に一致するファイルをチェックするディレクティブ。 を返す代わりに404 Not Found
デフォルトとしてのステータスですが、Drupalに制御を渡しますindex.php
リクエスト引数を含むファイル。 -
location ~ \.php$
:このロケーションブロックはPHP処理を処理し、これらのリクエストをdrupalコンテナにプロキシします。 DrupalDockerイメージはphp:fpm
イメージの場合、このブロックにはFastCGIプロトコルに固有の構成オプションも含まれます。 Nginxは、PHPリクエスト用に独立したPHPプロセッサを必要とします。この場合、これらのリクエストは、php-fpm
に含まれているプロセッサphp:fpm
画像。 さらに、このロケーションブロックには、Drupalコンテナで実行されているDrupalアプリケーションにリクエストをプロキシし、解析されたリクエストURIの優先インデックスを設定し、URIリクエストを解析するFastCGI固有のディレクティブ、変数、およびオプションが含まれています。 -
location ~ /\.ht
:このブロックは処理します.htaccess
Nginxはファイルを提供しないため、ファイル。 Thedeny_all
ディレクティブは.htaccess
ファイルがユーザーに提供されることはありません。 -
location = /favicon.ico, location = /robots.txt
:これらのブロックは、/favicon.ico
と/robots.txt
ログに記録されません。 -
location ~* \.(css|gif|ico|jpeg|jpg|js|png)$
:このブロックは、静的アセットリクエストのロギングをオフにし、これらのアセットは通常、提供するのに費用がかかるため、高度にキャッシュ可能であることを保証します。
FastCGIプロキシの詳細については、NginxでのFastCGIプロキシの理解と実装を参照してください。 サーバーとロケーションブロックの詳細については、Nginxサーバーとロケーションブロックの選択アルゴリズムについてを参照してください。
編集が終了したら、ファイルを保存して閉じます。
Nginx構成が整ったら、実行時にアプリケーションとデータベースコンテナーに渡す環境変数の作成に進むことができます。
ステップ2—環境変数を定義する
Drupalアプリケーションには、サイトに関連する情報を保存するためのデータベース(MySQL、PostgresSQLなど)が必要です。 Drupalコンテナーは、データベース(MySQL)コンテナーにアクセスするために、実行時に特定の環境変数にアクセスする必要があります。 これらの変数にはデータベースのクレデンシャルなどの機密情報が含まれているため、Docker Composeファイル(コンテナの実行方法に関する情報を含むメインファイル)で直接公開することはできません。
に敏感な値を設定することを常にお勧めします .env
ファイルし、その循環を制限します。 これにより、これらの値がプロジェクトリポジトリにコピーされ、公開されるのを防ぐことができます。
メインプロジェクトディレクトリで、 ~/drupal
、というファイルを作成して開きます .env
:
- nano .env
次の変数をに追加します .env
ファイル、強調表示されたセクションを使用する資格情報に置き換えます。
MYSQL_ROOT_PASSWORD=root_password
MYSQL_DATABASE=drupal
MYSQL_USER=drupal_database_user
MYSQL_PASSWORD=drupal_database_password
これで、MySQLルート管理者アカウントのパスワードと、アプリケーションデータベースの優先ユーザー名とパスワードが追加されました。
私たちの .env
ファイルには機密情報が含まれているため、プロジェクトに含めることを常にお勧めします .gitignore
と .dockerignore
GitリポジトリとDockerイメージに追加されないようにファイルを作成します。
バージョン管理のためにGitを使用する場合は、現在の作業ディレクトリをリポジトリとして初期化します git init
:
- git init
開ける .gitignore
ファイル:
- nano .gitignore
以下を追加します。
.env
ファイルを保存して終了します。
同様に、 .dockerignore
ファイル:
- nano .dockerignore
次に、以下を追加します。
.env
.git
ファイルを保存して終了します。
クレデンシャルを環境変数として保護するための対策を講じたので、次のステップであるサービスを定義することに移りましょう。 docker-compose.yml
ファイル。
ステップ3—DockerComposeを使用したサービスの定義
Docker Composeは、マルチコンテナーDockerアプリケーションを定義および実行するためのツールです。 YAMLファイルを定義して、アプリケーションのサービスを構成します。 DockerComposeのserviceは実行中のコンテナーであり、Composeを使用すると、これらのサービスを共有ボリュームおよびネットワークとリンクできます。
Drupalアプリケーション、データベース、およびWebサーバー用にさまざまなコンテナーを作成します。 これらに加えて、Webサーバーの証明書を取得するためにCertbotを実行するコンテナーも作成します。
作成する docker-compose.yml
ファイル:
- nano docker-compose.yml
次のコードを追加して、ファイルの作成バージョンを定義します。 mysql
データベースサービス:
version: "3"
services:
mysql:
image: mysql:8.0
container_name: mysql
command: --default-authentication-plugin=mysql_native_password
restart: unless-stopped
env_file: .env
volumes:
- db-data:/var/lib/mysql
networks:
- internal
これらのすべての構成オプションを1つずつ見ていきましょう。 mysql
サービス:
-
image
:これは、コンテナの作成に使用/プルされるイメージを指定します。 を除いて、適切なバージョンタグを持つ画像を使用することを常にお勧めしますlatest
将来の競合を回避するためのタグ。 DockerのドキュメントからDockerfileのベストプラクティスの詳細をお読みください。 -
container_name
:コンテナの名前を定義します。 -
command
:これは、画像のデフォルトコマンド(CMD命令)を上書きするために使用されます。 MySQLはさまざまな認証プラグインをサポートしていますが、mysql_native_password
認証するための従来の方法です。 PHP、つまりDrupalは新しいMySQL認証をサポートしないため、--default-authentication-plugin=mysql_native_password
デフォルトの認証メカニズムとして。 -
restart
:これは、コンテナの再起動ポリシーを定義するために使用されます。 Theunless-stopped
ポリシーは、手動で停止されない限り、コンテナを再起動します。 -
env_file
:これにより、ファイルから環境変数が追加されます。 私たちの場合、それはから環境変数を読み取ります.env
前のステップで定義されたファイル。 -
volumes
:これは、サービスのサブオプションとして指定されたホストパスまたは名前付きボリュームをマウントします。 と呼ばれる名前付きボリュームをマウントしていますdb-data
に/var/lib/mysql
コンテナ上のディレクトリ。デフォルトでは、MySQLがデータファイルを書き込みます。 -
networks
:これはinternal
アプリケーションサービスが参加するネットワーク。 ファイルの最後にネットワークを定義します。
私たちは mysql
サービス定義なので、今度はの定義を追加しましょう drupal
ファイルの最後までのアプリケーションサービス:
...
drupal:
image: drupal:8.7.8-fpm-alpine
container_name: drupal
depends_on:
- mysql
restart: unless-stopped
networks:
- internal
- external
volumes:
- drupal-data:/var/www/html
このサービス定義では、コンテナに名前を付け、再起動ポリシーを定義しています。 mysql
サービス。 このコンテナに固有のオプションもいくつか追加しています。
-
image
:ここでは、 8.7.8-fpm-alpineDrupalイメージを使用しています。 この画像にはphp-fpm
NginxWebサーバーがPHP処理を処理するために必要なプロセッサ。 さらに、私たちは使用していますalpine
Alpine Linuxプロジェクトから派生したイメージ。イメージ全体のサイズを縮小し、Dockerfileのベストプラクティスで推奨されています。 Drupalにはさらに多くのバージョンのイメージがあるので、Dockerhubでそれらをチェックしてください。 -
depends_on
:これは、サービス間の依存関係を表すために使用されます。 の定義mysql
私たちへの依存としてのサービスdrupal
コンテナは私たちのdrupal
コンテナは後に作成されますmysql
コンテナを使用して、アプリケーションをスムーズに起動できるようにします。 -
networks
:ここでは、このコンテナをに追加しましたexternal
と一緒にネットワークinternal
通信網。 これにより、mysql
サービスはからのみアクセス可能ですdrupal
コンテナを介してinternal
このコンテナを他のコンテナにアクセスできるようにしながら、ネットワークexternal
通信網。 -
volumes
:という名前のボリュームをマウントしていますdrupal-data
に/var/www/html
Drupalイメージによって作成されたマウントポイント。 このように名前付きボリュームを使用すると、アプリケーションコードを他のコンテナと共有できます。
次に、Nginxサービス定義を追加しましょう drupal
サービス定義:
...
webserver:
image: nginx:1.17.4-alpine
container_name: webserver
depends_on:
- drupal
restart: unless-stopped
ports:
- 80:80
volumes:
- drupal-data:/var/www/html
- ./nginx-conf:/etc/nginx/conf.d
- certbot-etc:/etc/letsencrypt
networks:
- external
繰り返しになりますが、コンテナーに名前を付け、開始順にDrupalコンテナーに依存するようにしています。 また、アルパインイメージ( 1.17.4-alpine Nginxイメージ)も使用しています。
このサービス定義には、次のオプションも含まれています。
-
ports
:これはポートを公開します80
で定義した構成オプションを有効にするnginx.conf
手順1のファイル。 -
volumes
:ここでは、名前付きボリュームとホストパスの両方を定義しています。-
drupal-data:/var/www/html
:これにより、Drupalアプリケーションコードがマウントされます/var/www/html
Nginxサーバーブロックのルートとして設定したディレクトリ。 -
./nginx-conf:/etc/nginx/conf.d
:これにより、ホスト上のNginx構成ディレクトリがコンテナ上の関連するディレクトリにマウントされ、ホスト上のファイルに加えた変更がコンテナに反映されるようになります。 -
certbot-etc:/etc/letsencrypt
:これにより、ドメインに関連するLet’sEncryptの証明書とキーがコンテナの適切なディレクトリにマウントされます。 -
networks
:定義しましたexternal
このコンテナがdrupal
コンテナではなくmysql
容器。
-
最後に、最後のサービス定義を追加します certbot
サービス。 必ず交換してください sammy@your_domain
と your_domain
あなた自身の電子メールとドメイン名で:
...
certbot:
depends_on:
- webserver
image: certbot/certbot
container_name: certbot
volumes:
- certbot-etc:/etc/letsencrypt
- drupal-data:/var/www/html
command: certonly --webroot --webroot-path=/var/www/html --email sammy@your_domain --agree-tos --no-eff-email --staging -d your_domain -d www.your_domain
この定義は、DockerHubからcertbot /certbotイメージをプルするようにComposeに指示します。 また、名前付きボリュームを使用して、ドメイン証明書やキー入力などのリソースをNginxコンテナと共有します certbot-etc
およびアプリケーションコード drupal-data
.
私たちも使用しました depends_on
確認するために certbot
コンテナは webserver
サービスが実行されています。
何も指定していません networks
これは、このコンテナがネットワークを介してどのサービスとも通信しないためです。 名前付きボリュームを使用してマウントしたドメイン証明書とキーを追加するだけです。
また、 command
コンテナのデフォルトで実行するサブコマンドを指定するオプション certbot
指図。 Certbotクライアントは、証明書を取得およびインストールするためのプラグインをサポートしています。 私たちは使用しています webroot
含めることによって証明書を取得するプラグイン certonly
と --webroot
コマンドラインで。 プラグインと追加コマンドの詳細については、公式のCertbotドキュメントをご覧ください。
後に certbot
サービス定義、ネットワークとボリュームの定義を追加します。
...
networks:
external:
driver: bridge
internal:
driver: bridge
volumes:
drupal-data:
db-data:
certbot-etc:
トップレベル networks
キーを使用すると、作成するネットワークを指定できます。 networks
同じDockerデーモンホスト上にあるため、すべてのポートのサービス/コンテナー間での通信を許可します。 2つのネットワークを定義しました。 internal
と external
、の通信を確保するために webserver
, drupal
、 と mysql
サービス。
The volumes
キーは、名前付きボリュームを定義するために使用されます drupal-data
, db-data
、 と certbot-etc
. Dockerがボリュームを作成すると、ボリュームのコンテンツはホストファイルシステム上のディレクトリに保存されます。 /var/lib/docker/volumes/
、それはDockerによって管理されています。 次に、各ボリュームのコンテンツは、このディレクトリからボリュームを使用する任意のコンテナにマウントされます。 このようにして、コンテナ間でコードとデータを共有することが可能です。
完成した docker-compose.yml
ファイルは次のようになります。
version: "3"
services:
mysql:
image: mysql:8.0
container_name: mysql
command: --default-authentication-plugin=mysql_native_password
restart: unless-stopped
env_file: .env
volumes:
- db-data:/var/lib/mysql
networks:
- internal
drupal:
image: drupal:8.7.8-fpm-alpine
container_name: drupal
depends_on:
- mysql
restart: unless-stopped
networks:
- internal
- external
volumes:
- drupal-data:/var/www/html
webserver:
image: nginx:1.17.4-alpine
container_name: webserver
depends_on:
- drupal
restart: unless-stopped
ports:
- 80:80
volumes:
- drupal-data:/var/www/html
- ./nginx-conf:/etc/nginx/conf.d
- certbot-etc:/etc/letsencrypt
networks:
- external
certbot:
depends_on:
- webserver
image: certbot/certbot
container_name: certbot
volumes:
- certbot-etc:/etc/letsencrypt
- drupal-data:/var/www/html
command: certonly --webroot --webroot-path=/var/www/html --email sammy@your_domain --agree-tos --no-eff-email --staging -d your_domain -d www.your_domain
networks:
external:
driver: bridge
internal:
driver: bridge
volumes:
drupal-data:
db-data:
certbot-etc:
サービスの定義は完了です。 次に、コンテナを起動して、証明書リクエストをテストしましょう。
ステップ4—SSL証明書とクレデンシャルを取得する
コンテナを次のように開始できます docker-compose up
コマンド。指定した順序でコンテナを作成して実行します。 ドメインリクエストが成功すると、出力に正しい終了ステータスが表示され、適切な証明書がマウントされます。 /etc/letsencrypt/live
Webサーバーコンテナ上のフォルダ。
コンテナをバックグラウンドで実行するには、 docker-compose up
とのコマンド -d
国旗:
- docker-compose up -d
サービスが作成されたことを確認する同様の出力が表示されます。
Output...
Creating mysql ... done
Creating drupal ... done
Creating webserver ... done
Creating certbot ... done
を使用してサービスのステータスを確認します docker-compose ps
指図:
- docker-compose ps
が表示されます mysql
, drupal
、 と webserver
とのサービス State
の Up
、 その間 certbot
で終了します 0
ステータスメッセージ:
Output Name Command State Ports
--------------------------------------------------------------------------
certbot certbot certonly --webroot ... Exit 0
drupal docker-php-entrypoint php-fpm Up 9000/tcp
mysql docker-entrypoint.sh --def ... Up 3306/tcp, 33060/tcp
webserver nginx -g daemon off; Up 0.0.0.0:80->80/tcp
あなたが他のものを見たら Up
の中に State
の列 mysql
, drupal
、 また webserver
サービス、または以外の終了ステータス 0
のために certbot
コンテナの場合は、必ずサービスログを確認してください。 docker-compose logs
指図:
- docker-compose logs service_name
これで、証明書がにマウントされていることを確認できます。 webserver
を使用したコンテナ docker-compose exec
指図:
- docker-compose exec webserver ls -la /etc/letsencrypt/live
これにより、次の出力が得られます。
Outputtotal 16
drwx------ 3 root root 4096 Oct 5 09:15 .
drwxr-xr-x 9 root root 4096 Oct 5 09:15 ..
-rw-r--r-- 1 root root 740 Oct 5 09:15 README
drwxr-xr-x 2 root root 4096 Oct 5 09:15 your_domain
すべてが正常に実行されたので、編集できます certbot
削除するサービス定義 --staging
国旗。
を開きます docker-compose.yml
ファイル、に移動します certbot
サービス定義、および置換 --staging
コマンドオプションのフラグ --force-renewal
フラグ。これは、既存の証明書と同じドメインを持つ新しい証明書を要求することをCertbotに通知します。 更新された certbot
定義は次のようになります。
...
certbot:
depends_on:
- webserver
image: certbot/certbot
container_name: certbot
volumes:
- certbot-etc:/etc/letsencrypt
- drupal-data:/var/www/html
command: certonly --webroot --webroot-path=/var/www/html --email sammy@your_domain --agree-tos --no-eff-email --force-renewal -d your_domain -d www.your_domain
...
実行する必要があります docker-compose up
もう一度作成するには certbot
容器。 また、 --no-deps
Composeに開始をスキップできることを通知するオプション webserver
サービス、すでに実行されているため:
- docker-compose up --force-recreate --no-deps certbot
証明書要求が成功したことを示す出力が表示されます。
OutputRecreating certbot ... done
Attaching to certbot
certbot | Saving debug log to /var/log/letsencrypt/letsencrypt.log
certbot | Plugins selected: Authenticator webroot, Installer None
certbot | Renewing an existing certificate
certbot | Performing the following challenges:
certbot | http-01 challenge for your_domain
certbot | http-01 challenge for www.your_domain
certbot | Using the webroot path /var/www/html for all unmatched domains.
certbot | Waiting for verification...
certbot | Cleaning up challenges
certbot | IMPORTANT NOTES:
certbot | - Congratulations! Your certificate and chain have been saved at:
certbot | /etc/letsencrypt/live/your_domain/fullchain.pem
certbot | Your key file has been saved at:
certbot | /etc/letsencrypt/live/your_domain/privkey.pem
certbot | Your cert will expire on 2020-01-03. To obtain a new or tweaked
certbot | version of this certificate in the future, simply run certbot
certbot | again. To non-interactively renew *all* of your certificates, run
certbot | "certbot renew"
certbot | - Your account credentials have been saved in your Certbot
certbot | configuration directory at /etc/letsencrypt. You should make a
certbot | secure backup of this folder now. This configuration directory will
certbot | also contain certificates and private keys obtained by Certbot so
certbot | making regular backups of this folder is ideal.
certbot | - If you like Certbot, please consider supporting our work by:
certbot |
certbot | Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
certbot | Donating to EFF: https://eff.org/donate-le
certbot |
certbot exited with code 0
証明書が正常に生成されたので、Nginx構成を更新してSSLを含めることができます。
手順5—Webサーバーの構成とサービス定義を変更する
NginxにSSL証明書をインストールした後、すべてのHTTPリクエストをHTTPSにリダイレクトする必要があります。 また、SSL証明書とキーの場所を指定し、セキュリティパラメータとヘッダーを追加する必要があります。
あなたが再作成しようとしているので webserver
これらの追加を含めるサービスは、今すぐ停止できます。
- docker-compose stop webserver
これにより、次の出力が得られます。
OutputStopping webserver ... done
次に、前に作成したNginx構成ファイルを削除しましょう。
- rm nginx-conf/nginx.conf
ファイルの別のバージョンを開きます。
- nano nginx-conf/nginx.conf
次のコードをファイルに追加して、HTTPをHTTPSにリダイレクトし、SSLクレデンシャル、プロトコル、およびセキュリティヘッダーを追加します。 交換することを忘れないでください your_domain
あなた自身のドメインで:
server {
listen 80;
listen [::]:80;
server_name your_domain www.your_domain;
location ~ /.well-known/acme-challenge {
allow all;
root /var/www/html;
}
location / {
rewrite ^ https://$host$request_uri? permanent;
}
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name your_domain www.your_domain;
index index.php index.html index.htm;
root /var/www/html;
server_tokens off;
ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Content-Security-Policy "default-src * data: 'unsafe-eval' 'unsafe-inline'" always;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
rewrite ^/core/authorize.php/core/authorize.php(.*)$ /core/authorize.php$1;
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass drupal:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location ~ /\.ht {
deny all;
}
location = /favicon.ico {
log_not_found off; access_log off;
}
location = /robots.txt {
log_not_found off; access_log off; allow all;
}
location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
expires max;
log_not_found off;
}
}
HTTPサーバーブロックは、Certbot更新要求のwebrootプラグインを指定します。 .well-known/acme-challenge
ディレクトリ。 また、 rewrite
ルートディレクトリへのHTTPリクエストをHTTPSに転送するディレクティブ。
HTTPSサーバーブロックは ssl
と http2
. HTTP / 2がHTTPプロトコルを反復処理する方法と、それがWebサイトのパフォーマンスにもたらすメリットの詳細については、 Ubuntu18.04でHTTP/2サポートを使用してNginxをセットアップする方法の概要を参照してください。
これらのブロックはSSLを有効にします。これは、SSL証明書とキーの場所、および推奨されるヘッダーが含まれているためです。 これらのヘッダーにより、 SSLLabsおよびSecurityHeadersサーバーテストサイトでAの評価を取得できます。
私たちの root
と index
ステップ1で説明したDrupal固有のロケーションブロックの残りの部分と同様に、ディレクティブもこのブロックに配置されます。
更新されたNginx構成ファイルを保存して閉じます。
再作成する前に webserver
コンテナ、追加する必要があります 443
私たちへのポートマッピング webserver
SSL証明書を有効にしたためのサービス定義。
を開きます docker-compose.yml
ファイル:
- nano docker-compose.yml
で次の変更を行います webserver
サービス定義:
...
webserver:
image: nginx:1.17.4-alpine
container_name: webserver
depends_on:
- drupal
restart: unless-stopped
ports:
- 80:80
- 443:443
volumes:
- drupal-data:/var/www/html
- ./nginx-conf:/etc/nginx/conf.d
- certbot-etc:/etc/letsencrypt
networks:
- external
...
SSL証明書を有効にした後、 docker-compose.yml
次のようになります。
version: "3"
services:
mysql:
image: mysql:8.0
container_name: mysql
command: --default-authentication-plugin=mysql_native_password
restart: unless-stopped
env_file: .env
volumes:
- db-data:/var/lib/mysql
networks:
- internal
drupal:
image: drupal:8.7.8-fpm-alpine
container_name: drupal
depends_on:
- mysql
restart: unless-stopped
networks:
- internal
- external
volumes:
- drupal-data:/var/www/html
webserver:
image: nginx:1.17.4-alpine
container_name: webserver
depends_on:
- drupal
restart: unless-stopped
ports:
- 80:80
- 443:443
volumes:
- drupal-data:/var/www/html
- ./nginx-conf:/etc/nginx/conf.d
- certbot-etc:/etc/letsencrypt
networks:
- external
certbot:
depends_on:
- webserver
image: certbot/certbot
container_name: certbot
volumes:
- certbot-etc:/etc/letsencrypt
- drupal-data:/var/www/html
command: certonly --webroot --webroot-path=/var/www/html --email sammy@your_domain --agree-tos --no-eff-email --force-renewal -d your_domain -d www.your_domain
networks:
external:
driver: bridge
internal:
driver: bridge
volumes:
drupal-data:
db-data:
certbot-etc:
ファイルを保存して閉じます。 を再現しましょう webserver
更新された構成によるサービス:
- docker-compose up -d --force-recreate --no-deps webserver
これにより、次の出力が得られます。
OutputRecreating webserver ... done
でサービスを確認してください docker-compose ps
:
- docker-compose ps
が表示されます mysql
, drupal
、 と webserver
としてのサービス Up
その間 certbot
で終了します 0
ステータスメッセージ:
Output Name Command State Ports
--------------------------------------------------------------------------
certbot certbot certonly --webroot ... Exit 0
drupal docker-php-entrypoint php-fpm Up 9000/tcp
mysql docker-entrypoint.sh --def ... Up 3306/tcp, 33060/tcp
webserver nginx -g daemon off; Up 0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
これで、すべてのサービスが実行され、Webインターフェイスを介してDrupalのインストールを進めることができます。
ステップ6—Webインターフェイスを介したインストールの完了
DrupalのWebインターフェイスからインストールを完了しましょう。
Webブラウザーで、サーバーのドメインに移動します。 代用することを忘れないでください your_domain
ここにあなた自身のドメイン名があります:
https://your_domain
使用する言語を選択します。
保存して続行をクリックします。 インストールプロファイルページに移動します。 Drupalには複数のプロファイルがあるため、標準プロファイルを選択し、保存して続行をクリックします。
プロファイルを選択したら、データベース構成ページに進みます。 データベースタイプをMySQL、MariaDB、Percona Server、または同等のとして選択し、データベース名、ユーザー名、およびパスワードの値を入力します対応する値から MYSQL_DATABASE
, MYSQL_USER
、 と MYSQL_PASSWORD
それぞれで定義されています .env
手順2のファイル。 詳細オプションをクリックし、ホストの値を mysql
サービスコンテナ。 [保存して続行]をクリックします。
データベースを構成した後、Drupalのデフォルトのモジュールとテーマのインストールを開始します。
サイトがインストールされると、サイト名、電子メール、ユーザー名、パスワード、および地域設定を構成するためのDrupalサイトセットアップページが表示されます。 情報を入力し、保存して続行をクリックします。
保存して続行をクリックすると、 Drupalへようこそページが表示され、Drupalサイトが正常に稼働していることが示されます。
Drupalのインストールが完了したので、SSL証明書が自動的に更新されることを確認する必要があります。
ステップ7—証明書の更新
Let’s Encryptの証明書は90日間有効なので、証明書が失効しないように自動更新プロセスを設定する必要があります。 これを行う1つの方法は、 cron
スケジューリングユーティリティ。 この場合、作成します cron
証明書を更新し、Nginx構成をリロードするスクリプトを定期的に実行するジョブ。
を作成しましょう ssl_renew.sh
証明書を更新するためのファイル:
- nano ssl_renew.sh
次のコードを追加します。 ディレクトリ名をroot以外のユーザーに置き換えることを忘れないでください。
#!/bin/bash
cd /home/sammy/drupal/
/usr/local/bin/docker-compose -f docker-compose.yml run certbot renew --dry-run && \
/usr/local/bin/docker-compose -f docker-compose.yml kill -s SIGHUP webserver
このスクリプトは次のように変更されます ~/drupal
プロジェクトディレクトリと以下を実行します docker-compose
コマンド。
-
docker-compose run
:これは開始しますcertbot
コンテナとオーバーライドcommand
私たちのcertbot
サービス定義。 を使用する代わりにcertonly
サブコマンド、私たちは使用していますrenew
ここのサブコマンド。有効期限が近づいている証明書を更新します。 含まれています--dry-run
スクリプトをテストするには、ここでオプションを選択してください。 -
docker-compose kill
:これは送信しますSIGHUP
への信号webserver
Nginx構成をリロードするコンテナー。
次のコマンドを実行して、ファイルを閉じて実行可能にします。
- sudo chmod +x ssl_renew.sh
次に、 root
指定された間隔で更新スクリプトを実行するためのcrontabファイル:
- sudo crontab -e
このファイルを初めて編集する場合は、次のコマンドでファイルを開くためのテキストエディタを選択するように求められます。
Outputno crontab for root - using an empty one
Select an editor. To change later, run 'select-editor'.
1. /bin/nano
2. /usr/bin/vim.basic
3. /usr/bin/vim.tiny
4. /bin/ed
Choose 1-4 [1]:
...
ファイルの最後に、次の行を追加して、 sammy
あなたのユーザー名で:
...
*/5 * * * * /home/sammy/drupal/ssl_renew.sh >> /var/log/cron.log 2>&1
これにより、ジョブ間隔が5分ごとに設定されるため、更新要求が意図したとおりに機能したかどうかをテストできます。 ログファイルも作成しました。 cron.log
、ジョブからの関連する出力を記録します。
5分後、 tail
チェックするコマンド cron.log
更新要求が成功したかどうかを確認するには、次のようにします。
- tail -f /var/log/cron.log
更新が成功したことを確認する出力が表示されます。
Output** DRY RUN: simulating 'certbot renew' close to cert expiry
** (The test certificates below have not been saved.)
Congratulations, all renewals succeeded. The following certs have been renewed:
/etc/letsencrypt/live/your_domain/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
** (The test certificates above have not been saved.)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
プレス CTRL+C
やめるには tail
処理する。
これで、crontabファイルを変更して、週の2日ごとの午前2時にスクリプトを実行できるようになりました。 crontabの最終行を次のように変更します。
...
* 2 * * 2 /home/sammy/drupal/ssl_renew.sh >> /var/log/cron.log 2>&1
終了してファイルを保存します。
それでは、を削除しましょう --dry-run
からのオプション ssl_renew.sh
脚本。 まず、それを開きます:
- nano ssl_renew.sh
次に、内容を次のように変更します。
#!/bin/bash
cd /home/sammy/drupal/
/usr/local/bin/docker-compose -f docker-compose.yml run certbot renew && \
/usr/local/bin/docker-compose -f docker-compose.yml kill -s SIGHUP webserver
私たちの cron
ジョブは、SSL証明書が適格になったときに更新することにより、SSL証明書の有効期限を処理します。
結論
このチュートリアルでは、Docker Composeを使用して、NginxWebサーバーでDrupalインストールを作成しました。 このワークフローの一環として、Drupalサイトに関連付けたいドメインのTLS / SSL証明書を取得し、必要に応じてこれらの証明書を更新するためのcronジョブを作成しました。
Dockerについて詳しく知りたい場合は、Dockerトピックページをご覧ください。