dockerでNignxのリバースプロキシとwebアプリをlinkしたローカル開発環境を作る

前に仕事で作ったdockerを使ったwebアプリの開発環境の覚書です。

実環境はAWSで動いていて、ALBがhttpsでリクエストを受けてALBとwebアプリはhttpで通信します。このような構成をdockerで作りたかったわけです。 簡単な概要はこんな図になります。

f:id:masami256:20180724230335p:plain

ALBのところをNginxのリバースプロキシに置き換えて作りました。

Nginxのリバースプロキシはこんな設定です。

server {
       listen         443;
       server_name    www.webapp-test.local;
       ssl on;
       ssl_certificate      /etc/nginx/server.crt;
       ssl_certificate_key  /etc/nginx/server.key;

       location / {
             proxy_set_header Host $host;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header X-Forwarded-Proto https;
             proxy_set_header X-Forwarded-Host $host;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

             # name is docker's link alias.
             proxy_pass http://local.webapp-test.local:3000/;
             proxy_redirect http:// https://;
       }
}

アプリの方でX-Forwarded-*を参照するのでセットしたり、hostヘッダはそのまま流したりしてます。 server_nameは実際にはちゃんとしたサーバ名ですがここではこんな名前にしてます。この名前はdocker-compose.ymlファイルのlinkで使う名前と合わせています。 www.webapp-test.localがブラウザでアクセスするURLになって、proxy_passで記述しているのがアプリのURLですね。どっちもlinkする時に使います。

Dockerfileはこの程度です。ベースのイメージは軽めなやつがよかったのでalpineを使ってます。

FROM alpine:latest

RUN apk update && \
apk add nginx && \
mkdir -p /run/nginx && \
rm -rf /var/cache/apk/*

COPY nginx/nginx.conf /etc/nginx/nginx.conf
COPY nginx/server.conf /etc/nginx/conf.d/server.conf

COPY nginx/server.crt /etc/nginx/server.crt
COPY nginx/server.key /etc/nginx/server.key

CMD ["/usr/sbin/nginx", "-g", "daemon off;"]

webアプリの方はDockerfileとかは特に変わったことはしてません。webaアプリのほうにあるdocker-compose.ymlでlinkしてあげるだけです。

version: '2'

services:
  webapp:
    build: .
    image: webapp
    hostname: local
    domainname: local.webapp-test.local
  proxy:
    image: local_dev_proxy
    ports:
      - 443:443
    links:
      - webapp:local.webapp-test.local
    hostname: www
    domainname: www.webapp-test.local

webappがwebアプリ、proxyがリバースプロキシです。hostとdomainnameはNginxの設定と合わせています。proxyのほうは443ポートを公開してます。ホストからアクセスする時は普通にhttpsの443番ポートを使います。で、proxyからwebappにアクセスを流したいのでlinkを使ってます。 あ、リバースプロキシもdocker-compose.yml使ってビルドしていて、名前はlocal_dev_proxyとしてます。

docker-compose upでwebアプリとリバースプロキシを起動しておいてcurlでアクセスを確認するとこうなります。

f:id:masami256:20180724232128p:plain

とまあ、ローカルの開発環境でALBの代わりにNginxでリバースプロキシを作ったというめもでした。

Docker実践ガイド impress top gearシリーズ

Docker実践ガイド impress top gearシリーズ