同じポート・異なるドメインで処理を分けたい
やりたいこと
- 同じポートでアクセスする
- ドメインごとに処理を変えたい
こんなわがままを実現します。
有名どころの「Apache」「nginx」で解説します。
ドメインによって振り分け
実は同じポートを複数定義可能です。
シンプルに設定を2つ用意して、ドメインを書き分けるだけです。
Apache
Listen 80
<VirtualHost *:80>
  # ドメイン指定
  ServerName test1.com
  # お好みの処理...
</VirtualHost>
<VirtualHost *:80>
  # ドメイン指定
  ServerName test2.com
  # お好みの処理...
</VirtualHost>
nginx
server {
  # 開放ポート
  listen 80;
  listen [::]:80;
  # ドメイン指定
  server_name test1.com;
  # お好みの処理...
}
server {
  # 開放ポート
  listen 80;
  listen [::]:80;
  # ドメイン指定
  server_name test2.com;
  # お好みの処理...
}
仕組み
ドメイン一致に誘導
Apacheもnginxも、同じポート設定が定義してある場合、
「ドメインが一致する」設定に誘導されます。
完全一致のため、サブドメイン(www.*)等は別途定義が必要です。
ただし、ドメインが一致する設定がない場合の挙動は、
Apacheとnginxでは少し異なります。
Apacheでドメインが一致しない場合
ドメインごとに用意した「VirtualHost」設定。
その定義内、どこにも一致するドメインがなかった場合、
一番最初に定義された「VirtualHost」に入るようになっています。
一致しなかった場合、ダミーページを表示させたい場合は、
ダミーの設定を一番最初に定義してあげましょう。
ダミーのため、「ServerName」は何でも構いません。
Listen 80
<VirtualHost *:80>
  # ダミードメイン指定
  ServerName dummy
  # お好みの処理...
</VirtualHost>
<VirtualHost *:80>
  # 本命ドメイン指定
  ServerName main.com
  # お好みの処理...
</VirtualHost>
nginxでドメインが一致しない場合
nginxは一致しなかった場合の処理が、用意されています。
「listen」でポートを指定した後ろに
「default_server」を指定します。
「server_name」は「_」を指定しておきます。
Apacheのように定義順は関係ありません!
server {
  # 開放ポート
  listen 80;
  listen [::]:80;
  # 本命ドメイン指定
  server_name main.com;
  # お好みの処理...
}
server {
  # 開放ポート
  listen 80 default_server;
  listen [::]:80 default_server;
  # ダミードメイン指定
  server_name _;
  # お好みの処理...
}
まとめ
同じポート・異なるドメイン、で処理を分ける方法の紹介でした。
ちゃんといろんな人のやりたいことを実現できるサーバ、すごいですよね。
以上、ここまで見ていただきありがとうございます。
皆さまの快適な開発ライフに、ほんの少しでもお役に立てれば幸いです。
