ホームページ  >  記事  >  バックエンド開発  >  Dockerでnginxリバースプロキシを作成する

Dockerでnginxリバースプロキシを作成する

大家讲道理
大家讲道理オリジナル
2017-05-28 09:32:542342ブラウズ

リバースプロキシサーバーは、通常Webサーバーの前に配置され、Webサーバー自体にはないアタッチメント機能を提供できるサーバーです。

たとえば、リバース プロキシは、SSL 終了、負荷分散、リクエスト ルーティングキャッシュ、圧縮、さらには A/B テストを提供できます。

Docker コンテナーを使用して Web サービスを実行する場合、リバース プロキシを実行するとデプロイを簡素化できます。

**

Docker にリバース プロキシを使用する理由

**
Docker コンテナにはランダムな IP とポートが割り当てられるため、クライアントの観点からこれらのコンテナを見つけることが困難になります。デフォルトでは、これらの IP とポートはプライベートであり、ホストにバインドされていない限り、外部からアクセスできません。

コンテナをホストにバインドすると、コンテナが同じポートで実行されなくなります。たとえば、ポート 80 にバインドできる Docker は一度に 1 つだけです。さらに、これにより、新しいバージョンのコンテナのデプロイが複雑になります。新しいバージョンは、古いバージョンがサービスを停止した後にのみサービスを開始できるためです。

リバース プロキシは、ダウンタイムをゼロにすることで信頼性を向上させながら、上記の問題を解決できます。

**

リバース プロキシ構成の生成

**

リバース プロキシの構成のセットアップは、コンテナの起動時と停止時に行う責任のある作業です。多くの場合、構成を手動で 更新する必要がありますが、これには時間がかかり、エラーが発生しやすくなります。

幸いなことに、docker はリモート呼び出し API を提供します。これは簡単に観察でき、コンテナーの IP とポート、既に設定されたメタデータにアクセスできます。さらに、docker は、コンテナーの開始時と停止時に通知を送信するために使用できるリアルタイム event API も提供します。これらの API を使用して、リバース プロキシ構成を自動的に生成できます。

docker-gen は小さなアプリケーションです。 Docker の API を使用して、コンテナーのメタデータをテンプレートにインポートします。テンプレートを生成した後、それを使用してサービスを再起動できます。

docker-gen を使用すると、nginx 構成を自動的に生成し、構成が変更されたときに nginx をリロードできます。 Docker のログ管理にも同様の方法を使用できます。

**

docker 用の nginx リバース プロキシ

**
次の nginx テンプレートの例を使用して、docker コンテナーのリバース プロキシ構成を生成できます。このテンプレートは golang を使用します。 groupby テンプレート 関数 は、実行中のコンテナ をグループ にグループ化するために使用されます。グループ化は、VIRTUAL_HOST 環境 変数 に基づいています。この方法により、コンテナの走査が簡素化され、負荷分散されたバックエンドが生成され、ダウンタイムのないデプロイもサポートされます。

{{ 範囲

コンテナ := groupBy "Env.VIRTUAL_HOST" }}
アップストリーム {{

ホスト }} {

{ { 範囲

値 := コンテナ }}
{{ with

アドレス := インデックス value.Addresses 0 }}
サーバー{ {

アドレス.IP }}:{{ $アドレス.ポート }}; {{
終了 }} {{ 終了 }}

}

サーバー {

#ssl_cert
ificate /etc/nginx/certs/demo.pem; #ssl_certificate_key
/etc/nginx/certs/demo.key;

gzip_types text/plain text/css application/json application/x-javascript
           text/xml application/xml application/xml+rss text/javascript;

server_name {{ $host }};

location / {
    proxy_pass http://{{ $host }};
    include /etc/nginx/proxy_params;
}
}

{{ end }}


このテンプレートは次のコマンドを使用して実行されます:

docker-gen -only-exused -watch -notify " /etc/init.d/nginx reload” templates/nginx.tmpl /etc/nginx/sites-enabled/default

