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

Dockerを使用して自動SSL生成でNginxリバースプロキシを設定する

リバースプロキシとは何ですか?その利点は何ですか?

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

なぜそのような設定を使用するのですか?それにはいくつかの理由があります。この設定は、ロードバランサーの設定、キャッシュ、または攻撃からの保護に使用できます。

ここでは詳細については説明しません。代わりに、リバースプロキシの概念を利用して、同じサーバー上に複数のサービスを設定する方法を紹介します。

上で見たものと同じ画像を撮ります。できることは、リバースプロキシモードで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つのボリュームを宣言しました。これらは、コンテナがダウンした後でも確実に保持したい永続データです。 htmlvhost ボリュームは、次の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ホームサーバーをインストールする
  • 同じサーバーに複数の談話コンテナをインストールする

このようなその他の記事については、ニュースレターを購読するか、メンバーになることを検討してください。ご不明な点がございましたら、お気軽に下記にコメントしてください。


Linux
  1. Nginxを使用したリバースプロキシ:ステップバイステップのセットアップガイド

  2. Ubuntu20.04でリバースプロキシとしてNginxを設定する方法

  3. Ubuntu 20.04でリバースプロキシとしてNginxを設定する-ステップバイステップガイド?

  1. Nginxリバースプロキシを設定する方法

  2. リバースプロキシとしてNginxを使用してUbuntu16.04にOdoo10をインストールする方法

  3. Docker Compose、Nginx、SSL を使用した Apache で WordPress をインストールする

  1. NGINXを使用してHTTP(S)、SSH、およびMySQL/MariaDBのリバースプロキシを実行するためのガイド

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

  3. リバースプロキシとしてNginxを使用してUbuntu16.04にOdoo11をインストールする方法