Перенос Drupal с локального компьютера на хостинг.

В этой статье я расскажу как перенести Drupal с локального компьютера на хостинг. Хотя ничего особо сложного в этом нет, но многие часто сталкиваются с проблемами при переносе или после переноса. Возможно потому, что плохо себе представляют как же всё работает...


Автор: Виктор Вислобоков


Итак, дано: поднятый локально Drupal (например в Denwer). Перенос будет состоять из нескольких отдельных операций:

  1. Заходим в админку в раздел admin/settings/site-maintenance и переводим сайт в режим обслуживания Off-line. Это необходимо для того, чтобы в момент создания копии БД и файлов, а также в момент развёртывания этих копий на хостинге, никто не внёс каких-либо изменений в файлы или БД, которые сделают ваш сайт неработоспособным.
  2. Делаем архив файлов Drupal тем архиватором, который гарантировано есть на хостинге. Разумеется, что если у вас файлов немного, а хостер предоставляет доступ по FTP или SSH, возможно, более быстрым и менее трудоёмким способом будет просто копирование файлов напрямую на сам сервер хостинга. Тут уже смотрите сами.
  3. Переносим созданный в предыдущем пункте архив на хостинг и распаковываем его. Если вы не создавали архив в предыдущем пункте, можете пропустить этот пункт.
  4. А теперь внимание! Для хостинга на UNIX (Linux, FreeBSD), убедитесь, что на перенесённые вами файлы и каталоги выставлены правильные права доступа и правильный владелец/группа. Если вы не знаете какие должны быть права доступа - обратитесь к хостеру (обычно хостер сам пишет это в FAQ на своём сайте). Для сайтов, где PHP работает в режиме CGI или FastCGI права на файлы обычно 0644 и на каталоги 0755. Владелец и группа обычно совпадают с именем учётной записи (аккаунта) с помощью которой вы осуществляете вход на FTP и/или SSH. Многие FTP-клиенты устанавливают неправильные права доступа!
  5. Переходим к БД. Сделайте дамп БД командой
    mysqldump имя_БД > dump.sql
    
    и перенесите файл с дампом на хостинг. Можно, конечно, попробовать сделать дамп с помощью phpMyAdmin, а потом залить этот дамп также с помощью phpMyAdmin на хостинге, но я бы ОЧЕНЬ не рекомендовал этого делать в силу нескольких причин, а именно:
      — При выгрузке дампа он может выгрузиться неполностью без каких-либо сообщений об ошибках, преценденты бывали!
      — Кодировки для phpMyAdmin у вас на локальном хосте и у хостера могут отличаться и в результате дамп загрузить либо вообще не получится, либо вместо русских букв вы потом на сайте увидите знаки вопроса, квадратики и прочие "полезные" символы.
      — Поскольку загрузка большого дампа через phpMyAdmin является затратной операцией с точки зрения ресурсов сервера, хостеры обычно ставят различные лимиты, начиная от размера закачиваемого дампа, заканчивая временем в течение которого может загружаться дамп. Поэтому процесс загрузки может закончится посередине и хорошо ещё если вы получите сообщение об ошибке, а иначе вы будете уверены, что загрузили весь дамп и будете искренне удивляться почему у вас не работает Drupal, выдавая странные ошибки.
  6. Создайте БД и пользователя БД на хостинге, а также предоставьте пользователю необходимые права на БД. Обычно это легко делается через панель управления хостингом, которую вам предоставляет хостер.
  7. Перед загрузкой дампа в БД убедитесь, что БД у вас на локальной машине и БД на хостинге имеют одинаковые кодировки (CHARACTER SET) и параметр называмый COLLATE (который в частности влияет на чувствительность к регистру букв). В противном случае, либо дамп не загрузится, либо вы снова вместо русских букв увидите мусор. Задача определения кодировки не столь тривиальна как кажется. Остановимся на этом поподробней.

    Вообще-то современные версии MySQL (я имею в виду 5.0 и выше) делают дамп уже явно указывая кодировку для каждой таблицы. Поэтому, несмотря на кодировку самой БД, которая работает по умолчанию, таблицы будут созданы с правильной кодировкой. Так что, если у вас современная версия MySQL, то по идее всё дожно загрузится нормально, даже если кодировки БД по умолчанию на вашем локальном компьютере и на хостинге отличаются. Однако, если ещё один возможный подводный камень - упомянутый параметр COLLATE. Дело в том, что как правило он тоже берётся для данного CHARACTER SET по умолчанию и вот эти умолчания уже могут отличаться на вашем локальном компьютере и на хостинге. Это может привести к тому, что при загрузке дампа вы получите сообщение о том, что у вас есть дубликат какого-либо значения в таблице. На самом деле записи могут и не быть дупликатами, а просто иметь разный регистр одних и тех же букв. Если COLLATE например на вашем локальном компьютере различает значения больших и маленьких букв (чувствителен к регистру или ещё говорят зависит от регистра букв), то COLLATE на сервере хостера может их не различать и таким образом считать их дубликатами.

    В общем и целом вы можете сделать
    SHOW CREATE TABLE system;
    
    в MySQL на вашем локальном компьютере и получить как кодировку так и COLLATE, например:
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin 
    
    из этой строки в полученном по запросу результате. А можете COLLATE и не увидеть, например:
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8
    
    В этом случае вам надо выполнить ещё один запрос:
    SHOW COLLACTION;
    
    и найти в таблице, которую вы получите строчку, в которой значение поля Charset равно "utf8", а поля Default равно Yes. Тогда вы и увидите в поле Collation искомое значение COLLATE, например:
    +----------------------+----------+-----+---------+----------+---------+
    | Collation            | Charset  | Id  | Default | Compiled | Sortlen |
    +----------------------+----------+-----+---------+----------+---------+
    | utf8_general_ci      | utf8     |  33 | Yes     | Yes      |       1 |
    
    где utf8_general_ci, означает Case Insensitive, т.е. чувствительности к регистру букв нет, в то время как cs означало бы Case Sensitive, т.е. чувствительность к регистру букв есть.

    Если вы обнаружили, что у вас значение cs, а у хостера ci, а в выгруженном вами дампе при создании таблиц параметр COLLATE и указан, то вам нужно привести параметр COLLATE на хостинге в соответствие с COLLATE на вашем локальном компьютере. Для этого вы должны подключиться к БД на хостинге с помощью команды[1]:
    mysql -u пользователь --password="пароль" имя_БД
    
    и выполнить запрос:
    ALTER DATABASE DEFAULT CHARACTER SET utf8;
    ALTER DATABASE DEFAULT COLLATE utf8_general_cs;
    
    Первый запрос скорее на всякий случай, лишним не будет.
  8. Итак, после того как проблемы с кодировками решены, загружаем дамп, командой[1]:
    mysql -u пользователь --password="пароль" имя_БД < dump.sql
    
  9. Теперь отредактируйте файл sites/default/settings.php, замените в нём параметры доступа к БД с тех, которые использовались на локальном компьютере, на те, которые вы используете на хостинге (и которые вы использовали при загрузке дампа).
  10. Если вы сделали всё правильно, то можете заходить на ваш сайт уже на хостинге. Конечно же вас встретит сообщение о том, что сайт находится в режиме обслуживания, но вы можете перейти на страницу /user и авторизоваваться там как администратор Drupal.
  11. Далее, что рекомендуется сделать - это убедиться, что веб-севрер на хостинге имеет права на запись в необходимые каталоги, такие как sites/default/files. Для этого попробуйте загрузить на сайт какой-либо файл. Если это получилось сделать - значит всё нормально, если не получилось, установите соответствующие права доступа.
  12. И последнее, если у вас использовались чистые ссылки (clean URL), то проверьте работают ли они у вас! В случае проблем, прочитайте данную статью.
  13. Теперь вы можете перейти в раздел admin/settings/site-maintenance и перевести сайт в нормальный режим On-line.

Вот собственно и весь процесс переноса!


  • 1. Возможно вам ещё понадобится указать ключ -h имя_хоста, если сервер MySQL находится на другой машине, а не на этой же. Вы должны это узнать из панели управления хостингом или данных, которые вам предоставил ваш хостер.