Перенос WordPress сайта с хостинга на LAMP

LAMP
Linux, Apache, MySqL, PHP

Стек LAMP — это набор открытого программного обеспечения, который используется для создания веб-серверов. Аббревиатура является набором первых букв в названии технологий Linux, Apache, MySQL и PHP.
Далее подразумевается, что операционная система Ubuntu 20.04 уже установлена и будут установлены остальные компоненты.

Шаг 1. Чек-лист после установки ОС
Шаг 2. Устанавливаем Apache
Шаг 3. Устанавливаем MySQL
Шаг 4. Устанавливаем PHP
Шаг 5. Создание виртуального хоста для сайта
Шаг 6. Тестирование обработки PHP на веб-сервере
Шаг 7. Создание базы данных
Шаг 8. Перенос контента сайта

Шаг 1. Чек-лист после установки ОС:

  1. При установке Ubuntu предлагает создать пользователя отличного от root с правами sudo.
    Проверяем что наш пользователь входит в группу sudo.
groups [nameuser]
Результат:
[…] sudo […]
  1. При установке Ubuntu предлагает установить OpenSSH и мы его установили.
    Проверяем что служба OpenSSH зарегистрирована в брандмауэре UFW.
sudo ufw app list
Результат:
Available applications:
OpenSSH

Разрешаем постоянный доступ по ssh

ufw allow OpenSSH
Вывод
Rules updated
Rules updated (v6)

Активируем брандмауэр:

ufw enable
Результат
Firewall is active and enabled on system startup

Проверяем статус:

sudo ufw status
Результат:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)

Вы можете настроить доступ по ssh с конкретных ip-адресов и на отличный от 22 порт.
Можно смотреть здесь:
https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-with-ufw-on-ubuntu-18-04-ru

Шаг 2. Устанавливаем Apache

sudo apt update
sudo apt install apache2

Смотрим настройки брандмауэра после установки Apache:

sudo ufw app list
Результат
Available applications:
Apache (открывает 80 порт)
Apache Full (открывает 80 и 443 порты)
Apache Secure (открывает 443 порт)
OpenSSH

Пока нет сертификата TLS/SSL открываем только 80 порт.

sudo ufw allow in "Apache"

Проверим изменения:

sudo ufw status
Результат
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Apache ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Apache (v6) ALLOW Anywhere (v6)

Проводим быструю проверку работы Apache. В адресной строке браузера вводим ip-адрес сервера или доменное имя — должна отобразиться страница Apache.

Страница Apache
Страница Apache

Шаг 3. Устанавливаем MySQL

sudo apt install mysql-server

После завершения установки рекомендуется запустить скрипт безопасности, предустановленный в MySQL. Этот скрипт будет удалять некоторые небезопасные настройки по умолчанию и блокировать доступ к системе управления базы данных. Для запуска интерактивного скрипта введите следующую команду:

sudo mysql_secure_installation

Здесь хочу обратить внимание на одну мелочь. В данной статье мы переносим уже готовый рабочий сайт с хостинга на LAMP. Вполне возможно что уровень паролей может отличаться между тем который на хостинге и который вы установите далее. Как это определить — посмотреть на пароль в файле wp-config.php на хостинге.
Если не уверены, что он STRONG, используйте далее в скрипте вариант 1 — MEDIUM или же дальше нужно будет сменить пароль на вариант Strong. На это я обращу внимание в нужный момент.

Результат
VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?
Press y|Y for Yes, any other key for No:

Если вы ответите утвердительно, вам будет предложено выбрать уровень проверки пароля. Если вы укажете самый высокий уровень 2, система будет выводить сообщения об ошибке при попытке установки пароля, который не будет содержать цифры, буквы в верхнем и нижнем регистре и специальные символы, или будет содержать распространенные словарные слова.

LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1

Вне зависимости от того, будете ли вы использовать плагин VALIDATE PASSWORD PLUGIN, ваш сервер предложит вам выбрать и подтвердить пароль для root user в MySQL. Не нужно путать его с системным пользователем root. Пользователь root базы данных — это пользователь с правами администратора, который имеет все права для работы с системой управления базы данных. Хотя в MySQL метод аутентификации пользователя root по умолчанию не требует использования пароля даже при его наличии, задайте надежный пароль для обеспечения дополнительной безопасности.

Если вы включили использование паролей, вы увидите уровень надежности введенного пароля для пользователя root, и ваш сервер запросит у вас подтверждение дальнейшего использования этого пароля. Если вас устраивает текущий пароль, введите Y в диалоге для подтверждения:

Результат:
Estimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y

