Alpine Linuxで動作するNginxを使ってWebサーバーをHerokuにデプロイした時の話です.
要件
全てのリクエストを別のドメインにリダイレクトするだけのWebサーバーは,最も単純なWebサーバーの1つです.これをNginxで作成し,Herokuで公開します.
作り方
Dockerfile
Herokuによって割り当てられたポート番号をリッスンするために,起動時に$PORTという環境変数を読み込みます.
FROM nginx:alpine COPY default.conf.template /etc/nginx/conf.d/default.conf.template COPY nginx.conf /etc/nginx/nginx.conf CMD /bin/sh -c "envsubst '\$PORT' < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf" && nginx -g 'daemon off;'
nginx.conf
worker_processes 1;
error_log stderr;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
access_log /dev/stdout;
server_tokens off;
include /etc/nginx/conf.d/*.conf;
}
default.conf.template
server {
listen $PORT;
server_name redirect.laflabo.com;
return 301 http://dev.laflabo.com$request_uri;
}
heroku.yaml
build: docker: web: Dockerfile
Herokuにデプロイする
Herokuにログインします.
heroku container:login
webという名前のcontainerをpushします.
heroku container:push web
webをreleaseして公開します.
heroku container:release web
パフォーマンス
Dockerイメージサイズは22MBでした.Alpine Linuxのおかげでとても小さくできたので,起動時間が短くなることが期待されます.
Free Dynoで実行すると,しばらくアクセスがなければコールドスタートしますが,それでも3秒でレスポンスがありました.早いですね.

メモリ使用量は1.3MBでした.Dynoのメモリ割当容量の最小がFree Dynoの512MBなので,笑ってしまうぐらい使われていません.

HTTPS
HerokuはSSLを自動で管理してくれるので,カスタムドメインのDNS設定さえ行えば,証明書の発行や維持,終端処理の設定までおまかせできます.上記のように1個のPORTでリッスンするだけで,HTTP, HTTPS両方のアクセスに対応できます.とても便利です.
まとめ
Heroku,Docker,nginxを使うことで,とても簡単に高パフォーマンスのリダイレクト専用Webサーバーを公開することができました.