Prompt
github.ioやhatenablog.comなどのサービスは、サブドメインを動的に生成するが、それはどのようにして実現する?
おお、そこに目を向けるとは!まさにインフラエンジニアとしての「嗅覚」が働いている証拠だね。GitHub Pagesやはてなブログのような、ユーザーごとに ユーザー名.example.com を発行する仕組みは、「ワイルドカード」 という概念をフル活用して実現されているんだ。
大きく分けて、DNS(ドメイン)側 と サーバー(Webサーバー/リバースプロキシ)側 の2つのレイヤーで魔法がかけられているよ。
1. DNSレイヤー:ワイルドカードレコード
まず、DNSの設定で「どんなサブドメインが来ても、とりあえずうちのサーバーに飛ばす」という設定が必要なんだ。
具体的には、DNSの Aレコード や CNAMEレコード に *(アスタリスク)を使用するよ。
- 設定例:
*.github.io→185.199.108.153(GitHubのIP)
これによって、alice.github.io も bob.github.io も、インターネット上ではすべて同じIPアドレス(GitHubの入り口サーバー)に誘導されるようになるんだ。いちいちユーザーが登録されるたびにDNSレコードを書き換えるなんて、非効率なことはしないよ!
2. サーバーレイヤー:Virtual Host と ホストヘッダー解析
DNSによってサーバーにリクエストが届くと、今度はサーバー側で 「で、結局どのユーザーのページを見たいの?」 という判別が行われる。
ここで使われるのが、HTTPリクエストに含まれる Host ヘッダー だ。
-
ブラウザが
alice.github.ioにアクセス。 -
サーバーに届くリクエストのヘッダーに
Host: alice.github.ioと書かれている。 -
サーバー(Nginxや自作のリバースプロキシなど)がこの文字列を解析する。
-
データベースやファイルシステムを参照して、「
aliceというユーザーの公開ディレクトリはここだ!」と特定する。
3. 実装のキモ:動的なマッピング
小規模なサービスなら、Webサーバーの設定ファイル(Nginxの server_name など)に正規表現を書くことで実現できるけれど、GitHubのような超大規模サービスではもっと高度なことをやっているよ。
-
動的なルーティング:
リバースプロキシ(GoやRust、C++などで書かれた専用プログラム)がリクエストを受けるたびに、Redisなどの高速なKVS(Key-Value Store)を参照して、バックエンドのストレージサーバーの場所を特定する。
-
SSL/TLS証明書の動的発行:
これが一番の難関!かつてはサブドメインごとに証明書が必要だったけれど、今は 「ワイルドカード証明書」 を使うか、Let’s Encrypt などのAPIを利用して、新しいサブドメインが作られた瞬間にプログラムで証明書を自動取得・更新する仕組み(オンデマンドTLS)が一般的だね。
4. 豆知識:セキュリティの落とし穴「Cookieモンスター」
サブドメインを動的に発行する場合、「Cookieのスコープ」 には要注意なんだ!
もし example.com で発行したセッションCookieのドメイン属性を .example.com (先頭にドットあり)に設定してしまうと、すべてのユーザーのサブドメイン alice.example.com や bob.example.com でそのCookieが送信されてしまう。
これを悪用すると、他人のサブドメインで動いているスクリプトからセッションを盗むことができてしまうんだ。だからGitHubなどは github.io という 「パブリックサフィックス」 (ブラウザがCookieの共有を禁止するリスト)に登録することで、ユーザー間の安全を守っているんだよ。
情報工学を学ぶ君なら、例えば Nginxの正規表現 を使ってローカル環境で「オレオレGitHub Pages」のモックを作ってみると、この仕組みが手に取るようにわかるはずだよ。
もし興味があれば、「Nginxでサブドメインをキャッチして、特定のディレクトリを返す設定例」 とか、具体的なコードを見てみる?それとも、SSL証明書の自動化(Caddyサーバーなど)の話に深く潜ってみる?