NginxとDockerでリバースプロキシサーバーを作る

Dockerコンテナ内でnginxを動かし、リバースプロキシサーバーを作る簡単な例を紹介します。

プロダクションで利用する際はnginxの設定をもっとしっかりしないといけませんが、この記事ではそのあたりは端折ります。

コード

Dockerfile

nginx.confを /etc/ginx に追加するだけのものすごく簡単なものです。イメージについては2019年4月9日現在の最新バージョンである nginx:1.15.10 を使用しています。

FROM nginx:1.15.10
COPY nginx.conf /etc/nginx/

nginx.conf

nginxの設定ファイルです。/proxy/ からはじまるパスへのリクエストを http://example.com に振り分けるようにします。それ以外は /usr/share/nginx/html (ドキュメントルート)から配信するようにしています。

また、ログに $upstream_addr を追加するようにしています。これでプロキシ先のアドレスがログに含まれるようになります。

ちなみに、nginxの公式イメージでは、 /var/log/nginx/access.log/dev/stdout (標準出力)のエイリアスになっています。(そのイメージをもとに作っている)今回のイメージでも同様です。標準出力に吐き出されたログは docker logs コマンドなどでみることができます。

user nginx;
worker_processes 1;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
  worker_connections  1024;
}

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

  log_format main '"$request" $status $upstream_addr';

  access_log /var/log/nginx/access.log  main;

  server {
    location / {
        root /usr/share/nginx/html;
    }

    location /proxy/ {
        proxy_pass http://example.com/;
    }
  }
}

起動

イメージを作成してコンテナを実行します。-p 3000:80 で、ホストのポート3000でコンテナのポート80にアクセスできるようにしています。

$ docker run -d -p 3000:80 $(docker build .)

確認

ブラウザなどで http://localhost:3000/ にアクセスすると Welcome to nginx! のページが、 http://localhost:3000/proxy/ にアクセスすると Example Domain のページが見れ、正しく動いていることがわかります。

また、以下のようにコンテナのログを確認してみます。

$ docker logs <コンテナid>
"GET / HTTP/1.1" 200 -
"GET /proxy/ HTTP/1.1" 200 93.184.216.34:80

うまくいっていることがわかります。(example.comのIPアドレスは変わるかもしれません。)