Для всех остальных вопросов нужно выбирать Y и нажимать ENTER в каждом диалоге. Выбрав эти ответы, вы удалите ряд анонимных пользователей и тестовую базу данных, отключите возможность удаленного входа пользователя root и загрузите новые правила, чтобы внесенные изменения немедленно активировались в MySQL.

Завершив настройку, проверьте возможность входа в консоль MySQL, набрав следующую команду:

sudo mysql

В результате будет установлено подключение к серверу MySQL с помощью пользователя root базы данных с правами администратора, который логически выводится в результате использования sudo при запуске данной команды. Результат должен выглядеть следующим образом:

Результат:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 22
Server version: 8.0.19-0ubuntu5 (Ubuntu)
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>

Для выхода из консоли MySQL введите следующую команду:

mysql> exit

Обратите внимание, что для подключения под именем пользователя root не требуется вводить пароль, хотя вы и задали его при запуске скрипта mysql_secure_installation. Хотя это может выглядеть как проблема безопасности, это делает сервер БД более безопасным, поскольку вход с правами root в MySQL доступен только системным пользователям с привилегиями sudo, которые подключаются через консоль или через приложение с тем же уровнем прав. На практике это означает, что вы не сможете использовать пользователя root базы данных с правами администратора для подключения из вашего приложения PHP. Настройка пароля учетной записи root MySQL работает как гарантия, если метод аутентификации по умолчанию меняется с unix_socket на password.

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

Шаг 4. Устанавливаем PHP

Устанавливаем PHP и некоторые нужные пакеты.

sudo apt install php libapache2-mod-php php-mysql

Смотрим версию PHP

php -v
Например результат:
PHP 7.4.3 (cli) (built: Mar 26 2020 20:24:23) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies

Шаг 5. Создание виртуального хоста для сайта

При использовании веб-сервера Apache вы можете создать виртуальные хосты для инкапсуляции данных конфигурации и размещения на одном сервере нескольких доменов.
Создайте следующий каталог для [my_domain]

sudo mkdir /var/www/my_domain

Владельца и права исправим когда перенесем наш сайт в /var/www/my_domain

После этого откройте новый файл конфигурации в директории Apache sites-available с помощью любого редактора командной строки. Например, nano:

sudo nano /etc/apache2/sites-available/my_domain.conf

В результате будет создан новый пустой файл. Вставьте следующую пустую конфигурацию:

<VirtualHost *:80>
ServerName my_domain
ServerAlias www.my_domain
ServerAdmin webmaster@localhost
DocumentRoot /var/www/my_domain
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Эта конфигурация VirtualHost указывает Apache обслуживать my_domain, используя /var/www/my_domain в качестве корневого каталога.

Для разрешения файлов .htaccess необходимо установить директиву AllowOverride внутри блока Directory, отвечающего за корневую директорию сайта. Для этого добавьте в конец файла следующие строки:

...
<Directory /var/www/my_domain/>
Options All -Indexes
AllowOverride All
</Directory>
</VirtualHost>

Теперь вы можно использовать a2ensite для активации нового виртуального хоста:

sudo a2ensite my_domain

Отключаем сайт по умолчанию, устанавливаемый с Apache.

sudo a2dissite 000-default

Проверяем синтаксис файла конфигурации

sudo apache2ctl configtest

В заключение перезагрузите Apache, чтобы эти изменения вступили в силу:

sudo systemctl reload apache2

Проверим работу виртуального хоста.
Создадим файл в каталоге /var/www/my_domain

sudo nano /var/www/my_domain/index.html

Внесем в него следующее:

<h1>It works!</h1>
<p>This is the landing page of <strong> my_domain</strong>.</p>

Откройте браузер и введите в адресную строку доменное имя вашего сервера или IP-адрес.
Вы должны увидеть следующее:

Apache is work
Виртуальный хост Apache работает

Если вы видите эту страницу, это означает, что виртуальный хост Apache работает, как и ожидалось.

Вы можете оставить этот файл в качестве временной начальной страницы, пока не настроите файл index.php для его замены. Как только вы сделаете это, не забудьте удалить или переименовать файл index.html из корневого каталога документов, так как он будет иметь приоритет перед файлом index.php по умолчанию.

Если в Apache используются настройки DirectoryIndex по умолчанию, файл index.html всегда будет иметь приоритет по сравнению файлом index.php. Это полезно при настройке страниц техобслуживания приложений PHP посредством создания временного файла index.html с информационным сообщением для посетителей. Поскольку эта страница будет иметь приоритет перед страницей index.php, она станет начальной страницей приложения. После завершения обслуживания файл index.html можно переименовать или удалить из корневого каталога документов, в результате чего восстановится обычная начальная страница приложения.

Если вы хотите изменить это поведение, отредактируйте файл /etc/apache2/mods-enabled/dir.conf и измените порядковое расположение файла index.php в директиве DirectoryIndex:

