Как плавно перенести DNS веб-сервера с одного IP-адреса на другой?

8

В настоящее время у меня зарегистрировано доменное имя для сервера Linux / Apache, которое я собираюсь заменить другим на новом IP-адресе.

Перенос данных будет относительно быстрым, и 5-минутный перерыв в этом процессе допустим.

Запись DNS имеет TTL с 6-12 часов, что я не могу ускорить.

Каковы возможные последствия этого изменения? Предположительно пользователи, которые все еще смотрят на старый адрес, будут продолжать использовать старый сервер, в то время как пользователи, у которых DNS-кэш истек или пуст, увидят новый домен.

Можно ли сделать какое-то перенаправление со старого сервера (с Apache или iptables) на новый IP? Старый сервер может продолжать работать столько, сколько необходимо.

Том
источник
Я использовал rinetd, который является более общим, чем конкретный vhost, но прекрасно работает, если вы заменяете весь сервер или, скажем, переносите все веб-содержимое на другой сервер. Просто синхронизируйте новый сервер, настройте rinetd, измените DNS. Через 48 часов отключите старый сервер (или его службы).
artfulrobot

Ответы:

5

Вы можете использовать обратный прокси на старом веб-сервере. Для настройки может потребоваться немного усилий, но, пока ITS DNS обновлен, у вас все будет в порядке.

Что произойдет, это:

  1. Старый веб-сервер настроен на использование обратного прокси
  2. Переключение DNS
  3. Новый веб-сервер обслуживает хиты из актуальных записей DNS
  4. Старая сеть, когда она получает удар, перенаправляет запрос на правильный DNS, а затем выводит содержимое дословно.

Если вы используете Apache, посмотрите на mod_proxy. Если вы используете IIS, изучите ISAPI Rewrite, чтобы получить такую ​​функциональность.

(обратите внимание, что DNS на старом веб-сервере должен быть обновлен, если вы хотите использовать прокси-сервер, используя доменное имя. В противном случае, прокси-сервер напрямую подключается к IP-адресу и убедитесь, что хост прослушивает IP без имени хоста)

Марк Хендерсон
источник
1
Чтобы убедиться, что старый веб-сервер обновлен на новом DNS. Добавьте запись в / etc / hosts.
Мэтью Скрагг
@ MatthewScragg Можете ли вы дать больше информации об этом? Шаги и результаты ..
Бирла
1
@Birla На старом веб-сервере добавьте в него, чтобы /etc/hosts 123.456.789.12 my.domain.comтолько ваш старый веб-сервер узнал об обновленном адресе. Когда клиент обращается к старому веб-серверу (поскольку у него нет обновленного DNS), веб-сервер может прокси-запрос с использованием доменного имени. Я не использую Apache, но вот пример Nginx: gist.github.com/scragg0x/738f144b33d17ef763d1
Мэттью Скрагг
11

Моя компания только что сделала это с несколькими большими веб-сайтами. Основная процедура, которой мы следовали, была:

  1. Понизьте TTL домена в максимально возможной степени. Сделайте это заранее, по крайней мере, столько же времени, сколько текущий TTL.
  2. Настройте веб-сайт на новом сервере точно так, как вы хотите, чтобы «конечный продукт» был
  3. Добавьте псевдоним для сайта на новом сервере, например, www2.domain.com или www-new.domain.com. С Apache вы бы использовали директиву ServerAlias . Если на сайте вообще есть какой-либо динамический код (PHP, mod_perl, RubyOnRails и т. Д.), Убедитесь, что сайт будет вести себя правильно и отвечать этим новым именем.
  4. В другое время установите перенаправление на старый сервер, указывающий на новый сервер
  5. Измените DNS на www, чтобы перейти на новый IP.

Для Apache вам, вероятно, следует использовать mod_rewrite для перенаправления, чтобы вы могли сохранить URI, запрошенные клиентом. Простая реализация будет:

# 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>

Это сделает временный редирект 302 для www.domain.com/anything на www-new.domain.com/anything. Вы хотите, чтобы он был временным, потому что вы, вероятно, хотите, чтобы поисковые системы индексировали только www.domain.com, а не www-new.domain.com.

После того, как изменение DNS для www.domain.com распространилось к вашему удовлетворению, вы можете либо полностью сбросить www-new, либо осторожно облегчить кому-либо его использование обратно на www с другим перенаправлением. Это почти тот же процесс, что и выше; настройте старый сервер для обработки www-new, измените DNS на www-new, чтобы он указывал на старый сервер, и настройте перенаправление на старый сервер, отправляющий трафик www-new на 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>

На этот раз вы хотите сделать постоянное перенаправление 301, чтобы снова указать сканерам поисковых систем, что www.domain.com - это сайт, который вы хотите, чтобы они проиндексировали.

Джеймс Снерингер
источник
4

Хорошо, основываясь на том, что рекомендовал @Farseeker, я установил следующую конфигурацию на старом сервере Apache для пересылки запросов на новый сервер:

<VirtualHost *>
  UseCanonicalName Off
  ServerAdmin  me@domain.com
  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>

Чтобы убедиться, что старый сервер имел правильный адрес, я поместил запись в /etc/hosts:

1.2.3.4 domain.com

Я также должен был включить Apache mod_proxyи mod_proxy_httpмодули и перезагрузить конфигурацию:

a2enmod proxy
a2enmod proxy_http
/etc/init.d/apache force-reload
Том
источник
Ницца. Как работать с произвольными поддоменами?
Ekevoo
4

Это старая ветка, но, возможно, она кому-нибудь поможет:

В дополнение к ответам Марка Хендерсона (mod_proxy) ИЛИ James Sneeringer (перенаправление 302,301 на новые субдомены), можно добавить еще одну вещь относительно синхронизации базы данных при перемещении больших приложений.

Если ваш веб-проект использует базу данных (например, MySQL), перед переключением DNS убедитесь, что приложения (например, PHP) с обоих серверов подключаются к одной и той же базе данных. Таким образом, чтение и запись идут в одно и то же место, и вам не нужно иметь дело с различными инструментами синхронизации БД после этого.

Это (скорее всего) повлияет на время загрузки на одном сервере, но для периода переключения это может быть принято.

В случае, если сервер БД недоступен извне, вы также можете настроить mysql_proxy на веб-сервере, который имеет к нему доступ и доступен с внешних IP-адресов.

cephuo
источник
3

Я использую iptables для этого, когда мне нужно это сделать; немного DNAT / SNAT, и весь ваш трафик волшебным образом появляется там, где и должен быть. Если у вас есть реальная необходимость поддерживать исходные IP-адреса, обратный прокси-сервер может помочь, установив соответствующие заголовки, но для этого нужно много пощечин на обоих концах, чтобы убедиться, что все совпадает, поэтому я обычно не беспокоюсь об этом для чего-то вроде миграции, поскольку она временная, и снижение TTL обрабатывает большую часть этого.

romble
источник