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アドレスは変わるかもしれません。)