Bagaimana cara memigrasi DNS server web dengan lancar dari satu alamat IP ke alamat IP lainnya?

8

Saat ini saya memiliki nama domain terdaftar untuk server Linux / Apache yang akan saya ganti dengan yang lain pada alamat IP baru.

Migrasi data akan relatif cepat dan gangguan 5 menit selama proses itu dapat diterima.

Catatan DNS memiliki TTL dari 6-12 jam rupanya, yang saya tidak bisa mempercepat.

Apa kemungkinan konsekuensi dari perubahan ini? Agaknya pengguna yang masih mencari alamat lama akan terus menekan server lama, sementara pengguna yang dns cache telah kedaluwarsa atau kosong akan melihat domain baru.

Apakah mungkin untuk melakukan pengalihan dari server lama (dengan Apache atau iptables) ke IP baru? Server lama dapat terus berjalan selama diperlukan.

Tom
sumber
Saya menggunakan rinetd yang lebih umum daripada vhost tertentu, tetapi berfungsi dengan baik jika Anda mengganti seluruh server, atau, katakanlah, memindahkan semua barang web ke server lain. Sinkronkan server baru, atur rinetd, ubah DNS. Dalam 48 jam matikan server lama (atau layanannya).
artfulrobot

Jawaban:

5

Anda dapat menggunakan Reverse Proxy di server web lama. Mungkin agak sulit untuk diatur, tetapi selama DNS ITS diperbarui, Anda akan baik-baik saja.

Apa yang akan terjadi adalah:

  1. Server web lama dikonfigurasi menjadi Reverse Proxy
  2. Peralihan DNS
  3. Server web baru menyajikan hit dari catatan DNS terbaru
  4. Web lama saat mendapat klik, meneruskan permintaan ke DNS yang benar, dan kemudian menampilkan konten kata demi kata.

Jika Anda menjalankan Apache, lihat mod_proxy. Jika Anda menjalankan IIS, lihat ISAPI Rewrite untuk mendapatkan fungsionalitas semacam ini.

(perhatikan bahwa DNS pada server web lama harus mutakhir jika Anda ingin proksi menggunakan nama domain. Jika tidak, proksi langsung ke alamat IP dan pastikan bahwa host mendengarkan IP tanpa nama host)

Mark Henderson
sumber
1
Untuk memastikan server web lama diperbarui pada DNS baru. Tambahkan catatan ke / etc / hosts.
Matthew Scragg
@ MatthewScragg Bisakah Anda memberikan informasi lebih lanjut tentang itu? Langkah dan hasil ..
Birla
1
@Birla Di server web lama, tambahkan ke /etc/hosts 123.456.789.12 my.domain.comIni hanya akan membuat server web lama Anda mengetahui alamat yang diperbarui. Ketika klien mengakses server web lama (karena mereka tidak memperbarui DNS) server web dapat mem-proxy permintaan menggunakan nama domain. Saya tidak menggunakan Apache tetapi di sini adalah contoh Nginx: gist.github.com/scragg0x/738f144b33d17ef763d1
Matthew Scragg
11

Perusahaan saya hanya melakukan ini dengan beberapa situs Web besar. Prosedur dasar yang kami ikuti adalah:

  1. Turunkan TTL domain sebanyak mungkin. Lakukan ini sebelumnya paling tidak sebanyak waktu TTL saat ini.
  2. Atur situs Web di server baru persis seperti yang Anda inginkan dengan "produk akhir"
  3. Tambahkan nama alias ke situs di server baru, seperti www2.domain.com atau www-new.domain.com. Dengan Apache, Anda akan menggunakan direktif ServerAlias . Jika situs memiliki kode dinamis sama sekali (PHP, mod_perl, RubyOnRails, dll.), Pastikan bahwa situs akan berperilaku dan merespons dengan benar dengan nama baru ini.
  4. Pada saat cutover, atur pengalihan pada server lama yang menunjuk ke server baru
  5. Ubah DNS untuk www untuk membuka IP baru.

Untuk Apache, Anda mungkin harus menggunakan mod_rewrite untuk pengalihan sehingga Anda dapat mempertahankan URI yang diminta oleh klien. Implementasi sederhana adalah:

# old server
<VirtualHost 1.1.1.1:80>
    ServerName www.domain.com
    RewriteEngine on
    RewriteRule ^(.*)$ http://www-new.domain.com$1 [L]
