この記事はSoftLayer Advent Calendar 2015の13日目の記事です.
SoftLayerで仮想マシンを構築するとpublicとprivateの2つのネットワークアドレスが割り当てられます.
これを利用してサーバ引っ越し時のDNS浸透待ちを回避する方法を紹介します.
DNS(Domain Name System)
DNS(Domain Name System)とはIPアドレスとドメイン名を対応付けて管理する方法のことです.
ドメイン名からIPアドレスを特定することを 名前解決 と呼び,この情報を管理するサーバのことを
DNSサーバと呼びます.
お名前.comなんかが有名ですね.
ネットワーク上のコンピュータにアクセスするにはIPアドレスを指定する必要がありますが,
DNSのあるおかげで192.168.1.1
のようなアドレスを覚えずに http://www.usa-mimi.jp
などのように覚えやすい名前でアクセスすることができます.
また,サーバのIPアドレスが192.168.1.2
に変更された場合でも,
DNSサーバの設定を変更するだけでユーザは新しいサーバへアクセスすることができるようになります.
DNSの仕組みについて詳しく知りたい方は → DNSの仕組みの基本を理解しよう
こんな感じのページが色々あるので検索してみてください.
DNS浸透問題
当然のことですが,DNSサーバに全ての対応表を持つことは出来ません.
実際のDNSサーバは木構造になっており,各DNSサーバごとに取り扱っている対応表が違いますし,
一度問い合わされた結果は一定時間キャッシュされます.
キャッシュ時間はTTL(Time to live)というフィールドで管理されており,3600(1時間)や86400(1日)など,
割と長い時間が設定されています.
通常の動作時にはキャッシュがあるため高速に名前解決が行えるようになるわけですが,
設定変更時に即座に反映されないという問題が発生します.
データ登録を伴うwebサービスの場合,引越し後に古いサーバにデータ登録をされるとデータの欠乏や不整合が生じてしまいます.
そのため,IPアドレス変更前には予めTTLを小さめの値にしておき,変更を反映させやすくするなどの対策が取られています.
privateネットワークを介した新サーバへの誘導
えー,色々とめんどくさいことを並べましたが,要は旧サーバへのアクセスを全て新サーバに流してあげれば問題解決です.
通常,SSLを使用している場合は旧サーバと新サーバ間の暗号化をどうするかで少し考える必要がありますが,
SoftLayerの場合はprivateネットワークを持っているのでこの部分に気を使う必要がありません.
今回はnginxのproxyとして使用する際の設定と動作イメージを紹介します.
旧サーバの設定
旧サーバのconfigはこんな感じです.
server {
listen 80;
server_name dns-test.usa-mimi.jp;
proxy_set_header Host $http_host;
location / {
proxy_pass http://10.132.2.101;
}
}
listen
とserver_name
の部分は通常の設定と変わりません.
http://dns-test.usa-mimi.jp のように,この名前で80番ポート(デフォルトのポート番号)でアクセスが有った場合にこの設定を使う,という意味です.
proxy_set_header
はちょっと大事です.nginxはあくまでもproxyなので,代理先に元のアクセス情報(この場合はdns-test.usa-mimi.jp
でアクセスが来た,という情報)を渡してあげる必要があります.
location
は特定のpathに対するアクセスを別のサーバへ挿げ替えるという,まさにproxyとしての動作です.
この例では新サーバのprivateアドレスへ飛ばすようにしています.
新サーバの設定
新サーバ側の設定はこんな感じです.
server {
listen 10.132.2.101;
server_name dns-test.usa-mimi.jp;
# 以下特別な設定はないので略
}
listen
設定によって10.132.2.101
という新サーバのprivateネットワークにアクセスが合った場合にこの設定が有効になるようにしています.
server_name
は今回の場合はあってもなくてもいいです.
旧サーバ側でproxy_set_header
を設定しているのでdns-test.usa-mimi.jpをhost名としてアクセスしてきます.
動作イメージ
この設定による動作を図にするとこんな感じです.
このようにキャッシュなどの問題でDNSからの応答が旧サーバのアドレスであっても,
privateネットワークを通じて新サーバへアクセスすることができます.
なお,今回はすべてhttp
で実験しましたが,実線部分がhttps
でも同じように動作します.
その場合はpublic側(161.202.130.89, 92)の通信はhttps
,
private側の通信(10.132.2.92, 101)はhttp
(今回の設定そのまま)のように書くといいです.
点線部分の通信はhttp
になりますが,privateネットワークなのでそんなに問題にはならないでしょう.