+7 707 858 58 37
help@vpsadm.ru
О переносе сайтов от профи. Копирование и перенос файлов с сервера на сервер. Как это делают админы :)

Наиболее частая задача, с которой приходится работать как вебмастерам, так и системным администраторам — это перенос сайтов, баз данных, копирование файлов с одного сервера на другой, или с шареда на сервер, и даже перенос между шаредами. Если иметь некоторый опыт в администрировании и работе с Linux-серверами, с консолью, то такая задача решается очень просто. Да и не имея такового — она считается несложной. Однако есть некоторые нюансы, которые могут облегчить и ускорить сей  процесс в разы.

Что такое FTP и зачем он нужен?

Базово олдскульные  вебмастера привыкли пользоваться протоколом FTP. Логично, File Transfer Protocol — протокол для передачи файлов, он ведь так и называется.  Этим довольно просто пользоваться, когда вы имеете небольшие сайты, с небольшим количеством файлов — несколько сотен, объемом до 1-2 Гб. Но и то, такая задача может превратиться в часы мучений в некоторых условиях.

Ибо если же вам нужно перенести хотя бы гигабайты данных, то вы неминуемо столкнетесь с проблемами, что обрывается соединение, файлы передаются очень медленно и долго. Это объясняется простым фактом, что протокол FTP был создан аж в 1971 году. То есть ему уже 50 лет.

Это самый неудобный и медленный способ передачи данных, как при заливке с локальной машины на сервер, так и при передаче между серверами и хостингами. Более того, при необходимости  передачи файлов с одного сервера на другой вебмастер обычно даже не знает как это осуществить с помощью FTP, ибо для этого нужно уметь обращаться с консольным FTP-клиентом, да и большинство людей даже не знают что так можно.

Ну и делают обычно как — сливают с исходного сервера все файлы на свою локальную машину, затем заливают файлы на целевой сервер. И чем больше объем и количество файлов, которые нужно перенести, тем в большую головную боль и мучения это всё превращается.

Как работать с файлами на сервере Linux не имея доступа по FTP?

Те, кто немного попродвинутей и опытней в вебмастерском деле, они уже могут знать, что существует возможность передачи файлов через более безопасный и быстрый протокол SSH. Да-да, тот самый, который используется для управления серверами и предоставляет  возможность подключаться к серверу посредством консольного SSH-клиента такого как Putty.

 

Такие люди используют для работы с файлами утилиту WinSCP, являющуюся виндовым аналогом консольной утилиты scp.

Scp — нативная утилита в линуксах, которая позволяет копировать файлы по сети между серверами. Создана на основе стандартной утилиты копирования файлов — cp. Поэтому так и называется — S (secure) CP (copy).

А можно просто использовать любой FTP-клиент подключаясь SSH-пользователем на 22-порт. Можно даже рутом и тогда будете иметь доступ через Файлзиллу к любым файлам на сервере.

 

И такой вариант для работы с файлами всегда будет работать гораздо стабильнее, безопаснее и быстрее. А плюс к этому, не нужно даже настраивать FTP-службу на сервере.

Идем далее.

Быстрый перенос и копирование файлов с сервера на сервер

Я упоминал, что обычно люди переносят сайты используя свою рабочую локальную машину  в качестве промежуточной. Пользование способами описанными выше только это и позволяет.  И с этим всё более-менее, когда у вас небольшой объем и количество файлов.   Но очевидно же, что гораздо быстрее, проще и удобнее переносить файлы сразу с одного сервера на другой, напрямую.  И чем больше объем этих файлов — тем сложнее будет перетаскивать их через свой локальный компьютер.  Представьте, бывают проекты, когда нужно перенести терабайты данных. Там одно только беспрерывное копирование файлов с сервера на сервер занимает несколько суток. Что уж говорить о том, чтобы упаковать это в архив, скачать на свой комп а потом отправить на сервер. Это физически вряд ли удастся — не будет хватать ни диска, а даже если вдруг он есть — можно месяцами сидеть копировать, бороться с постоянными разрывами связи и перезапуском копирования. А они наверняка будут.

Поэтому, я практически никогда не использую свою машину в качестве промежуточной при переносе файлов между серверами. Только напрямую с одного сервака на другой.  Даже если файлов немного — до 1 гб — это занимает секунды времени.  У меня на рабочем компе свободного диска гигов 5, зачем мне это всё тащить к себе.

Так вот — рекомендую и вам пользоваться такими же способами от истинных ниндзя 🙂 А их тоже не один.

Упаковка (архивация) файлов сайта на сервере и копирование с помощью SCP

