Cosnomi

プログラミングをする医学生。物を作ること、自動化すること、今まで知らなかったことを知ることが好き。TypeScript書いたり、Pythonで機械学習したりなど。

Twitter / GitHub / Keybase
TOP >

自宅サーバーにドメイン名でアクセスしたい(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です。このファイルに次のように書き込めば、そのマシンからsupport.cosnomi.comは 192.168.x.x に解決されます。

192.168.x.x support.cosnomi.com

もちろん、リクエストのhostヘッダにはsupport.cosnomi.comが与えられるのでバーチャルホストによるサービス振り分けは正常に機能します。

まとめ

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


最後まで読んでいただきありがとうございます。コメントフォームは設置していません。訂正・意見・感想などはTwitter(@cosnomi)などへお願いします。
記事一覧へ