リバースプロキシとは何ですか?その利点は何ですか?
リバースプロキシとは何ですか?リバースプロキシは、他の多くのサーバーの前に配置され、クライアント要求を適切なサーバーに転送する一種のサーバーです。サーバーからの応答も受信され、プロキシサーバーによってクライアントに転送されます。

なぜそのような設定を使用するのですか?それにはいくつかの理由があります。この設定は、ロードバランサーの設定、キャッシュ、または攻撃からの保護に使用できます。
ここでは詳細については説明しません。代わりに、リバースプロキシの概念を利用して、同じサーバー上に複数のサービスを設定する方法を紹介します。
上で見たものと同じ画像を撮ります。できることは、リバースプロキシモードでDockerコンテナでNgnixサーバーを実行することです。他のWebサービスも、それぞれのコンテナーで実行できます。
Nginxコンテナーは、どのWebサービスがどのコンテナーで実行されているかを認識できるように構成されます。

これは、異なるサーバーで各サービスをホストするコストを節約するための良い方法です。リバースプロキシサーバーのおかげで、同じLinuxサーバーで複数のサービスを実行できます。
Nginxをリバースプロキシとして設定して、複数のサービスをDockerを使用する同じサーバー
上記の設定を構成する方法を紹介します。
これらの手順を使用すると、Nginxで実行されている複数のWebベースのアプリケーションコンテナをインストールできます。各スタンドアロンコンテナは、それぞれのドメインまたはサブドメインに対応しています。
まず、このチュートリアルに従うために必要なものを見てみましょう。
このチュートリアルを簡単に開始するには、次の知識が必要です。とはいえ、それらがなくてもうまくいくことができます。
- Linuxシステム/サーバー。 Linodeクラウドサービスを使用すると、Linuxサーバーを数分で簡単にデプロイできます。
- Linuxコマンドとターミナルに精通していること。
- Dockerの基本的な知識。
- LinuxサーバーにDockerとDockerComposeがインストールされている必要があります。 CentOSへのDockerとDockerComposeのインストールに関するガイドをお読みください。
- ドメインも所有している必要があります(サブドメインにサービスを設定できるようにするため)。
チュートリアルでは、ドメイン名の例としてdomain.comを使用しました。自分のドメインまたはサブドメインに応じて変更してください。
上記以外にも、次の点に注意してください。
ドメインのDNSレコードを変更する
ドメイン名プロバイダーのA/AAAAまたはCNAMEレコードパネルで、ドメインとサブドメイン(wwwを含む)の両方がサーバーのIPアドレスを指していることを確認してください。
これは参考のための例です:
ホスト名 | IPアドレス | TTL |
---|---|---|
domain.com | 172.105.50.178 | デフォルト |
* | 172.105.50.178 | デフォルト |
sub0.domain.com | 172.105.50.178 | デフォルト |
sub1.domain.com | 172.105.50.178 | デフォルト |
スペースを入れ替える
すべてのコンテナアプリを使いやすくし、デプロイ後にメモリが不足しないようにするには、システムに必要なスワップスペースが必要です。
システムで使用可能なRAMに応じて、いつでもスワップを調整できます。単一サーバー上のアプリコンテナのバンドルに基づいてスワップスペースを決定し、それらの累積RAM使用量を見積もることができます。
ステップ1:Nginxリバースプロキシコンテナを設定する
nginxリバースプロキシの設定から始めます。 「reverse-proxy」という名前のディレクトリを作成し、それに切り替えます:
mkdir reverse-proxy && cd reverse-proxy
docker-compose.yml
という名前のファイルを作成します 、VimやNanoなどのお気に入りのターミナルベースのテキストエディタで開きます。
nginxリバースプロキシには、jwilder/nginx-proxyイメージを使用します。以下をコピーしてdocker-compose.ymlファイルに貼り付けます。
version: "3.7"
services:
reverse-proxy:
image: "jwilder/nginx-proxy:latest"
container_name: "reverse-proxy"
volumes:
- "html:/usr/share/nginx/html"
- "dhparam:/etc/nginx/dhparam"
- "vhost:/etc/nginx/vhost.d"
- "certs:/etc/nginx/certs"
- "/run/docker.sock:/tmp/docker.sock:ro"
restart: "always"
networks:
- "net"
ports:
- "80:80"
- "443:443"
それでは、作成ファイルの重要な部分を見ていきましょう。
- html、dhparam、vhost、certsの4つのボリュームを宣言しました。これらは、コンテナがダウンした後でも確実に保持したい永続データです。
html
&vhost
ボリュームは、次のLet'sEncryptコンテナの展開で非常に重要になります。それらは連携して動作するように設計されています。 - Docker Sockerは、コンテナー内に読み取り専用でマウントされます。これは、リバースプロキシコンテナがnginxの構成ファイルを生成し、特定の環境変数を持つ他のコンテナを検出するために必要です。
- Dockerの再起動ポリシーは
always
に設定されています 。その他のオプションには、on-failure
が含まれます およびunless-stopped
。この場合、常により適切であるように思われました。 - ポート80と443は、それぞれhttpとhttpsのホストにバインドされています。
- 最後に、デフォルトのブリッジネットワークではなく、別のネットワークを使用します。
ユーザー定義のネットワークを使用することは非常に重要です。これは、プロキシされるすべてのコンテナを分離するのに役立ちます。また、リバースプロキシコンテナがクライアントを目的の/意図されたコンテナに転送し、コンテナが相互に通信できるようにします(これはデフォルトのブリッジネットワークでは不可能です)。icc
でない限りtrue
に設定されています デーモンの場合)。
YMLはタブとインデントについて非常に気難しいことを覚えておいてください。
ステップ2:自動SSL証明書生成用のコンテナーをセットアップする
このために、jrcs/letsencrypt-nginx-proxy-companionコンテナイメージを使用できます。
同じdocker-compose.yml
で 以前に使用したファイルに、次の行を追加します。
letsencrypt:
image: "jrcs/letsencrypt-nginx-proxy-companion:latest"
container_name: "letsencrypt-helper"
volumes:
- "html:/usr/share/nginx/html"
- "dhparam:/etc/nginx/dhparam"
- "vhost:/etc/nginx/vhost.d"
- "certs:/etc/nginx/certs"
- "/run/docker.sock:/var/run/docker.sock:ro"
environment:
NGINX_PROXY_CONTAINER: "reverse-proxy"
DEFAULT_EMAIL: "[email protected]"
restart: "always"
depends_on:
- "reverse-proxy"
networks:
- "net"
このサービス定義の場合:
- リバースプロキシコンテナに使用したのとまったく同じボリュームを使用しています。
html
およびvhost
LetsencryptのACMEチャレンジを成功させるには、ボリュームの共有が必要です。このコンテナは、/etc/nginx/certs
内に証明書を生成します 、コンテナ内。これが、このボリュームをリバースプロキシコンテナと共有している理由です。dhparam
ボリュームにはdhparamファイルが含まれます。ソケットは、特定の環境変数を持つ他のコンテナを検出するためにマウントされています。 - ここでは、2つの環境変数を定義しました。
NGINX_PROXY_CONTAINER
変数はリバースプロキシコンテナを指します。コンテナの名前に設定します。DEFAULT_EMAIL
各ドメイン/サブドメインの証明書を生成する際に使用されるメールです。 -
depends_on
オプションは、このサービスがリバースプロキシが最初に開始するのを待ってから、次に開始するように設定されています。 - 最後に、このコンテナも同じネットワークを共有します。これは、2つのコンテナが通信するために必要です。
ステップ3:ドッカー作成ファイルを完成させる
サービス定義が完了したら、次の行を使用してdocker-composeファイルを完成させます。
volumes:
certs:
html:
vhost:
dhparam:
networks:
net:
external: true
ネットワークnet
プロキシされたコンテナもこのネットワークを使用する必要があるため、は外部に設定されます。そして、ネットワークを離れてdocker-comspose
によって作成された場合 、ネットワーク名は現在のディレクトリによって異なります。これにより、奇妙な名前のネットワークが作成されます。
それ以外の場合、他のコンテナはそのネットワークを外部に設定する必要があります。そうしないと、それらの作成ファイルもこの同じディレクトリに存在する必要があり、いずれも理想的ではありません。
したがって、
を使用してネットワークを作成します docker network create net
以下は、docker-compose.yml
の全内容です。 ファイル。
version: "3.7"
services:
reverse-proxy:
image: "jwilder/nginx-proxy:latest"
container_name: "reverse-proxy"
volumes:
- "html:/usr/share/nginx/html"
- "dhparam:/etc/nginx/dhparam"
- "vhost:/etc/nginx/vhost.d"
- "certs:/etc/nginx/certs"
- "/run/docker.sock:/tmp/docker.sock:ro"
restart: "always"
networks:
- "net"
ports:
- "80:80"
- "443:443"
letsencrypt:
image: "jrcs/letsencrypt-nginx-proxy-companion:latest"
container_name: "letsencrypt-helper"
volumes:
- "html:/usr/share/nginx/html"
- "dhparam:/etc/nginx/dhparam"
- "vhost:/etc/nginx/vhost.d"
- "certs:/etc/nginx/certs"
- "/run/docker.sock:/var/run/docker.sock:ro"
environment:
NGINX_PROXY_CONTAINER: "reverse-proxy"
DEFAULT_EMAIL: "[email protected]"
restart: "always"
depends_on:
- "reverse-proxy"
networks:
- "net"
volumes:
certs:
html:
vhost:
dhparam:
networks:
net:
external: true
最後に、次のコマンドを使用して、これら2つのコンテナー(NgnixとLet's Encrypt)をデプロイできます。
docker-compose up -d
ステップ4:Ngnixリバースプロキシが機能していることを確認します
フロントエンドにサービスを提供するコンテナは、2つの環境変数を定義する必要があります。
VIRTUAL_HOST
:リバースプロキシ構成を生成するため
LETSENCRYPT_HOST
:必要な証明書を生成するため
これら2つの変数の値が正しいことを確認してください。次のように、リバースプロキシを使用してnginx-dummyimageを実行できます。
docker run --rm --name nginx-dummy -e VIRTUAL_HOST=sub.domain.com -e LETSENCRYPT_HOST=sub.domain.com -e VIRTUAL_PORT=80 --network net -d nginx:latest
前のコマンドで使用したサブドメインに移動すると、Ngnixサーバーからのメッセージが表示されます。

テストに成功したら、実行中のDockerコンテナを停止できます:
docker stop nginx-dummy
Ngnixリバースプロキシを使用しない場合は、停止することもできます:
docker-compose down
ステップ5:リバースプロキシを使用して他のサービスコンテナを実行する
プロキシできるように他のコンテナを設定するプロセスは非常に簡単です。
Nextcloudデプロイメントの2つのインスタンスですぐにそれを示します。まず、ここで何をしているのかをお話ししましょう。
コンテナは、フロントエンドを提供するポートを除外できます。リバースプロキシコンテナはそれを自動的に検出します。
(オプション)VIRTUAL_PORTを定義します
リバースプロキシコンテナがポートの検出に失敗した場合は、VIRTUAL_PORT
という名前の別の環境変数を定義できます。 フロントエンドにサービスを提供するポート、または「80」や「7765」など、プロキシするサービスを使用します。
DEFAULT_EMAIL
を上書きできます 電子メールIDを環境変数LETSENCRYPT_EMAIL
に設定することにより、変数を設定し、特定のコンテナ/Webサービスのドメイン/サブドメイン証明書の特定の電子メールアドレスを設定します。 。これはコンテナごとに機能します。
これらすべてを理解したところで、nginxプロキシコンテナを使用してプロキシされ、TLS(SSL / HTTPS)が有効になるNextcloudインスタンスをデプロイするコマンドを紹介します。
これは理想的な展開ではありません。次のコマンドは、説明の目的でのみ使用されます。
docker run --name nextcloud --network net -e VIRTUAL_HOST="sub0.domain.com" -e LETSENCRYPT_HOST="sub0.domain.com" -d nextcloud:19.0.2
この例では、リバースプロキシコンテナと同じネットワークを使用し、適切なサブドメインを使用して2つの環境変数を定義しました(それに応じて設定してください)。数分後、sub0.domain.comで実行されているNextcloudが表示されます。ブラウザで開いて確認します。
次のように、このような別のNextcloudインスタンスを別のサブドメインにデプロイできます:
docker run --name anothernextcloud --network net -e VIRTUAL_HOST="sub1.domain.com" -e LETSENCRYPT_HOST="sub1.domain.com" -d nextcloud:19.0.2
これで、同じサーバー上の別のサブドメインで実行されている別のNextcloudインスタンスが表示されるはずです。
この方法を使用すると、異なるサブドメインで提供される同じサーバーに異なるWebアプリをデプロイできます。これは、非常に便利です。
これで設定が完了したので、次の例を使用して実際の展開でこれを使用できます。
- Dockerを使用してMatrixSynapseホームサーバーをインストールする
- 同じサーバーに複数の談話コンテナをインストールする
このようなその他の記事については、ニュースレターを購読するか、メンバーになることを検討してください。ご不明な点がございましたら、お気軽に下記にコメントしてください。