Как перенести веб-сайт с сервера на сервер без рассинхронизации

Статьи по теме хостинга

Один из вопросов, который часто задают заказчики, звучит примерно так: «Мы будем переносить кучу веб-сайтов наших клиентов на ваши виртуальные серверы. Как нам сделать так, чтобы при смене IP-адреса всё прошло гладко?».

Откуда у этого вопроса растут ноги, в принципе, ясно. Есть, скажем, веб-сайт www.zhuystroyinvest.com, который живёт на IP-адресе, скажем, 1.3.1.3. Предположим, его нужно перенести на 13.13.13.13. Если мы просто сменим его IP-адрес в настройках DNS, то у нас какое-то время (как правило, это 86400 секунд - 1 сутки) веб-сайт будет работать на 2-х серверах, потому что часть HTTP-запросов побежит уже на 13.13.13.13, а часть пользователей будет обращаться к старой копии на 1.3.1.3, поскольку в кэшах их DNS-серверов сохранилась информация о старом IP-адресе.

Естественно, это недопустимо, поскольку при этом все данные (например, информация о заказах, контент или просто следы присутствия), которые веб-сайт получит от пользователей, обращающихся к 1.3.1.3, канут в Лету, так как они останутся на старом сервере. При этом пользователи, соединяющиеся со старым сервером, будут работать с неактуальной версией веб-сайта. В общем, если правое полушарие мозга отделить от левого, мозг лучше работать не станет (впрочем, это касается не только мозга, но и других частей тела).

Что же делать?

На самом деле, конечно же, всё очень просто. Перед тем, как вносить изменения в DNS, мы позаботимся о том, чтобы те пользователи, которые побегут на новый сервер, продолжали работать со старой копией веб-сайта. Новый сервер, получив запрос от пользователя, будет обращаться к старому серверу и передавать запрос ему (назовём этот фокус «замещение»). Таким образом все будут работать фактически с одной и той же копией, при этом для нас не будет иметь значения, к какому из серверов пользователя направил его DNS. И через сутки после внесения изменений, убедившись, что к старому серверу уже никто не обращается напрямую, а все запросы на него поступают только через новый сервер, мы оперативно перебрасываем данные со старого сервера на новый и отключаем замещение.

На разных веб-серверах это можно сделать разными способами. Самый распространённый веб-сервер - это кто? Конечно же httpd имени Apache. У него есть модуль mod_proxy. Всё, что нам нужно - добавить 3 строчки в секцию VirtualHost на новом сервере:

<VirtualHost 13.13.13.13:80>
        ...
        ProxyPreserveHost On
        ProxyPass / http://1.3.1.3/
        ProxyPassReverse / http://1.3.1.3/
        ...
</VirtualHost>

Перед тем, как вносить изменения в DNS, проверим, корректно ли выполняется замещение. Для этого в свой /etc/hosts или c:\Windows\System32\drivers\etc\hosts (если у вас hosts лежит в другом месте, наверняка вы и так знаете, где его найти) добавим такое:

13.13.13.13 www.zhuystroyinvest.com

Потом откроем какой-нибудь http://www.zhuystroyinvest.com/testing-proxy в браузере и посмотрим логи на старом сервере на предмет попыток обращения к /testing-proxy с 13.13.13.13. Обращение, скорее всего, нужно будет искать не в access-логе, а в error-логе, так как URL с таким именем на переносимом веб-сайте, скорее всего, не существует.

Если всё получилось - вносим изменения в DNS и ждём сутки для завершения миграции.

Кстати, чтобы сократить время ожидания, также стоит заранее позаботиться об изменении параметра expire в SOA-записи домена до, скажем, до одного часа (3600 секунд). Правда, сделать это придётся за сутки до изменения A-записей в DNS, но это позволит значительно уменьшить период, на протяжении которого веб-сервер будет пропускать через себя весь контент и на вход, и на выход.

Предложить
Метки: ,