-only-exposed - 仅使用暴露出端口的容器.
-watch - 运行后,观察容器的事件,并重新生成模板.
-notify "/etc/init.d/nginx reload" - 重新加载nginx.
templates/nginx.tmpl - nginx模板.
/etc/nginx/sites-enabled/default - 目标文件.

以下は、demo1 と Demon2 の 2 つのコンテナで構成されたテンプレートです

upstream Demon1.localhost {

サーバー 172.17.0.4:5000; サーバー 172.17.0.3:5000;

}

サーバー {
#ssl_certificate /etc/nginx/certs/demo.pem; #ssl_certificate_key /etc/nginx/certs/demo.key;

gzip_types text/plain text/css application/json application/x-javascript
           text/xml application/xml application/xml+rss text/javascript;

server_name demo1.localhost;

location / {
    proxy_pass http://demo.localhost;
    include /etc/nginx/proxy_params;
}

}

アップストリームdemo2.localhost {

サーバー 172.17.0.5:5000;

}

サーバー {
#ssl_certificate /etc/nginx/certs/demo.pem; #ssl_certificate_key /etc/nginx/certs/demo.key;

gzip_types text/plain text/css application/json application/x-javascript
           text/xml application/xml application/xml+rss text/javascript;

server_name demo2.localhost;

location / {
    proxy_pass http://demo2.localhost;
    include /etc/nginx/proxy_params;
}
}


**

試してみましょう

**

私が作成したビルドを試すことができます。 https://

index.docker.io/u/jwilder/nginx-proxy/

nginxプロキシコンテナを実行します:



docker run -e VIRTUAL_HOST=foo.bar.com -t …

HTTPS を使用していて他のコンテナを実行したい場合は、
git
hub でプロジェクトをチェックアウトして詳細を確認できます。

**

結論

**

Docker コンテナーの nginx リバース プロキシ構成の生成は、docker API を使用して自動的に行うことができます。このアプローチにより、展開が簡素化され、可用性が向上します。 このソリューションは、単一ホスト上で実行されているコンテナーにとって非常に便利です。分散ホストの構成依存関係サービス検出を提供します。 Docker サービスが何を検出したかを調べて、解決策を見つけることができます。


翻訳。元のテキストを参照してください: http://jasonwilder.com/blog/2014/03/25/automated-nginx-reverse-proxy-for-docker/

リバース プロキシ サーバーは、通常、サーバーの前に配置されるサーバーです。 Web サーバー自体には備わっていないアタッチメント機能を提供できます。
たとえば、リバース プロキシは、SSL 終了、負荷分散、リクエスト ルーティング、キャッシュ、圧縮、さらには A/B テストを提供できます。

Docker コンテナーを使用して Web サービスを実行する場合、リバース プロキシを実行するとデプロイを簡素化できます。

**

Docker にリバース プロキシを使用する理由

**

Docker コンテナにはランダムな IP とポートが割り当てられるため、クライアントの観点からこれらのコンテナを見つけることが困難になります。デフォルトでは、これらの IP とポートはプライベートであり、ホストにバインドされていない限り、外部からアクセスできません。 コンテナをホストにバインドすると、コンテナが同じポートで実行されなくなります。たとえば、ポート 80 にバインドできる Docker は一度に 1 つだけです。さらに、これにより、新しいバージョンのコンテナのデプロイが複雑になります。新しいバージョンは、古いバージョンがサービスを停止した後にのみサービスを開始できるためです。

リバース プロキシは、ダウンタイムをゼロにすることで信頼性を向上させながら、上記の問題を解決できます。

**

リバース プロキシ構成の生成

**

リバース プロキシの構成のセットアップは、コンテナの起動時と停止時に行う責任のある作業です。多くの場合、構成を手動で更新する必要がありますが、これには時間がかかり、エラーが発生しやすくなります。

幸いなことに、docker は、既に設定されたメタデータを使用して、コンテナーの IP とポートを簡単に観察してアクセスできるリモート呼び出し API を提供します。さらに、docker は、コンテナーの開始時と停止時に通知を送信するために使用できるリアルタイム イベント API も提供します。これらの API を使用して、リバース プロキシ構成を自動的に生成できます。

