Назад | Перейти на главную страницу

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

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

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

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

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

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

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

  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 - это сайт, который вы хотите, чтобы они проиндексировали.

Вы можете использовать обратный прокси на старом веб-сервере. Может потребоваться небольшая работа по настройке, но пока ЕГО DNS обновлен, все будет в порядке.

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

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

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

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

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

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

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

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

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

Хорошо, основываясь на рекомендациях @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

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