В настоящее время у меня зарегистрировано доменное имя для сервера Linux / Apache, которое я собираюсь заменить другим с новым IP-адресом.
Перенос данных будет относительно быстрым, и 5-минутный перерыв во время этого процесса приемлем.
Запись DNS имеет TTL от 6 до 12 часов, очевидно, что я не могу ускорить.
Каковы вероятные последствия этого изменения? Предположительно, пользователи, которые все еще смотрят на старый адрес, будут продолжать использовать старый сервер, в то время как пользователи, у которых истек срок действия кеша DNS или пуст, увидят новый домен.
Можно ли сделать какое-то перенаправление со старого сервера (с Apache или iptables) на новый 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 обновлен, все будет в порядке.
Что произойдет:
Если вы используете 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.