Перенос работающего веб-проекта на новый VPS или к другому хостинг-провайдеру — одна из самых ответственных задач системного администратора. Любая оплошность грозит многочасовым простоем (downtime), потерей свежих заказов в интернет-магазине, рассинхронизацией базы данных и просадкой позиций в поисковой выдаче Яндекса и Google.
В профессиональной инфраструктуре концепция Zero Downtime Migration (бесшовный перенос) является обязательным стандартом. Сайт обязан непрерывно отдавать страницы пользователям и принимать платежи даже в ту секунду, когда данные перекачиваются между серверами.
1. Анатомия простоя: почему сайты падают при обычной миграции
Большинство вебмастеров переносят сайты по устаревшей схеме: архивируют сайт через zip/tar, делают дамп базы, меняют IP в DNS и ждут. Это приводит к трем классическим проблемам:
- Кэширование DNS (DNS Propagation Delay): Пока интернет-провайдеры обновляют кэш записей (что может занимать от 2 до 48 часов), половина пользователей продолжает отправлять запросы на старый сервер, а вторая половина — уже на новый.
- Разделение данных (Split-Brain): Если оба сервера активны и принимают заказы/комментарии, у вас образуются две несогласованные базы данных. Свести их воедино после миграции практически невозможно без ручного редактирования таблиц.
- Ошибки конфигурации на «живом» трафике: Если на новом сервере забыли включить PHP-расширение, настроить права доступа
chmod/chownили выпустить SSL-сертификат, все посетители увидят белые экраны или ошибки502 Bad Gateway.
2. Фаза 1: DNS-подготовка и магия TTL (за 24–48 часов до переноса)
Параметр TTL (Time to Live) в DNS-записи указывает резолверам и браузерам, сколько секунд разрешено кэшировать IP-адрес вашего домена. По умолчанию у большинства регистраторов установлен TTL 86400 (24 часа) или 14400 (4 часа).
Если вы измените A-запись с TTL 86400, провайдеры будут опрашивать новый сервер только через сутки. Поэтому подготовку начинают за 1–2 дня до миграции:
| Этап | Значение TTL | Когда применять | Цель |
|---|---|---|---|
| Обычный режим | 3600 – 86400 сек (1–24 ч) | Постоянно | Снижение нагрузки на авторитетные DNS-серверы |
| Подготовка к миграции | 300 сек (5 минут) | За 24–48 часов до переноса | Сброс кэша у всех мировых провайдеров до 5 минут |
| После миграции | 3600 – 14400 сек (1–4 ч) | Через 24 часа после переключения | Возврат к стабильному продакшен-кэшированию |
Проверьте текущее значение TTL и резолв домена через наш онлайн-инструмент DNS Резолвер SysKit. Убедитесь, что все NS-серверы отдают новое короткое значение TTL.
3. Фаза 2: Развертывание и настройка целевого VPS
На новом сервере разворачивается полностью идентичный программный стек (или обновленные совместимые версии). Важно настроить веб-сервер, PHP-FPM, базы данных и права доступа до копирования файлов проекта.
1. Установка веб-сервера и PHP:
# Установка Nginx и PHP 8.3 со всеми модулями (Ubuntu 24.04 / Debian 12)
sudo apt update && sudo apt install -y nginx php8.3-fpm php8.3-cli php8.3-mysql \
php8.3-curl php8.3-gd php8.3-mbstring php8.3-xml php8.3-zip php8.3-intl php8.3-redis \
mariadb-server rsync ufw fail2ban
2. Создание директории сайта и пользователя:
# Создаем изолированную директорию
sudo mkdir -p /var/www/example.com/public_html
sudo chown -R www-data:www-data /var/www/example.com
sudo chmod -R 755 /var/www/example.com
3. Настройка виртуального хоста Nginx:
Создайте конфигурационный файл /etc/nginx/sites-available/example.com.conf. Вы можете воспользоваться нашим эталонным генератором Nginx FastCGI Config или настроить базовый блок:
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com/public_html;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ /\.ht {
deny all;
}
}
Активируйте сайт и проверьте синтаксис:
sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
4. Фаза 3: Первичная синхронизация файлов и медиа через rsync
Файлы сайта (особенно медиатека wp-content/uploads, каталоги товаров или пользовательские вложения) могут весить десятки и сотни гигабайт. Архивирование в .zip на старом сервере перегрузит CPU и забьет диск.
Используйте rsync — он передает файлы напрямую по SSH-туннелю с потоковым сжатием и сохранением прав владельца.
# Выполняется на НОВОМ сервере (стягиваем файлы со старого VPS):
rsync -avzP --delete \
--exclude='*.log' \
--exclude='cache/*' \
--exclude='tmp/*' \
root@OLD_SERVER_IP:/var/www/example.com/public_html/ \
/var/www/example.com/public_html/
-a(archive): рекурсивный перенос с сохранением симлинков, прав, времени модификации и владельцев.-v(verbose): подробный вывод процесса.-z(compress): сжатие данных «на лету» для экономии сетевого трафика.-P(progress + partial): отображение прогресс-бара и возможность докачки при обрыве связи.
Поскольку сайт продолжает работать на старом сервере, первая синхронизация может занять от 10 минут до нескольких часов, совершенно не влияя на пользователей.
Рекомендуемые VDS-провайдеры
Отказоустойчивые сервера с быстрыми NVMe и каналом до 1 Гбит/с
Сверхбыстрые NVMe диски до 50 000 IOPS, высокочастотные ядра до 5.0 GHz, бесплатная панель переезда и удобные автоматические снапшоты перед миграцией.
Отказоустойчивая KVM-инфраструктура, 3 ТБ трафика на скорости 1 Гбит/с, дата-центры в Москве и Санкт-Петербурге, выделенные vCPU без троттлинга.
Круглосуточная служба заботы бесплатно перенесет ваши сайты с любого хостинга под ключ, настроит базы данных и выпустит SSL-сертификаты.
5. Фаза 4: Тестирование нового сервера через hosts до смены DNS
Критический этап: никогда не меняйте DNS-записи вслепую. Сначала протестируйте работу сайта на новом сервере со своего локального компьютера.
Способ 1: Локальный файл hosts
Файл hosts переопределяет DNS локально для вашего браузера. Добавьте в него строку с IP нового сервера:
- Windows:
C:\Windows\System32\drivers\etc\hosts(открыть блокнотом от имени Администратора). - macOS / Linux:
sudo nano /etc/hosts.
# Добавляем в конец файла hosts:
NEW_SERVER_IP example.com www.example.com
Откройте браузер в режиме «Инкогнито» и перейдите на http://example.com. Проверьте:
- Открываются ли внутренние страницы сайта.
- Работает ли авторизация в админ-панель (WordPress, Bitrix, Laravel).
- Нет ли фатальных ошибок PHP в логах:
tail -f /var/log/nginx/error.log.
Способ 2: Проверка через curl с подменой IP
# Тестируем ответ веб-сервера без изменения hosts
curl -Iv --resolve example.com:80:NEW_SERVER_IP http://example.com/
Установка временного SSL-сертификата (Let's Encrypt / acme.sh):
Пока домен резолвится в старый IP, утилита certbot в режиме HTTP-01 проверки не сможет выпустить сертификат на новом сервере. Решить это можно двумя путями:
- DNS-01 Challenge: выпустить сертификат через Certbot или acme.sh с подтверждением через TXT-запись DNS.
- Перенос сертификатов со старого сервера: просто скопируйте папку
/etc/letsencryptсо старого VPS на новый тем же rsync.
После настройки проверьте корректность цепочки сертификата через наш SSL Чекер.
6. Фаза 5: Час «Ч» (Cutover) — перенос базы данных и дельта-синхронизация
Когда новый сервер полностью настроен и проверен, наступает момент финального переключения. Чтобы исключить рассинхронизацию заказов, переводим сайт в кратковременный режим «Только для чтения» (Read-Only) на 1–2 минуты.
Шаг 1: Блокировка записи на старом сервере
Для CMS WordPress можно временно активировать maintenance-режим или ограничить права пользователя БД на запись. В MySQL можно заблокировать таблицы командой:
-- Блокировка на старом сервере (в MySQL CLI):
FLUSH TABLES WITH READ LOCK;
Шаг 2: Создание консистентного дампа MySQL
# Выполняем на СТАРОМ сервере:
# Ключ --single-transaction гарантирует консистентность InnoDB без блокировки чтения
mysqldump -u root -p --single-transaction --quick --routines --triggers \
example_db | gzip > /tmp/db_backup.sql.gz
Шаг 3: Передача дампа и развертывание на новом VPS
# Передаем дамп на новый сервер:
scp /tmp/db_backup.sql.gz root@NEW_SERVER_IP:/tmp/
# На НОВОМ сервере импортируем дамп:
zcat /tmp/db_backup.sql.gz | mysql -u root -p example_db
Шаг 4: Финальная быстрая дельта-синхронизация файлов
# Занимает 5-10 секунд, так как 99.9% файлов уже скопировано на Фазе 3:
rsync -avzP --delete \
root@OLD_SERVER_IP:/var/www/example.com/public_html/ \
/var/www/example.com/public_html/
7. Фаза 6: Проксирование «хвостового» трафика со старого IP через Nginx
Главный секрет настоящего Zero Downtime: Даже при TTL = 300 секунд часть запросов от застрявших DNS-кэшей будет приходить на СТАРЫЙ сервер.
Вместо того чтобы отдавать старую копию сайта, мы превращаем старый VPS в Reverse Proxy, который прозрачно пересылает весь входящий HTTP/HTTPS трафик на НОВЫЙ сервер!
Отредактируйте конфиг сайта на СТАРОМ сервере:
# /etc/nginx/sites-available/example.com.conf на СТАРОМ VPS:
server {
listen 80;
listen 443 ssl http2;
server_name example.com www.example.com;
# SSL сертификаты оставляем старые
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / {
# Проксируем все запросы напрямую на IP нового VPS:
proxy_pass https://NEW_SERVER_IP;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 10s;
proxy_read_timeout 60s;
}
}
Примените настройки: sudo nginx -t && sudo systemctl reload nginx.
8. Фаза 7: Переключение DNS и постмиграционный аудит
Теперь меняем DNS A-запись у вашего регистратора или в панели DNS-хостинга:
@ IN A NEW_SERVER_IP
www IN A NEW_SERVER_IP
Постмиграционный чек-лист:
- Удалите тестовую строку из вашего локального файла
hosts. - Проверьте резолв домена из разных точек мира через DNS Резолвер.
- Проверьте сетевой пинг и время первого байта (TTFB) через Пинг чекер SysKit.
- Убедитесь, что порты 80 и 443 открыты, а SSH порт защищен через Сканер портов.
- Проверьте логи доступа на новом сервере:
tail -f /var/log/nginx/access.log— поток запросов должен плавно нарастать. - Через 24 часа увеличьте TTL в DNS обратно до стандартных
3600или86400секунд. - Старый сервер можно безопасно отключить через 48–72 часа, когда в его логах
access.logполностью исчезнут входящие запросы.
9. Сводный чек-лист готовности сисадмина
✅ Чек-лист идеальной миграции:
- TTL в DNS снижен до 300 секунд за 24 часа до работ.
- Стек Nginx/PHP/MySQL развернут и настроен на целевом VPS.
- 99% статики заранее синхронизировано через
rsync -avzP. - Работоспособность сайта проверена через локальный
hosts. - SSL-сертификаты установлены и валидны.
- Свежий дамп БД развернут с ключом
--single-transaction. - На старом сервере включен Reverse Proxy на новый IP.
- A-записи в DNS переключены на новый IP.
- Мониторинг логов и возврат TTL до 3600 через сутки.
⚠️ Ошибки, создающие Downtime:
- Перенос файлов через zip/FTP: архивация сотен гигабайт кладет диск, а FTP рвет права доступа файлов.
- Смена DNS без предварительного снижения TTL: растягивает миграцию на двое суток.
- Игнорирование проверки hosts: все скрытые ошибки PHP вылезают прямо на глазах у клиентов.
- Преждевременное удаление старого сервера: убивает запросы пользователей с закэшированным старым IP.
🚀 Ищете надежный VPS с гарантией аптайма 99.98%?
Разверните производительный облачный сервер на быстрых NVMe дисках и воспользуйтесь бесплатным переносом проектов от ведущих российских хостинг-провайдеров.
Выбрать VPS для миграции на Timeweb Cloud →