docker-gen は小さなアプリケーションです。 Docker の API を使用して、コンテナーのメタデータをテンプレートにインポートします。テンプレートを生成した後、それを使用してサービスを再起動できます。

docker-gen を使用すると、nginx 構成を自動的に生成し、構成が変更されたときに nginx をリロードできます。 Docker のログ管理にも同様の方法を使用できます。

**

docker 用の nginx リバース プロキシ

**

次の nginx テンプレートの例を使用して、docker コンテナーのリバース プロキシ構成を生成できます。このテンプレートは golang を使用しています。 groupby テンプレート関数は、実行中のコンテナーをグループ化するために使用されます。グループ化は、VIRTUAL_HOST 環境変数に基づいています。この方法により、コンテナの走査が簡素化され、負荷分散されたバックエンドが生成され、ダウンタイムのないデプロイもサポートされます。 {{ 範囲


コンテナ := groupBy

"Env.VIRTUAL_HOST" }} アップストリーム {{

ホスト }} {

{{ 範囲

値 := コンテナ }}
アドレス := インデックス

値 .アドレス 0 }}
サーバー {{


アドレス.IP }}:{{ $アドレス.ポート }}; {{ 終了 }}
{{ 終了 }}
}

サーバー {
#ssl_certificate /etc/nginx/certs/demo.pem; #ssl_certificate_key /etc/nginx/certs/demo.key;

gzip_types text/plain text/css application/json application/x-javascript
           text/xml application/xml application/xml+rss text/javascript;

server_name {{ $host }};

location / {
    proxy_pass http://{{ $host }};
    include /etc/nginx/proxy_params;
}

}
{{ end }}

このテンプレートは次のコマンドを使用して実行されます:

docker-gen -only-exused -watch -notify “/etc/ init .d/nginx reload” templates/nginx.tmpl /etc/nginx/sites-enabled/default

-only-exposed - 仅使用暴露出端口的容器.
-watch - 运行后,观察容器的事件,并重新生成模板.
-notify "/etc/init.d/nginx reload" - 重新加载nginx.
templates/nginx.tmpl - nginx模板.
/etc/nginx/sites-enabled/default - 目标文件.

以下は、demo1 と demo2 の 2 つのコンテナで構成されたテンプレートです
upstream Demon1.localhost {

サーバー 172.17.0.4:5000; サーバー 172.17.0.3:5000;
}

サーバー {
#ssl_certificate /etc/nginx/certs/demo.pem; #ssl_certificate_key /etc/nginx/certs/demo.key;

gzip_types text/plain text/css application/json application/x-javascript
           text/xml application/xml application/xml+rss text/javascript;

server_name demo1.localhost;

location / {
    proxy_pass http://demo.localhost;
    include /etc/nginx/proxy_params;
}

}

アップストリームdemo2.localhost {
サーバー 172.17.0.5:5000;
}

サーバー {

#ssl_certificate /etc/nginx/certs/demo.pem; #ssl_certificate_key /etc/nginx/certs/demo.key;

gzip_types text/plain text/css application/json application/x-javascript
           text/xml application/xml application/xml+rss text/javascript;

server_name demo2.localhost;

location / {
    proxy_pass http://demo2.localhost;
    include /etc/nginx/proxy_params;
}

}

**


試してみましょう

**

私が作成したビルドを試すことができます。 https://index.docker.io/u/jwilder/nginx-proxy/

nginx プロキシ コンテナを実行します:

docker run -e VIRTUAL_HOST=foo.bar.com -t …

if HTTPS を使用しており、他のコンテナを実行したい場合は、github 上のプロジェクトで詳細を確認してください。

**結論

**
Docker コンテナーの nginx リバース プロキシ構成の生成は、docker API を使用して自動的に行うことができます。このアプローチにより、展開が簡素化され、可用性が向上します。

このソリューションは、単一ホスト上で実行されるコンテナーにとって非常に便利です。分散ホストの構成依存関係サービス検出を提供します。 Docker サービスが何を検出したかを調べて、解決策を見つけることができます。

以上がDockerでnginxリバースプロキシを作成するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。