sudo nano /etc/apache2/mods-enabled/dir.conf
<IfModule mod_dir.c>
DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
</IfModule>

После сохранения и закрытия файла вам нужно будет перезагрузить Apache, чтобы изменения вступили в силу:

sudo systemctl reload apache2

Шаг 6. Тестирование обработки PHP на веб-сервере

Мы указали персонализированное расположение для хостинга файлов и папок сайта и теперь можем создать тестовый скрипт PHP, чтобы подтвердить способность Apache обрабатывать запросы для файлов PHP.
Создайте новый файл с именем info.php в корневой папке сайта:

sudo nano /var/www/my_domain/info.php

В результате откроется пустой файл. Вставьте в файл следующий код PHP и сохраните изменения:

<?php
phpinfo();

Чтобы протестировать этот скрипт, откройте браузер и введите доменное имя или IP-адрес вашего сервера, а затем название скрипта, в данном случае info.php:
http://server_domain_or_IP/info.php
Вы увидите приблизительно следующую страницу:

php.info
php.info

Если вы видите эту страницу в своем браузере, ваша система PHP работает надлежащим образом.

Удаляем созданную страницу, поскольку он содержит конфиденциальную информацию о вашей среде PHP и о вашем сервере Ubuntu. Для этого можно использовать rm:

sudo rm /var/www/my_domain/info.php

Шаг 7. Создание базы данных

Вначале необходимо подключиться к консоли MySQL с помощью учетной записи root:

sudo mysql

Чтобы создать новую базу данных, запустите следующую команду в консоли MySQL:

mysql> CREATE DATABASE example_database;

Я буду создавать базу аналогичную базе wordpress на хостинге.
Смотрим в файле wp-config.php на хостинге имя db, user, password
Если хотим изменить, создаем базу, юзера и пароль новые, а до загрузки на новый сервер меняем в файле wp-config.php

Следующая команда создает нового пользователя с именем example_user и паролем.

mysql> CREATE USER 'example_user'@'%' IDENTIFIED BY 'password';

Теперь нам нужно предоставить этому пользователю разрешение для базы данных example_database:

mysql> GRANT ALL PRIVILEGES ON example_database.* TO 'example_user'@'localhost';

Применим изменения:

mysql> FLUSH PRIVILEGES;

В результате пользователь example_user получит полный набор привилегий для базы данных example_database, но не будет обладать возможностью создания или изменения других баз данных на сервере.
Выходим из MySQL.

mysql> exit

Вы можете проверить наличие у нового пользователя необходимых разрешений, выполнив повторный вход в консоль MySQL, на этот раз используя учетные данные вашего собственного пользователя:

mysql -u example_user -p

Обратите внимание на флаг -p в этой команде, который будет запрашивать пароль, который вы задаете при создании пользователя example_user. После входа в консоль MySQL убедитесь, что у вас есть доступ к базе данных example_database:

SHOW DATABASES;
Результат:
+--------------------+
| Database |
+--------------------+
| example_database |
| information_schema |
+--------------------+
2 rows in set (0.000 sec)

Импортируем файл резервной копии базы данных переносимого сайта в созданную нами новую базу (необходимо указывать абсолютный путь к файлу резервной копии):

mysql> USE example_database;
mysql> SOURCE /var/www/my_db_file.sql;

После успешного импорта можно выйти из MySQL:

mysql> EXIT;

В завершение необходимо удалить файл резервной копии базы данных:

rm /var/www/example_database.sql

Шаг 8. Перенос контента сайта

Для подключения к серверу LAMP и копирования файлов я использую WinSCP
Если вы работаете не под рутом, то коннектитесь на LAMP к директории home/user/
Заливаем в нее контент нашего сайт.
Далее копируем все файлы сайта в папку на сервере /var/www/my_domain
Мы используем точку в конце директории источника, чтобы указать, что все находящиеся в директории файлы должны быть скопированы, включая скрытые файлы (например, созданный нами файл .htaccess):

sudo cp -a /tmp/wordpress/. /var/www/wordpress

Проверяем wp-config.php. Меняем имя базы данных, юзера и пароль, если менялись эти данные при создании базы на нашем сервере LAMP.

Для корректной работы веб-сервера необходимо изменить владельца файлов в корневой директории сайта на www-data — это пользователь, под которым запускается и работает веб-сервер Apache.

sudo chown -R www-data:www-data /var/www/my_domain

Также необходимо задать корректные права для файлов и директорий сайта:

sudo find /var/www/my_domain/ -type d -exec chmod 750 {} \;
sudo find /var/www/my_domain/ -type f -exec chmod 640 {} \;

Проверяем работу сайта.

LAMP
Good Bye!