The dawn of modern programmers

現代プログラマーの朝焼け

nginx Reverse Proxy on Docker

Why we use nginx reverse proxy

昨今、多くのサービス、システムで Microservices Architecture (MSA) が採用されるようになっています。 MSA では各アプリケーション(サービス)は独立した Web アプリケーションとして構築・配置されます。 利用ユーザーはあくまでサービスの集合を”アプリケーション” として利用しているため、利用ユーザーがアクセスする URL は1つに統合されているべきです。 また、各 Web アプリケーションごとに DNS の設定や、SSL 証明書の設定、管理などの運用作業の負荷は思いのほか高く、またミスによる障害が発生する要因ともなります。 このような課題に対応するために Reverse Proxy を利用します。 この記事では Reverse Proxy を nginx (軽量な Web Server)を利用して、Docker Container として稼働させる方法について説明します。

What is pass proxy

この記事では nginx の Reverse Proxy 機能の中でも “pass proxy” の設定について説明します。 pass proxy でどのように Web アプリケーションにアクセスするのかは下記の図を参照してください。 ここでは www.eshop.com というアドレスとルートパスによって各アプリケーションに HTTP リクエストを Porxy するようにしています。

f:id:chegue:20170330123514p:plain

Applciation Application Address Proxy Address
Catalog 10.0.0.1 https://www.eshop.com/catalog
Basket 10.0.0.2 https://www.eshop.com/basket
Order 10.0.0.3 https://www.eshop.com/order

How to configure nginx.

nginx pass proxy の設定は nginx.conf ふぃあるに記述します。 下記はサンプルです。

設定は下記の通りです。 * server セクション で nginx サーバーの DNS 名を指定します。 * location セクションに HTTP 要求のパスを記載します。 * proxy_pass セクションに Porxy する Web アプリケーションの IP アドレスを指定します。

この設定により、各アプリケーションの IP アドレスを外部に公開する必要がなくなります。

e.g. Pass proxy from www.eshop.com to 10.0.0.1

http {
    include /etc/nginx/mime.types;
    default_type    application/octet-stream;

    sendfile    on;
    keepalive_timeout   65;
    server{
        server_name    www.eshop.com;
        proxy_set_header    Host    $http_host;

        location /catalog/ {
            proxy_pass    http://10.0.0.1/;
        }
    }
}

How to run nginx pass proxy

nginx を Docker Container として実行するには下記のコマンドを利用します。(簡単!)

 docker run --name nginx-pass-proxy -v ./nginx.conf:/etc/nginx/nginx.conf:ro -d nginx

次回以降は、

  • 動的な proxy_pass の設定
  • SSL による暗号化とアクセラレーション

について記事にしたいと思います。