Если сайт небольшой, то его можно упаковать в архив и отправить на другой сервер с помощью утилиты scp, такими командами:

tar zcf  ./site.tar.gz  #архивация. 

Её, разумеется, часто можно выполнить и через панель управления. Затем копируем (отправляем) с исходного сервера на целевой:

scp site.tar.gz  root@1.1.1.1:/root/

Здесь после указания имени пользователя и IP через двоеточие указываем путь, куда мы хотим положить на целевом сервере этот файл.

Будет  запрошен пароль от целевого сервера и файл улетит туда.

Затем его можно там распаковать:

tar zxf ./site.tar.gz

и дальше уже положить файлы куда вам надо на новом сервере.

Копировать можно вводя команды и на новом сервере, следующим образом:

scp root@2.2.2.2:/root/site.tar.gz  /var/www/

В таком случае вы не отправляете файл, а как бы забираете со старого сервера, «вытягиваете» его оттуда.  Это нужно чётко понимать, ибо дальше будут способы основанные на этом же принципе, синтаксис примерно одинаковый, отличия только в том откуда и куда вы льете файл. То есть сначала указываем удаленный сервер, откуда копировать, затем куда — путь к папке на текущем сервере.  И этот порядок справедлив для любых команд подобного типа.

Копирование большого количества файлов и папок  с одного сервера на другой без архивации

Когда файлов немного и объем небольшой, нет смысла заморачиваться с упаковкой файлов. Можно скопировать всё и так, всю папку целиком со вложенной структурой. Для этого нужно использовать опцию -r ( от recursive). Можно использовать её вмести с опцией -v ( от verbose) которая позволит наблюдать подробно ход процесса копирования — какие файлы передаются по сети, видеть прогресс.

scp -rv /var/www/site.ru root@1.1.1.1:/var/www/

В итоге у вас на новом сервере будет создана папка /var/www/site.ru и туда перенесутся все файлы с текущего.

Можно исполнить это и с нового сервера, опять же «забрать» файлы со старого, нетрудно догадаться:

scp -rv root@2.2.2.2:/var/www/site.ru  /var/www

Результат будет точно таким же.

Однако, такой способ имеет некоторые недостатки.  Во-первых, при таком копировании могут не сохраниться или сбиться права доступа к файлам и папкам. Вернее даже не права доступа, а владельцы. И их потом нужно будет выставлять, менять на нужные командой chown.

Во-вторых, куда большим недостатком является то, что утилита scp будет перезаписывать все файлы, которые у вас уже есть на сервере. А часто бывает так, что какие-то файлы у нас на сервере уже лежат, и нам нужно обновить сайт. Такая задача часто возникает к примеру у разработчиков — они пишут сайт на одной машине, а потом «деплоят» — заливают новую версию поверх старой. Так вот утилита scp в таком случае работает неэффективно, ибо она пересылает и перезаписывает все файлы подряд.  А если файлов много и передача занимает часы? Обрывается связь, и нужно перезапускать этот процесс, ну и так далее.

А еще  даже при переносе с одного сервера на другой случается,  что связь рвется, и нужно опять же процесс перезапускать.

Так вот, есть ещё более удобная штука, которая решает и эти заморочки.  Это синхронизация.

Перенос файлов с одного сервера на другой синхронизацией утилитой rsync

Эта чудесная утилита умеет переносить файлы и в процессе делать сверку файлов в папке назначения на наличие и модификации.  И она точно так же умеет работать через протокол SSH. А также и внутри сервера.  Но что же значит «проверять файлы и папки на наличие и изменения»? Это значит, она не будет файлы перезаписывать, если они уже есть в папке назначения, а будет только доливать новые и изменившиеся файлы.

А еще, это значит что при обрыве процесса по каким угодно причинам — мы можем легко продолжить процесс переноса файлов ровнёхонько с того же места, где оно было прервано. То есть долить, а не перезалить всё заново. И это значительно увеличивает эффективность и скорость работы (вспомните о террабайтах данных).

Ну что-ж, теперь давайте посмотрим как это делается.

Для начала, её может понадобиться установить, хотя часто она и так уже есть на серверах. Если не окажется, то сделать так:

yum install -y rsync  #для Centos
apt install -y rsync  #для debian, ubuntu

Утилита должна стоять на обоих серверах, если её нет на целевом сервере, куда вы ею подключаетесь — то получите ошибку.  В случае если всё нормально, то понадобится ввести пароль указанного пользователя SSH.

