大量のWebサイト(約100)を新しいサーバーに移行することを計画しており、移行計画のプロセスにいます。
各Webサイトの一般的なDNSゾーンには、WebサーバーIPを指す2つのAレコードがあり、1つはexample.com
およびwww
サブドメイン用に1つ。
すべてのセットアップが完了し、新しいサーバーを運用環境で起動する準備ができている場合、100x2 DNSレコードの変更には時間がかかるため、これをより速くする方法を探しています。いくつかのケースで、DNSレコードを反復処理し、新しいIPで検索置換を実行するbashスクリプトの作成について読みました。他のトピックでは、現在のサーバーが利用できなくなったときに、DNSサーバーが新しいIPを含む次のレコードを要求するように、新しいIPでAレコードを追加する方法についての提案を読みました。
これらとは別に、Aレコードを他のタイプのDNSエントリ、つまりホスト名に置き換えることができるシナリオはありますか?ウェブサイトは新しいサーバーを指していますか? 「ホスト名」が正しい用語ではないことは確かですが、みなさんにも理解していただければ幸いです。
あなたが探している用語は[〜#〜] cname [〜#〜]であり、あなたの質問に対する答えは両方とも「はい」と「いいえ」です。
まず、ゾーンファイルでCNAMEがどのように機能するかの例を次に示します。
example.se IN SOA ns1.example.se. hostmaster.example.se. (
[....]
)
server1 A 10.1.2.3
www CNAME server1
server1
とwww
の両方を新しいIPアドレスに移動するには、server1
レコードを更新するだけです。
CNAMEは同じドメイン内のアドレスを指す必要はありません。また、次のようになります。
example.se IN SOA ns1.example.se. hostmaster.example.se. (
[....]
)
www CNAME server1.example.org.
これで、ゾーンserver1
内のexample.org
のAレコードを更新すると、www.example.se
のレコードがさらに構成されずに続きます。
あなたの観点から見ると、悪い点は、これが頂点レコードでは機能しないことです。つまり、「ベア」ドメインです。つまり、www.example.com
をCNAMEにすることはできますが、example.com
を使用してそれを行うことはできません。これは、CNAMEレコードを使用する場合、そのエントリに追加のレコードを含めることができないためです。つまり、メールサーバーレコードやネームサーバーレコードを含めることはできません。つまり、ドメインが機能しなくなります。
ベストプラクティスのソリューションは、puppet、chef、ansibleなどの構成管理ソフトウェアを使用して、テンプレートからゾーンファイルを生成することです。何らかの理由でそれが不可能な場合は、スクリプトを使用してすべてのファイルのIPアドレスを置き換えます。
また、移行の前にドメインのTTL=値を減らしてください)(そして、ゾーンファイルのシリアル番号を更新することを忘れないでください-私は持っています。とても恥ずかしい...)
まず、答えはDNSの実装方法によって異なります。バインド、アンバインド、または他のさまざまなDNSサーバーなどを使用してセルフホスティングしていますか? DNSサーバーは、構成にテキストファイルを使用していますか、GUIインターフェイス(Windowsサーバーなど)を使用していますか、スクリプトAPI(PowerShellなど)を使用していますか、またはWebインターフェイスを使用しています(DNSを外部委託している場合は一般的です)。アウトソーシングDNSには、REST使用できるAPIが含まれていることもあります。
どちらも簡単に自動化できるため、スクリプトAPIを使用して更新を行うか、テキストファイルを編集することをお勧めします。テキストファイルの場合は、事前に準備して、移行時にコピーすることもできます。
ちなみに、この種の変更をあなたの種類のスケールで行うことが、多くの人がChef、Ansible、Puppet、SaltなどのDevOpsツールを使用している理由です...明らかにこれらは計画を必要とする大きなツールであるため、これは予定されていませんこの特定のニーズのための即時の助けの、しかしそれはあなたの人生を長期的に楽にするかもしれません。
他のいくつかの重要な考慮事項:
TTLを確認してください。移行の約1日または1週間前に、TTLをできる限り短いものに変更します。移行が完了したら、TTLを増やします。
SOA record!APIとWebインターフェイスは、自動的にこれを行う場合と行わない場合があります。シリアル番号をインクリメントすることを忘れないでください。DNSサーバーがテキストファイルを使用している場合は、それ。
サーバーの性質に応じて、新旧を少し同時に実行できるかどうかを確認します。可能であれば、一度にすべてのDNS更新を完了する必要はありません。
これが正しければ、古いサーバーには単一のIPアドレスがあり、新しいサーバーにも1つしかありません。
したがって、新しいサーバーをセットアップして、関連するすべてのhttp/https/ftp/whateverトラフィックを古いIPにルーティングし、DNSレコードを更新して新しいIPを表示することができます。
IPが1つしかない場合は、単純な検索/置換を使用してDNS内のすべてのIPを一度に変更し(シリアル番号を更新することを忘れないで)、現在のTTL= TTLがなくなったら、新しいサーバーのルートを削除して他の設定を調整するだけで、リダイレクトせずに直接サイトにサービスを提供できます。
ルートを削除する前に、ウェブサイトは明らかに新しい場所に移動されているはずです。これには、他のDNSサーバーに依存してレコードを更新する必要がないため、「待つ」だけでよいという利点があります。その期間を短くするためにTTLを減らすことができますが、そこにある一部のDNSキャッシュはTTL設定を無視するので、TTLに依存しないのはそのためです。もう。
編集/詳細説明:理解しやすくするために:
また、今すぐ新しいサーバーをインストールしてすべてを構成し、すべてのサイトを新しいIPに移動して、すべてのトラフィックを古いサーバーから新しいサーバーにルーティングすることもできます。
例えば。古いサーバーはIPを持っています192.0.2.1
新しいサーバーはIPを持っています198.51.100.2
DNSはすべてのサイト(_)の192.0.2.1
を指し、ウェブサーバーは要求されたドメインの名前によってどのコンテンツを提供するかを決定します。 example.com
-> /var/www/sites/example.com
およびwww.example.com
-> /var/www/sites/example.com
。
だからあなたはこれを回すだけです:
example.com -> 192.0.2.1
これに(サイトを198.51.100.2に移動するとすぐに):
example.com -> 192.0.2.1 -> 198.51.100.2
そしてDNSレコードを変更して198.51.100.2を指すようにします。
example.com -> 198.51.100.2
DNSの問題は、更新が瞬時に行われないことです。そのため、一部のクライアントでは、example.comはさまざまな時間にわたって198.51.100.2を指します(TTL設定するか、 、彼らがそれを無視した場合、だれがどれだけ長く知っているか).
つまり、私のポイントは、DNSに依存する代わりに、IPレイヤーのトラフィックをリダイレクトして、ダウンタイムを削減することです。これでもう少し明確になればいいのですが。
Ubuntuでは、転送とNAT(たとえば、古い宛先198.51.100.2のhttpおよびhttpsを新しい宛先198.51.100.2にルーティングする;これらの設定は古いサーバーで行われます)でそれを行うことができます:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p tcp --dport 80 -m state --state NEW -j ACCEPT
iptables -A FORWARD -p tcp --dport 443 -m state --state NEW -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 198.51.100.2:80
iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination 198.51.100.2:443
iptables -t nat -A POSTROUTING -j MASQUERADE
簡単な解決策(最も洗練されたものではありませんが、おそらく機能しています)は、古いIPを新しいIPに置き換えるだけです。
最初にゾーンファイルをバックアップします。
次に、問題を確認します。
grep 'ol\.d\.i\.p' *.zone
置き換えるレコードがない行があるかどうかを確認します
次に、IPを置き換えます。
sed -i 's/ol\.d\.i\.p/ne.w.i.p/g' *.zone
grep 'ne\.w\.i\.p' *.zone # check if the new lines look correct
これは、毎日実行するスクリプトで行うべきことではありませんが、1回限りの移行では、高度な移行ツールのプログラミングを開始せずに問題を解決するにはこれで十分です。
grep
コマンドは、正規表現を含む行を検索するだけです(ここでは、ipのリテラル一致、.
は正規表現で特別な意味を持つため、エスケープする必要があります。sed
は、ストリームまたはファイルの行ベースの操作に使用されます(-i
オプション)。 s/regex/replacement/g
は、正規表現(grep
コマンドで使用されるものと同じ)を置換(新しいIP)に置き換えます。 /g
はグローバルを意味します。これは、1つの行に複数の一致がある場合に、IPが複数回置換されることを確認します。