NginXコンテナを使って、コンテナからコンテナへリバースプロキシ

 さくらのArukasではWebアプリのコンテナをのっけたとき、HTTPSでアクセスするようになっている。アプリ側に証明書を入れて設定していなくてもそうなるので、リバースプロキシが適用されているんだろう。すごくありがたいことなのだが、デバッグがちょいややこしい。開発環境でもリバースプロキシを入れて、HTTPS→WebアプリコンテナへHTTPという流れを作ってやらにゃいかん。そうしなきゃcookieにトークンを入れてsecureフラグを立てたとき、そいつがクライアントとアプリケーションサーバのあいだで交換できなくなってしまう。
 リバースプロキシを設置する場所は二か所が考えられる。アプリケーションと同一のコンテナ内、あるいはその外。このリバースプロキシは環境によっては不必要。今回はアプリケーションのコンテナの外に置く。そういうわけで、リバースプロキシコンテナを用意して、それをHTTPSで動かすまでのメモ。

 とりあえず下記サイトにHTTPでのコンテナを分けたリバースプロキシの方法が載っているので同じものを準備。ただし二点だけ変更点あり。
https://www.sep.com/sep-blog/2017/02/27/nginx-reverse-proxy-to-asp-net-core-separate-docker-containers/
 ASP.NETのWebテンプレートの準備コマンドは変更
dotnet new -t web → dotnet new web
 あとDockerfileで指定しているaspnetcoreのバージョンは、1.0ではエラーが出たのでこれを1.1を使用した。

 で、とりあえず書いてあるとおりのコマンドを打って、composeでDockerを動かせばHTTP→HTTPをやってくれるリバースプロキシサンプルができあがる。次は左辺のHTTPをHTTPSにする。

 まず証明書を準備。本番では使わないのでオレオレで。ぼくはWindows10でLinuxSubsystemを使って生成してみた。
openssl genrsa -aes128 -out server.key 2048

openssl req -new -key server.key -sha256 -out server.csr
openssl x509 -in server.csr -days 365 -req -signkey server.key -sha256 -out server.crt

 上記で作った.keyからパスフレーズを抜くために、下記コマンドを実行した。
openssl rsa -in server.key -out  sserver.key

パスフレーズを抜いておかないと、NginXに.keyを設定するときにパスフレーズを求められてエラーが出る。
 ファイルが生成できたらsserver.keyとserver.crtをディレクトリnginxの中へ。

 あとは三つほどファイルを書き換え。
docker-compose.yml
コンテナnginxの待ち受けポート変更
docker-compose.yml

- "80:80"

  ↓
docker-compose.yml

- "443:443"


Dockerfile
オレオレ証明書の配置
Dockerfile

COPY server.crt /data/certs/server.crt
COPY sserver.key /data/certs/server.key


nginx.conf
SSLを使う設定
nginx.conf

listen 80;

   ↓
nginx.conf

listen *:443;
ssl on;
ssl_certificate /data/certs/server.crt;
ssl_certificate_key /data/certs/server.key;


 すべて済んだら"docker-compose build"をしてから"docker-compose up"。うまくいってればlocalhostへHTTPSアクセスでレスポンスが得られる。





おまけ
 nginxのコンテナはhubに何種類かあるが、OSがalpineのイメージもある。alpineはとても軽量で5MB程度のサイズしかないので、そっちを使うと合理的だったり。
Dockerfile

FROM nginx

  ↓
Dockerfile

FROM nginx:alpine
comment: 0