07/3/2018, 11:35 AM GMT+9

自宅サーバーにドメイン名でアクセスしたい(hostsの話)

同一 LAN 内にある自宅サーバーにアクセスするときは、192.168.1.x のようにローカル IP アドレスを指定してアクセスすることが可能ですが、自宅サーバーで運用しているときは1つのサーバーで複数のサービスを運用しており、サブドメインで度のサービスへのアクセスかを判別している場合があると思います。このような場合、IPアドレスの直打ちでは上手くいきません。IPアドレスの直打ちではなく通常のアドレス(myservice.example.comのように)を用いて、ローカルIPに解決させる必要があります。

Nginx の server_name

ここでは、Nginx を用いて、support.cosnomi.com と blog.cosnomi.com を 1 つのサーバーで動かしたいとします。このとき、Nginx はアクセスしてきたドメインごとに挙動を変える必要があるので、server_name ディレクティブを用いて各ドメインに対して設定します。

これはどういう仕組みかを簡単に説明すると、HTTP リクエストにはhost ヘッダという情報が含まれていて、ここにはリクエスト時のホスト名が含まれています。だから、アクセス先の IP アドレスが同じでも、support.cosnomi.com と blog.cosnomi.com を見分けられるというわけです。(バーチャルホスト)

しかし、IP 直打ちの場合は host ヘッダから判別できませんのでデフォルトのホスト(実ホスト)に行く、あるいは、エラーになるというわけです。

hosts ファイルの書き換え

となると、support.cosnomi.com でローカルの自宅サーバーにアクセスできれば良いわけですから、最も単純な方法だとDNSサーバーを設定するという話になりますが、これはやや面倒です。もちろん、DNSサーバーを立ててしまうのが正しいのだとは思いますが、ここではもっと簡単な方法として、アクセス元となるコンピュータ(クライアント)のhosts ファイルを書き換えるという方法があるので、こちらを使ってみたいと思います。hostsファイルとはDNSより優先して名前解決に用いられるドメイン名とIPアドレスの対応表です。 Linuxの場合は、/etc/hostsにあります。Windowsの場合は、C:\Windows\System32\drivers\etc\hostsです。このファイルに

192.168.x.x support.cosnomi.com

と書き込めば、そのマシンからsupport.cosnomi.comにアクセスすると、192.168.x.x に解決されます。もちろん、リクエストの host ヘッダには support.cosnomi.com が与えられるのでバーチャルホストによるサービス振り分けは正常に機能します。

まとめ

LAN内のマシンにローカルIPアドレス直打ちではなくドメイン名でアクセスしたいがDNSには触りたくないという場合、アクセス元マシンのhostsファイルを編集することで、DNSに優先して名前解決させることができます。ファイル編集だけで済むので非常に簡単である一方、LAN内の他のマシンにも同じ設定をする必要があり、マシンの数が多い場合は手間がかかります。


Cosnomi
Cosnomi

コンピュータ(Web, 機械学習など)が好きな医学部生

Twitter / GitHub