Credit: Moyan Brenn

ステージング環境などで、クライアント側にHostsを設定して新環境の操作テストするケースも多いかと思います。

Windowsであれば、C:¥Windows¥System32¥drivers¥etc¥hosts、Linux系マシンであれば、/etc/hostsです。 もちろん上記を管理するために、Hosts Files ManagerHosterといったアプリを利用して効率的に作業されているかと思います。

ただし、サーバの数が膨大になってくると上記の設定をするのもなかなかコストが増えてきます。 たとえば、特定ドメイン(myapp.mistdev.com)に対し、30台のマシンが待機しており、それをそれぞれについて検証したい場合など 30台を別々にHostsを切り替えてやるべきでしょうか?多くの場合は必要ないはずです。 テスト目的がブラウザで閲覧出来るUI/UXの検証以外であれば、うまくhostsを設定して、wget/curlしたのちgrep等などで達成できます。

その方法はどうしたらよいでしょうか?

VirtualHostはHostヘッダーだけ見ている

既に結論が出ていますが、httpリクエストのHostの所だけをみて管理しています。仮に以下のURLアクセスすると、

 http://myapp.mistdev.com/

hostsまたはDNS経由で名前解決を行い、下記のようになります。

 http://192.168.33.101/ (Host:myapp.mistev.com)

それをサーバ側(apache等)が受信を行い、VirtualHostで分類して、各DocumentRootの中身を返すという仕組みです。

主にブラウザから名前解決して利用するhttpではIPという仕組みをあまり意識しない方も多いと思います。 しかし、結局TCP/IPのルールの上で動いていることが理解できると思います。 また、VirtualHostを処理するサーバからしてみても、クライアント側から80アクセスを受信したが、 対応するhost名がない場合ので適当に一番上のWeb設定もレスポンスするという実装の仕組みも理解出来る気がします。

curl経由でアクセスする

このルールがわかれば簡単です。Curlコマンドにはヘッダ付与オプションHがあるのでそれを利用するだけです。

$ curl -H "Host:myapp.mistev.com" http://192.168.33.101/
$ curl -H "Host:myapp.mistev.com" http://192.168.33.102/
$ curl -H "Host:myapp.mistev.com" http://192.168.33.103/

こうすることで、同一ドメインで違うIPのマシンを簡単に調査可能です。

$ curl -H "Host:myapp.mistev.com" http://192.168.33.101/ \
    | grep "someletter"

grepをパイプして、文字列の出現の調査も簡単です。

サーバごとのスピードを調査する

curlのオプションを組み合わせることで各サーバのスピードを調査することも容易です。 基本的なcurlの速度調査方法は以下です。

$ curl -s -o /dev/null http://myapp.mistdev.com \
    -w "status: %{http_code}, time: %{time_total}\n"

-sにてsilentモード、-oにて出力先を指定(今回は/dev/nullで出力しない)、-wにて特定の形式でアウトプットが出来ます。

今回の技を利用すれば、for文などと組み合わせて簡単に出来ます。

$ for ip in 101 102 103 104
$ do
$ curl -H "Host:myapp.mistev.com" http://192.168.33.${ip}/ \
       -s -o /dev/null -w "status: %{http_code}, time: %{time_total}\n"
$ done

curlにはその他色々なoptionがあるので、活用出来ます。是非効率のよい検証を。