</VirtualHost>

# new server
<VirtualHost 1.1.1.2:80>
    ServerName www.domain.com
    ServerAlias www-new.domain.com
</VirtualHost>

Ini akan melakukan pengalihan sementara 302 untuk www.domain.com/anything ke www-new.domain.com/anything. Anda ingin ini bersifat sementara karena Anda mungkin ingin mesin pencari hanya mengindeks www.domain.com, bukan www-new.domain.com.

Setelah perubahan DNS untuk www.domain.com disebarluaskan untuk kepuasan Anda, Anda dapat membuang www-baru sama sekali, atau dengan mudah meringankan siapa pun yang menggunakannya kembali ke www dengan pengalihan lain. Ini hampir proses yang sama seperti di atas; mengatur server lama untuk menangani www-baru, mengubah DNS untuk www-baru untuk menunjuk ke server lama, dan mengatur pengalihan pada server lama mengirimkan lalu lintas www-baru ke www:

# old server
<VirtualHost 1.1.1.1:80>
   ServerName www-new.domain.com
   RewriteEngine on
   RewriteRule ^(.*)$ http://www.domain.com$1 [R=301,L]
</VirtualHost>

# new server
<VirtualHost 1.1.1.2:80>
    ServerName www.domain.com
    # ServerAlias removed, no longer needed
</VirtualHost>

Kali ini Anda ingin melakukan pengalihan 301 permanen, sekali lagi untuk memberi petunjuk pada crawler mesin pencari bahwa www.domain.com adalah situs yang Anda ingin mereka indeks.

James Sneeringer
sumber
4

Oke, berdasarkan apa yang direkomendasikan oleh @Farseeker, saya mengatur konfigurasi berikut pada server Apache lama untuk meneruskan permintaan ke server baru:

<VirtualHost *>
  UseCanonicalName Off
  ServerAdmin  [email protected]
  ServerName domain.com
  DocumentRoot /var/www/

  ProxyRequests Off

  <Proxy *>
    Order deny,allow
    Allow from all
  </Proxy>

  ProxyPass / http://domain.com/
  ProxyPassReverse / http://domain.com/
</VirtualHost>

Untuk memastikan server lama memiliki alamat yang benar, saya memasukkan entri /etc/hosts:

1.2.3.4 domain.com

Saya juga harus mengaktifkan Apache mod_proxydan mod_proxy_httpmodul, dan memuat ulang konfigurasi:

a2enmod proxy
a2enmod proxy_http
/etc/init.d/apache force-reload
Tom
sumber
Bagus. Bagaimana cara menangani subdomain yang sewenang-wenang?
Ekevoo
4

Itu utas lama tapi mungkin itu akan membantu seseorang:

Selain jawaban Mark Henderson (mod_proxy) ATAU James Sneeringer (302.301 redirect ke subdomain baru), satu hal lagi dapat ditambahkan mengenai sinkronisasi basis data ketika memindahkan aplikasi besar.

Jika proyek web Anda menggunakan database (mis. MySQL), sebelum mengganti DNS, pastikan aplikasi (mis. PHP) dari kedua server terhubung ke database yang sama. Sehingga membaca dan menulis akan pergi ke tempat yang sama dan Anda tidak harus berurusan dengan alat sinkronisasi DB yang berbeda sesudahnya.

Ini akan (kemungkinan besar) mempengaruhi waktu pemuatan pada satu server tetapi untuk periode sakelar ini dapat diterima.

Seandainya server DB tidak dapat diakses dari luar, Anda dapat mengatur juga mysql_proxy di server web yang memiliki akses ke sana dan dapat diakses dari IP eksternal.

cephuo
sumber
3

Saya menggunakan iptables untuk ini ketika saya perlu melakukan ini; sedikit DNAT / SNAT cepat dan semua lalu lintas Anda secara ajaib muncul kembali di tempat yang seharusnya. Jika Anda benar-benar perlu mempertahankan alamat IP sumber, proksi terbalik dapat membantu, dengan mengatur tajuk yang tepat, tetapi itu membutuhkan banyak peretasan di kedua ujungnya untuk memastikan semuanya cocok, jadi saya biasanya tidak khawatir tentang hal itu. untuk sesuatu seperti migrasi karena bersifat sementara, dan menurunkan TTL menangani sebagian besar.

womble
sumber