どのようにNGinxのDockerの逆プロキシを設定するには?


導入


ローカルサーバーを設定し、それに基づいてフロントエンドアプリケーションを作成したときの時間を想像してください.アプリケーションのAPIにアクセスするには、例を入力します.COM : 3000とアプリケーションでは、この例のようなものを入力します.com : 4040 .つのアプリケーションのための複数のポートが異なるページにアクセスすることができます:ホーム、ダッシュボード、連絡先、テーブル、例えば、複数のアプリケーションのための複数のポートを覚えて想像してください.
APIにアクセスするためにこのようなことをするのは良いことではありません.COM/APIとアプリケーションの例:例.com/app.馬鹿なポートをタイプする代わりに、複数のコンテナのルートを確立することができます、そして、それらのルートURLは何でもありえました.Dockerを使用して逆プロキシを実行することが容易になります.

何がプロキシですか?


それをアナロジーを使って説明しようとしましょう.あなたがあなたの大好きなレストランに入ると言いましょう.お腹がすいている.好きな食べ物を食べたい.あなたは給仕に食べ物を注文します.ウェイターはあなたの注文を取り、台所に行きます.ウェイターは、あなたがウェイターから尋ねたすべてのものを料理するためにシェフに尋ねます.シェフは食べ物を調理した.給仕はあなたの食べ物をもたらします.簡単?
注意する重要なこと:あなたはウェイターを要求しました.ウェイターは台所に行くことなくあなたの要求を果たした.シェフは誰がその食べ物であるかを知りません.
この例では、ウェイターはプロキシであり、シェフはインターネットです.プロキシは、あなたとインターネットの間のファイアウォールとして機能します.プロキシは、セキュリティ、プライバシー、およびその他の機能レベルを提供します.あなたはナイジェリアでプロキシサーバーを設定することができます.その後、インターネット上でHTTPリクエストを行うことができますし、その要求は、簡単に言語でインターネット上で最初にナイジェリアに行くだろう.
プロキシのもう一つの例は、1つの会社またはビルディングの複数のコンピュータであるでしょう.会社の中のすべてのコンピュータは、会社の最高IPアドレスの下でIPアドレスを持ちます.すべてのインターネットリクエストは1つのIPアドレスの下で行われます.
プロキシはすべての安全な外部要求を作ることです.

リバースプロキシとは


私がここでアナロジーを投げないならば、それは公平でありません.この類推は古い.免責事項:私を判断しないでください、私は技術精鋭の人です.あなたが朝起きたと言いましょう、そして、あなたはあなたのドアに郵便配達人を見ます.郵便配達人は、複数の文字、請求書、はがき、および文字の他のフォームを与える.すべての文字は、別の場所から送信されますが、それらはすべてあなたに適切な場所で終了します.
注:送信者はあなたと直接連絡する必要はありませんでした.郵便配達人は、複数の源からあなたのために手紙を取り出しました.
この例では、Postmanはリバースプロキシで、ソースはクライアントで、適用されます.クライアントはHTTPリクエストをあなたのアプリケーションに話しかけます.クライアントは、クライアントがこの要求を作成するようにアプリケーションを見たいと思っています.COM .しかし、逆に、プロキシはこの要求を例に変えます.com : 8080 .クライアントまたはユーザーがAPIを見たい場合、クライアントはこの要求を作成します.COM/API、しかし、シーンの後ろに、逆プロキシはそれを例に変えます.com : 3000リバースプロキシは、Webサーバーの前に座って、サーバーにクライアント要求を転送します.リバースプロキシは通常、セキュリティ、パフォーマンス、および信頼性を高めるために実装されます.
逆プロキシを使用すると、安全な内部要求を行うことができます.

何がDockerですか?


Dockerは、コンテナを使用してアプリケーションを作成、実行、および配備するための人気のエンタープライズPAA(プラットフォームとしてのサービス)です.コンテナーは、開発者が必要なモジュール、ライブラリ、依存関係を持つアプリケーションをパッケージ化し、パッケージの一つとして展開します.Dockerは既存のホストオペレーティングシステムに座り、仮想マシン上で軽量なコンテナを作成してアプリケーションを実行することができます.したがって、開発者は多くのコンテナを作成し、いくつかのアプリケーションを1つのホストオペレーティングシステムで実行できます.企業は、個々のアプリケーションを展開するために複数のOSを購入するお金を使う必要はありません.

どのようにセットアップNGinxの


