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サーバーを公開することができました.