9
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

privateネットワークを利用したDNS浸透問題回避

Last updated at Posted at 2015-12-13

この記事は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_sample.gif

DNSの仕組みについて詳しく知りたい方は → DNSの仕組みの基本を理解しよう
こんな感じのページが色々あるので検索してみてください.

DNS浸透問題

当然のことですが,DNSサーバに全ての対応表を持つことは出来ません.
実際のDNSサーバは木構造になっており,各DNSサーバごとに取り扱っている対応表が違いますし,
一度問い合わされた結果は一定時間キャッシュされます.
キャッシュ時間はTTL(Time to live)というフィールドで管理されており,3600(1時間)や86400(1日)など,
割と長い時間が設定されています.
通常の動作時にはキャッシュがあるため高速に名前解決が行えるようになるわけですが,
設定変更時に即座に反映されないという問題が発生します.
データ登録を伴うwebサービスの場合,引越し後に古いサーバにデータ登録をされるとデータの欠乏や不整合が生じてしまいます.
そのため,IPアドレス変更前には予めTTLを小さめの値にしておき,変更を反映させやすくするなどの対策が取られています.

dns_problem_sample.gif

privateネットワークを介した新サーバへの誘導

えー,色々とめんどくさいことを並べましたが,要は旧サーバへのアクセスを全て新サーバに流してあげれば問題解決です.
通常,SSLを使用している場合は旧サーバと新サーバ間の暗号化をどうするかで少し考える必要がありますが,
SoftLayerの場合はprivateネットワークを持っているのでこの部分に気を使う必要がありません.
今回はnginxのproxyとして使用する際の設定と動作イメージを紹介します.

旧サーバの設定

旧サーバのconfigはこんな感じです.

serverA.conf
server {
    listen 80;
    server_name dns-test.usa-mimi.jp;
    proxy_set_header Host $http_host;

    location / {
        proxy_pass http://10.132.2.101;
    }
}

listenserver_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_access_sample.gif

このようにキャッシュなどの問題でDNSからの応答が旧サーバのアドレスであっても,
privateネットワークを通じて新サーバへアクセスすることができます.
なお,今回はすべてhttpで実験しましたが,実線部分がhttpsでも同じように動作します.
その場合はpublic側(161.202.130.89, 92)の通信はhttps
private側の通信(10.132.2.92, 101)はhttp(今回の設定そのまま)のように書くといいです.
点線部分の通信はhttpになりますが,privateネットワークなのでそんなに問題にはならないでしょう.

9
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?