Dockerを使ってNGNXリバースプロキシを設定するユースケースを作りましょう.Dockerコンテナの内部では、ホストにバインドされていない限り、プライベートポートとIPアドレスにアクセスすることはできません.単一のポート80を介して複数のコンテナ上で動作する複数のWebアプリケーションにアクセスするために、リバースプロキシを使用することができます.ポート80にバインドされるnginxコンテナをDockerホストのポート80に設定し、複数のコンテナ上で実行しているWebアプリケーションにリクエストを転送します.

我々は、Webサービスのための2つのコンテナまたはどんな言語ででも書かれることができた2つのアプリケーションをセットアップする必要があります.しかし、チュートリアルのために、単純なインデックスで2つのウェブサービスを作成しましょう.HTMLページ.
Webサービスの構造1
webservice1
├── docker-compose.yml
└── index.html
cd ~
mkdir webservice1
cd webservice1
vi docker-compose.yml
次に、このYAMLコードをファイルにペーストします.
version: '2'
services:
app:
image: nginx:1.9
volumes:
- .:/usr/share/nginx/html/
expose:
- "80"
Ouick tip: Make sure that the indentations for all the YAML files correctly formatted. You can also use the VS Code to format them correctly.

さて、WebService 1用の簡単なHTMLページを作りましょう.
vi index.html
<!DOCTYPE html>
<html>
<head>
<title>Web service 1</title>
</head>
<body>
<h1>Welcome to website 1</h1>
</body>
</html>
さて、DocService Commandコマンドを使用してWebService 1を構築します
docker-compose build
コンテナを起動する
docker-compose up -d
全てのコンテナをリストする
docker ps -a 
あなたのコンテナを名前で見るべきです.
site2_app_1
同様に、WebService 2の第2コンテナを作成します
cd ~
mkdir webservice2
cd webservice2
vi docker-compose.yml
YAMLファイル用のコード:
version: '2'
services:
app:
image: nginx:1.9
volumes:
- .:/usr/share/nginx/html/
expose:
- "80"
インデックスファイルの作成
vi index.html
シンプルなHTMLレスポンスを作成
<!DOCTYPE html>
<html>
<head>
<title>Web service 2</title>
</head>
<body>
<h1>Welcome to website 2</h1>
</body>
</html>
Dockerコマンドを使用してWebService 2コンテナをビルドする
docker-compose build
コンテナを起動する
docker-compose up -d
すごい!今、私たちは2つの実行中のdockerコンテナを持っています.注意:両方のこれらのコンテナは、ポート80で実行されることになっていますので、それに応じてリクエストを要求するプロキシを設定しなければなりません.ではプロキシを設定しましょう.
これはプロキシのファイル構造になります.
proxy/
├── backend-not-found.html
├── default.conf
├── docker-compose.yml
├── Dockerfile
├── includes
│   ├── proxy.conf
│   └── ssl.conf
└── ssl
├── site1.crt
├── site1.key
├── site2.crt
└── site2.key
必要なファイルを全て作成しましょう.
cd ~
mkdir proxy 
cd proxy 
touch Dockerfile
touch backend-not-found.html
touch default.conf
touch docker-compose.yml
mkdir includes
mkdir ssl
cd includes
touch proxy.conf
touch ssl.conf
dockerfileを作る
vi Dockerfile
FROM nginx:1.9

COPY ./default.conf /etc/nginx/conf.d/default.conf

COPY ./backend-not-found.html /var/www/html/backend-not-found.html

COPY ./includes/ /etc/nginx/includes/

COPY ./ssl/ /etc/ssl/certs/nginx/
DockerFilesはDocker画像を作成するために使用されます.その後Docker画像はDockerコンテナを作成するために使用されます.このdockfileでは、イメージは既存のNGNX Dockerイメージを参照してカスタムDockerイメージを作成します.次に、ローカルマシン上の既存のファイルをDocker画像にコピーすることで、イメージを構築します.私たちは基本的に設定ファイル、基本的なエラーのHTML、プロキシのいくつかの設定ファイルを追加し、証明書は、後で生成されます.
デフォルトの作成.conf
vi default.conf
# web service1 config.
server {
listen 80;
listen 443 ssl http2;
server_name site1.test;

# Path for SSL config/key/certificate
ssl_certificate /etc/ssl/certs/nginx/site1.crt;
ssl_certificate_key /etc/ssl/certs/nginx/site1.key;
include /etc/nginx/includes/ssl.conf;

location / {
include /etc/nginx/includes/proxy.conf;
proxy_pass http://site1_app_1;
}

access_log off;
error_log  /var/log/nginx/error.log error;
}

