NginXコンテナを使って、コンテナからコンテナへリバースプロキシ
2017.05.02
さくらの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を使って生成してみた。
上記で作った.keyからパスフレーズを抜くために、下記コマンドを実行した。
パスフレーズを抜いておかないと、NginXに.keyを設定するときにパスフレーズを求められてエラーが出る。
ファイルが生成できたらsserver.keyとserver.crtをディレクトリnginxの中へ。
あとは三つほどファイルを書き換え。
docker-compose.yml
コンテナnginxの待ち受けポート変更
↓
Dockerfile
オレオレ証明書の配置
nginx.conf
SSLを使う設定
↓
すべて済んだら"docker-compose build"をしてから"docker-compose up"。うまくいってればlocalhostへHTTPSアクセスでレスポンスが得られる。
おまけ
nginxのコンテナはhubに何種類かあるが、OSがalpineのイメージもある。alpineはとても軽量で5MB程度のサイズしかないので、そっちを使うと合理的だったり。
↓
リバースプロキシを設置する場所は二か所が考えられる。アプリケーションと同一のコンテナ内、あるいはその外。このリバースプロキシは環境によっては不必要。今回はアプリケーションのコンテナの外に置く。そういうわけで、リバースプロキシコンテナを用意して、それを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