.localhostドメインでWebアプリのアドレスを簡潔にする
(inclouds.space)- 開発中のWebアプリについて、
localhost:4333のようなポート番号を覚えなくても、appname.localhostのようなシンプルなアドレスでアクセスできるように設定した体験の共有 - この仕組みを使うと、ローカルWebアプリへのアクセスがはるかに直感的で整ったものになる
- 各アプリは固有のポートで
launchdデーモンとして実行される /etc/hostsファイルでappname.localhostを127.0.0.1にリダイレクトする- 例:
127.0.0.1 inclouds.localhost
- 例:
- Caddy を通して、そのドメインを適切なポートへプロキシする
Caddy設定例
inclouds.localhost {
reverse_proxy localhost:5050
tls internal
encode gzip zstd
}
.localhostドメインごとに、Caddyfile に対応するポートへのプロキシ設定を記述する- 内部TLS証明書と圧縮サポートも含まれる
今後の改善アイデア
- 現在は3つのファイル(
/etc/hosts、Caddyfile、launchd plist)を手動で編集する必要がある - 将来的には、単一のコマンドでアプリを
.localhostドメインにインストール/削除できる自動化ツールを作るのが目標
更新
- Cristóbal が dnsmasq ベースのコマンドを提案し、この作業をさらに簡単にした
- 核となるアイデアは次のとおり:
*.localhostをすべて127.0.0.1にリダイレクトする127.0.0.1で特定のポートへのリバースプロキシを行うサーバーを設定する
dnsmasqでリダイレクトを設定する
- すべての
*.localhostドメインを127.0.0.1にルーティングするためにdnsmasqを使用 - インストール後の設定:
echo 'port=5353' | sudo tee -a /etc/dnsmasq.conf echo 'address=/localhost/127.0.0.1' | sudo tee -a /etc/dnsmasq.conf sudo systemctl restart dnsmasq dnsmasqのポートを5353に設定し、systemd-resolvedとの衝突を回避する/etc/resolv.confの先頭に次を追加して、既定のDNSリゾルバをdnsmasqに設定する:nameserver 127.0.0.1
Caddyとlocalhostスクリプトでリバースプロキシを設定する
- これで
caddyサーバーを使って、各サブドメインを特定のポートへ接続できる - Caddyfile を手動で編集することもできるが、bashスクリプト(
localhost)を作って自動化することもできる - このbashスクリプト(
localhost)を PATH に追加する(例として.zshrcに追加):export PATH="$PATH:$HOME/dev/localhost" - 次のように使える:
localhost add hello 8000 localhost remove hello
実際の動作テスト
- ローカルサーバー実行例:
echo 'hello.localhost!' > index.html python3 -m http.server 1234 - ドメイン接続の設定:
localhost add hello 1234 - これでブラウザで
hello.localhostにアクセスすると、上記サーバーの内容が表示される
2件のコメント
外部ネットワークにアクセスできないのでなければ、NIP.IO のようなワイルドカードDNSを使います。
Hacker Newsの意見
ブラウザは .localhost ドメインに対してセキュアコンテキストを提供する
nginx のローカル開発設定スニペットはシンプル
Chrome と Firefox はデフォルトであらゆる <name>.localhost ドメインを localhost として解決する
Localias プロジェクトはローカル Web 開発に役立つ
.localhost のサブドメインは Linux、OpenBSD などではデフォルトで動作する
Caddy を使う場合は、購入したドメインと DNS-01 チャレンジを使うのがよい
個人ネットワークで Vanity ドメインを使っている人もいる
各ローカルホスティングアプリに個別の IP アドレスを割り当てることもできる
Linux システムでは systemd-resolved によってデフォルトで動作する