みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

極小のWebサーバーをHerokuにデプロイした

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秒でレスポンスがありました.早いですね.

f:id:atsuhiro-me:20210226213045p:plain

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

f:id:atsuhiro-me:20210226213547p:plain

HTTPS

HerokuはSSLを自動で管理してくれるので,カスタムドメインのDNS設定さえ行えば,証明書の発行や維持,終端処理の設定までおまかせできます.上記のように1個のPORTでリッスンするだけで,HTTP, HTTPS両方のアクセスに対応できます.とても便利です.

まとめ

Heroku,Docker,nginxを使うことで,とても簡単に高パフォーマンスのリダイレクト専用Webサーバーを公開することができました.