Но для начала, хочу сказать, что сам я этой утилитой пользуюсь не только для передачи файлов по сети между серверами. А пользуюсь для обычного копирования и внутри одного сервера. К примеру, надо мне на всякий случай сохранить текущие файлы и папки конфигурации сервера перед настройкой, я это в 2 секунды могу сделать с помощью rsync. Например так:

rsync -avh /etc  /backup/

В этом случае будет создана папка /backup/etc и внутри будет все содержимое. Аналогично тому, как если бы вы воспользовались копированием

cp -r /etc/ /backup

Однако есть нюансы, которые важно понимать, при работе с утилитой rsync. Обратите внимание, в первой команде в пути исходной папки нет закрывающего слеша. А во второй он есть, и наоборот его нету у второй папки.

cp -r /etc /backup/

Такой вариант отработает точно так же.

Однако если исполнить

rsync -avh /etc/ /backup/

Это будет работать совсем иначе. В этом случае, содержимое папки /etc нальется прямо в папку /backup. Что конечно совершенно не подходит. Ибо там может лежать что-нибудь ещё., потом разбираться что где лежит.

Без указания слеша папка будет скопирована полностью вместе с содержимым.  Но ещё лучше сделать так:

rsync -avh /etc/  /backup/etc_backup_131019/

Это значит, что будет создана папка /backup/etc_backup_131019/ и в нее синхронизируется содержимое папки /etc/

Если вдруг мне понадобится потом все вернуть, я исполню так:

rsync -avh /backup/etc_backup_131019/  /etc/

И будут перезаписаны только те файлы, которые менялись. Кстати, о ключах -avh. Они позволяют видеть процесс копирования/синхронизации — весь список файлов. За это отвечает ключ -v (verbose). Ключ -h  отображает размер  файлов в human-readable формате — то есть не в байтах, как без него, а в мегабайтах, килобайтах, гигабайтах.  Если вам нет необходимости видеть подробности, ключи -vh можно не использовать, и копировать только с ключом -a.  Он означает archive — то есть полный перенос всего как есть, включая права и владельца. Помните, я ведь говорил, что утилита scp меняет владельца. А rsync нет. Причем, не изменится именно uid и gid пользователя, останется как есть.

Поэтому если вы переносите файлы, владельцы у которых на старом и новом серверах разные,  то права вероятно придется сменить с помощью chown на пользователя, актуального на новом сервере.

chown -R apache:apache /var/www/site.ru

Примерно так.

Но что-то я забежал вперед. Давайте теперь посмотрим как можно файлы переносить rsync’ом между серверами. Наверняка кто-то уже догадался, если внимательно читал всё что выше.

rsync -avh /var/www/site.ru/  root@1.1.1.1:/var/www/site.ru/

Так нам нужно исполнить на старом сервере в качестве второго аргумента указан новый сервер и путь к папке сайта на нем, после двоеточия. Так же, как и в случае с scp.  В этом случае, при существовании такой папки на целевом сервере ее содержимое  будет синхронизировано с исходной.  Если она не существует, то будет создана и затем синхронизирована. Но помните о слешах, тут надо внимательно.

Если вы сделаете например так:

rsync -avh /var/www/site.ru  root@1.1.1.1:/var/www/site.ru/

В случае, если папка не существует на целевом сервере  — она будет создана, и всё будет нормально. Если же она уже существует, то синхронизации не произойдет. А будет создана папка /var/www/site.ru/site.ru и содержимое будет залито в неё. Это основной нюанс при работе с rsync.   Просто используйте полные пути и  слеши в конце всегда и вам будет легко с этим освоиться.

Аналогичным образом можно «вытянуть» содержимое со старого сервера, исполнив на новом:

rsync -a root@2.2.2.2:/var/www/site.ru/  /var/www/site.ru/

 

В общем, вкусив rsync, вы больше не сможете жить без него, и будете вспоминать FTP как страшный сон. Я гарантирую это.

Запуск переноса файлов в фоновом  режиме

А, еще кое что. За перенос огромного количества файлов, тех самых терабайт. Или даже десятков гигабайт. Такие процессы лучше запускать в фоновом режиме, а не прямо в той консоли, в которой вы подключились к серверу.

Для этого можно освоить и пользовать утилиту screen. Которая позволяет вешать консоли в бэкграунде. То есть в виде фонового процесса. Это помогает тем, что связь с вашей локальной машины к серверу может быть нестабильной,  сессия держаться недолго, прерываться. Тогда даже десяток гигабайт у вас в процессе копирования может прерваться, что уж говорить о больших объемах. Если же вы запустили процесс внутри screen, тогда даже если вы отвалитесь от сервера, ваше копирование будет продолжаться на сервере и вы всегда сможете заново подключиться к серверу, вернуться в screen и продолжить за ним наблюдать, или делать вообще что угодно.