# web service2 config.
server {
listen 80;
listen 443 ssl http2;
server_name site2.test;

# Path for SSL config/key/certificate
ssl_certificate /etc/ssl/certs/nginx/site2.crt;
ssl_certificate_key /etc/ssl/certs/nginx/site2.key;
include /etc/nginx/includes/ssl.conf;

location / {
include /etc/nginx/includes/proxy.conf;
proxy_pass http://site2_app_1;
}

access_log off;
error_log  /var/log/nginx/error.log error;
}

# Default
server {
listen 80 default_server;

server_name _;
root /var/www/html;

charset UTF-8;

error_page 404 /backend-not-found.html;
location = /backend-not-found.html {
allow   all;
}
location / {
return 404;
}

access_log off;
log_not_found off;
error_log  /var/log/nginx/error.log error;
}
このNGinX設定ファイルでは、両方のWebサービスの主なサーバーコンポーネントがあります.両方のコンテナはnginxポート80を聞きます.両方のコンテナにアクセスするには、定義されているServerRange名でHTTP://site1.testまたはHTTP://site2.testを呼び出すことができます.両方のサーバーコンポーネントは、NGinxが適切なWebサービスコンテナに要求を指示するのに役立ちます.この設定によってnginxはデフォルトのエラーページの代わりにカスタムエラーHTMLを投げることもできます.両方のサーバーコンポーネントは、NGNXに適切な場所からSSL証明書を選択するように指示します.
Docker作成を作成します.気象研
vi docker-compose.yml
version: '2'
services:
proxy:
build: ./
networks:
- site1
- site2
ports:
- 80:80
- 443:443

networks:
site1:
external:
name: site1_default
site2:
external:
name: site2_default
Note: Make sure indentation is right when copying my file to the terminal.

ここでは、実際にプロキシを実装している主要な部分です.(技術的にはデフォルトでコンパイルしました.YMLファイルは、SITE 1とSITE 2という2つの外部ネットワークをプロキシに接続します.このプロキシのポート80/443の結合はDockerホストのポート80/443に実装されます.我々はすでにWebService用の2つのDockerコンテナを作成し、2つの外部Dockerネットワークを作成しました.
証明書とキーを作成する
Webサービス1
cd ssl
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout site1.key -out site1.crt
Webサービス2用
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout site2.key -out site2.crt
ではプロキシの標準設定を作成しましょう.
cd includes
vi proxy.conf
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_buffering off;
proxy_request_buffering off;
proxy_http_version 1.1;
proxy_intercept_errors on;
SSL認証とキーをデコードする標準SSL構成を作成します
vi ssl.conf
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-
ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-
SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-
GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-
AES128-SHAECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-
SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:
DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-
DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:
AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-
CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;
この構成は、暗号文を使用してSSL certsとキーをデコードするのに役立ちます.
ホスト名とIPアドレスを加えましょう
cd ~
vi /etc/hosts
172.31.30.78 site1.test
172.31.30.78 site2.test
これらはDockerホストのプライベートIPアドレスです.リクエストはDockerホストのポート80に来ますが、NGINXコンテナのポート80にリダイレクトされます.
最後にプロキシコンテナを作りましょう
docker-compose build
我々はコンテナを持って、今コンテナを実行する
docker-compose up -d
さて、3つの実行中のDockerコンテナを参照してください.Webサービスとプロキシコンテナ用の2つ.
docker ps -a
我々の逆のプロキシが働いているかどうか確かめましょう
curl site1.test
このレスポンスを見るべきです.
<!DOCTYPE html>
<html>
<head>
<title>Web service 1</title>
</head>
<body>
<h1>Welcome to website 1</h1>
</body>
</html>
大仕事!✨
コンテナ化されたアプリケーションの利点の一つは、アプリケーションを簡単に追加、配備できることです.デフォルトに設定を追加することで、Webサービスコンテナを追加できます.confと外部ネットワークをdockerに追加して、YAMLファイルを作成します.この例では、dockerとnginxを使用して逆プロキシを設定する方法を簡単に示します.複数のアプリケーションをDockerコンテナで実行していることを想像してください.設定を手動で心配する必要はありません.あなたは、単に別のブログのために話をする良い概念ですDocker APIを使用してプロセスを自動化することができます.
ブログを読んでくれてありがとう、私はそれはあなたがかなりユニークなコンセプトを理解するのを助けたことを願っています.
あなたが質問または懸念をするならば、私にコメントを残してください.