ставится точно так же, если отсутствует.

yum install screen  #для дебиан и убунты сообразите сами

Затем её запускаем

screen

И всё, у вас откроется как-бы терминал в терминале.  Можете там делать всё, о чем мы говорили ранее, и вообще что угодно любое другое.

Теперь, если ваш терминал на локальной машине отвалится от сервера, вы всегда можете подключиться заново, набрать

screen -r

И попадете туда, где вы запустили ваш процесс.

Можно и принудительно отключиться от screen, оставив процесс выполняться в фоне, а самому что-то продолжить дальше делать в основном терминале. Для этого надо нажать комбинацию клавиш ctrl+a, и затем D.   А вернуться потом обратно screen -r.

Еще есть куча вариантов и способов для этой тривиальной задачи, но в 95% случаев этого достаточно.

Кстати, даже если вы работаете с шаредами — это всё справедливо, если там есть SSH, с учётом, что вы будете указывать не root в качестве пользователя, а вашего пользователя.  На большинстве из шаредов SSH есть либо по-умолчанию, либо включается из панели хостера, или как-то по запросу.

Как переносить сайты между серверами по FTP, если нету SSH?

Для тех хостеров, у кого его  нет, а есть только FTP,  я думаю отдельный котёл в аду заготовлен.  Но случается на практике и такое. И в таком случае, самый лучший способ использовать утилиту lftp. Которая позволяет делать примерно то же что и rsync, только через ftp. Хотя она более сложна в управлении, но очень спасает в таких ситуациях. Поэтому если вам нужно перегнать с одного сервера на другой именно через FTP — то используйте именно её. Но описывать как с ней обращаться мне лень, в сети есть много такой инфы, загуглите если у вас такой случай.

А ещё, вот это вот всё очень помогает понимать как можно удобнее и быстрее бэкапить свои данные. Ибо утилита rsync позволяет не перегонять весь объем данных по сети, а экономно и быстро слить только новые и изменившиеся данные. Вообще, rsync имеет кучу всевозможных опций. Умеет копировать и так и сяк. Может попутно удалять файлы как с исходного места, так и чистить лишние на целевом и ещё много всякого. Это же может делать и lftp. Но с этим стоит быть очень аккуратным, во избежание потери данных.

Если знаете варианты лучше — не стесняйтесь поделиться в комментариях, рад буду узнать.  Если есть вопросы — рад буду ответить.

Надеюсь, это чуточку облегчит кому-то жизнь и поможет стать существенно профессиональнее 🙂

 

А ещё, пользуясь случаем — я переношу сайты профессионально.  В любых мыслимых и немыслимых объемах и количествах.  Легко и быстро, решая любые проблемы, которые могут возникнуть в процессе переноса сайтов, файлов, баз данных (кстати, по их переносу тоже есть много нюансов)  и вообще всего чего угодно, что у вас крутится на Linux сервере. 

Стоимость этой услуги от 1000 руб, зависит от объема и количества сайтов, а также попутных работ — настроек, оптимизации, и прочего. Зависимость там конечно не прямая.   Обычно даже  самые сложные случаи  с сотнями сайтов и полным пакетом настройки и оптимизации оцениваются не более чем в 10к руб. 

 

Отправить ответ

Notify of
avatar
seoonly.ru
Гость

Годно!

seoonly.ru
Гость

Спасибо-) гуд мануал

Ginger Dog
Гость

годный контент, без мата, без воды, по существу, но и тоже время достаточно подробно. не тупо набор команд, а еще и пояснения. пиши побольше такого.

40сайтов
Гость

Деды фтп юзали и мы будем!

ЛутМастер
Гость

недавно узнал о rsync и это просто космос. Через нее заливаю статические сайты на сервер, как через пушку все залетает 🙂

Батрак
Гость

Спалил всю тему, теперь 500р на кворке ещё сложнее станет поднять

Имя (обязательно)
Гость

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

благодарю
Гость

спасибо, сохранил закладку, пригодится

Константин
Гость

чем такие комменты строчить, напиши лучше как пыху обновить…
читал где-то что уязвимость есть в nginx+php-fpm 7.2-7.3

Светлана
Гость

Спасибо большое за статью, нигде не могу найти решения, если не сложно подскажите пожалуйста, что делать если у серверов разные порты.

wpDiscuz