Сайт на WordPress с кластером БД MySQL
С помощью этой инструкции вы научитесь разворачивать сайт на базе CMS WordPress с кластером баз данных под управлением СУБД MySQL в инфраструктуре Yandex Cloud.
Чтобы настроить веб-сайт на WordPress с кластером MySQL:
- Подготовьте облако к работе.
- Создайте виртуальную машину для WordPress.
- Создайте кластер БД MySQL.
- Настройте веб-сервер Nginx.
- Установите WordPress и дополнительные компоненты.
- Завершите настройку WordPress.
- Настройте DNS.
- Проверьте работу веб-сайта.
Если сайт вам больше не нужен, удалите все используемые им ресурсы.
Также инфраструктуру для веб-сайта на WordPress с кластером MySQL можно развернуть через Terraform с помощью готового файла конфигурации.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки веб-сайта на WordPress с кластером MySQL входит:
- Плата за постоянно запущенную ВМ (см. тарифы Yandex Compute Cloud).
- Плата за кластер БД MySQL (см. тарифы Yandex Managed Service for MySQL).
- Плата за использование динамического или статического внешнего IP-адреса (см. тарифы Yandex Virtual Private Cloud).
- Плата за публичные DNS-запросы и зоны (см. тарифы Yandex Cloud DNS).
Создайте ВМ для WordPress
Чтобы создать ВМ:
-
На странице каталога в консоли управления
нажмите кнопку Создать ресурс и выберите Виртуальная машина. -
В поле Имя введите имя ВМ:
wp-mysql-tutorial-web
. -
Выберите зону доступности, в которой будет находиться ВМ.
-
В блоке Выбор образа/загрузочного диска перейдите на вкладку Cloud Marketplace и выберите публичный образ Debian 11, Ubuntu 20.04 LTS или CentOS 7.
-
В блоке Вычислительные ресурсы:
- Выберите платформу.
- Укажите необходимое количество vCPU и объем RAM:
- vCPU — 2.
- Гарантированная доля vCPU — 20%.
- RAM — 2 ГБ.
-
В блоке Сетевые настройки выберите сеть и подсеть, к которым нужно подключить ВМ. Если нужной сети или подсети еще нет, вы можете создать их прямо на странице создания ВМ.
-
В поле Публичный адрес оставьте значение Автоматически, чтобы назначить ВМ случайный внешний IP-адрес из пула Yandex Cloud, или выберите статический адрес из списка, если вы зарезервировали его заранее.
-
Укажите данные для доступа на ВМ:
-
В поле Логин введите имя пользователя, например,
yc-user
. -
В поле SSH-ключ вставьте содержимое файла открытого ключа.
Пару ключей для подключения по SSH необходимо создать самостоятельно, см. раздел о подключении к ВМ по SSH.
Внимание
IP-адрес и имя хоста (FQDN) для подключения к ВМ назначатся ей при создании. Если вы выбрали вариант Без адреса в поле Публичный адрес, вы не сможете обращаться к ВМ из интернета.
-
-
Нажмите кнопку Создать ВМ.
См. раздел Как создать инфраструктуру с помощью Terraform.
Создание ВМ может занять несколько минут. Когда ВМ перейдет в статус RUNNING
, вы можете переходить к следующему шагу.
При создании ВМ назначается публичный IP-адрес и имя хоста (FQDN). Эти данные можно использовать для доступа по SSH.
Создайте кластер БД MySQL
Чтобы создать кластер БД MySQL:
-
На странице каталога в консоли управления
нажмите кнопку Создать ресурс и выберите Кластер MySQL. -
В поле Имя введите имя кластера:
wp-mysql-tutorial-db-cluster
. -
В блоке Класс хоста выберите s2.small.
-
В блоке Размер хранилища укажите 10 ГБ.
-
В блоке База данных:
- В поле Имя БД введите
wp-mysql-tutorial-db
. - В поле Имя пользователя введите
wordpress
. - В поле Пароль введите пароль, который вы будете использовать для доступа к БД.
- В поле Имя БД введите
-
В блоке Сетевые настройки:
- В списке Сеть выберите сеть, к которой будет подключен кластер.
-
В блоке Хосты добавьте еще два хоста в других зонах доступности. При создании хостов не включайте для них Публичный доступ.
-
В блоке Настройки СУБД нажмите кнопку Настроить.
В поле Default authentication plugin выберите пункт mysql_native_password и нажмите кнопку Сохранить.
-
Нажмите кнопку Создать кластер.
См. раздел Как создать инфраструктуру с помощью Terraform.
Создание кластера БД может занять несколько минут.
Настройте веб-сервер Nginx
После того как ВМ wp-mysql-tutorial-web
перейдет в статус RUNNING
:
-
В блоке Сеть на странице ВМ в консоли управления
найдите публичный IP-адрес ВМ. -
Подключитесь к ВМ по протоколу SSH. Для этого можно использовать утилиту
ssh
в Linux и macOS и программу PuTTY для Windows.Рекомендуемый способ аутентификации при подключении по SSH — с помощью пары ключей. Не забудьте настроить использование созданной пары ключей: закрытый ключ должен соответствовать открытому ключу, переданному на ВМ.
-
Установите Nginx, менеджер процессов PHP-FPM и дополнительные пакеты:
Debian/UbuntuCentOSsudo apt-get update sudo apt-get install -y nginx-full php-fpm php-mysql sudo systemctl enable nginx
sudo yum -y install epel-release sudo yum -y install nginx sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm sudo yum -y --enablerepo=remi-php74 install php php-mysql php-xml php-soap php-xmlrpc php-mbstring php-json php-gd php-mcrypt sudo yum -y --enablerepo=remi-php74 install php-fpm sudo systemctl enable nginx sudo systemctl enable php-fpm
-
Задайте настройки веб-сервера в конфигурационных файлах Nginx:
Debian/UbuntuCentOS-
Вы можете отредактировать файл с помощью редактора
nano
:sudo nano /etc/nginx/sites-available/wordpress
-
Приведите файл к виду:
server { listen 80 default_server; root /var/www/wordpress; index index.php; server_name <DNS-имя_сервера>; location / { try_files $uri $uri/ =404; } error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
-
Разрешите запуск вашего сайта:
sudo rm /etc/nginx/sites-enabled/default sudo ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/
Вы можете отредактировать файлы
nginx.conf
иwordpress.conf
с помощью редактораnano
:-
Откройте файл
nginx.conf
:sudo nano /etc/nginx/nginx.conf
-
Приведите файл к виду:
user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; include /usr/share/nginx/modules/*.conf; events { worker_connections 1024; } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; include /etc/nginx/conf.d/*.conf; }
-
Откройте файл
wordpress.conf
:sudo nano /etc/nginx/conf.d/wordpress.conf
-
Приведите файл к виду:
server { listen 80 default_server; root /usr/share/nginx/wordpress/; index index.php; server_name <DNS-имя_сервера>; location / { try_files $uri $uri/ =404; } error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
-
Установите WordPress и дополнительные компоненты
-
Загрузите и распакуйте последнюю версию WordPress:
Debian/UbuntuCentOSwget https://wordpress.org/latest.tar.gz tar -xzf latest.tar.gz mv wordpress/wp-config-sample.php wordpress/wp-config.php sudo mv wordpress /var/www/wordpress sudo chown -R www-data:www-data /var/www/wordpress
curl https://wordpress.org/latest.tar.gz --output latest.tar.gz tar -xzf latest.tar.gz mv wordpress/wp-config-sample.php wordpress/wp-config.php sudo mv wordpress /usr/share/nginx/wordpress sudo chown -R nginx:nginx /usr/share/nginx/wordpress/
Измените настройки SELinux:
sudo semanage fcontext -a -t httpd_sys_content_t "/usr/share/nginx/wordpress(/.*)?" sudo semanage fcontext -a -t httpd_sys_rw_content_t "/usr/share/nginx/wordpress(/.*)?" sudo restorecon -R /usr/share/nginx/wordpress sudo setsebool -P httpd_can_network_connect 1
-
Получите ключи безопасности WordPress:
curl -s https://api.wordpress.org/secret-key/1.1/salt/
Сохраните вывод команды — полученные ключи будут нужны на следующем шаге.
-
Добавьте ключи безопасности в конфигурационный файл WordPress
wp-config.php
. Вы можете отредактировать файл с помощью редактораnano
:Debian/UbuntuCentOSsudo nano /var/www/wordpress/wp-config.php
sudo nano /usr/share/nginx/wordpress/wp-config.php
Замените блок конфигурации на значения, полученные на предыдущем шаге:
define('AUTH_KEY', 't vz,|............R lZ5]'); define('SECURE_AUTH_KEY', '@r&pPD............dK-A%='); define('LOGGED_IN_KEY', '%6TuLl............9>/dNE'); define('NONCE_KEY', 'DO(u.H............$?ja-e'); define('AUTH_SALT', '|G Vo<............Xeb.~y'); define('SECURE_AUTH_SALT', 'Y5tIYA............7Lxf8J'); define('LOGGED_IN_SALT', 'gR]>WZ............<>|;YY'); define('NONCE_SALT', '=]nQIb............HLT2:9');
-
Перейдите к блоку конфигурации подключения к кластеру
wp-mysql-tutorial-db-cluster
:// ** MySQL settings - You can get this info from your web host. ** // /** The name of the database for WordPress. */ define( 'DB_NAME', '<DB_NAME>' ); /** MySQL database username. */ define( 'DB_USER', '<DB_USER>' ); /** MySQL database password. */ define( 'DB_PASSWORD', '<DB_PASSWORD>' ); /** MySQL hostname. */ define( 'DB_HOST', '<DB_HOST>' );
Укажите в файле вместо:
-
<DB_NAME>
— имя БДwp-mysql-tutorial-db
. -
<DB_USER>
— имя пользователяwordpress
. -
<DB_PASSWORD>
— пароль, заданный при создании кластера БД. -
<DB_HOST>
— имя хоста MySQL видаXXXX-XXXXXXXXXX.mdb.yandexcloud.net
.Чтобы узнать FQDN хоста MySQL:
Консоль управленияCLI- Перейдите на страницу кластера MySQL.
- На вкладке Базы данных нажмите значок
. - Выберите Подключиться.
- Найдите строчку
mysql --host=ХХХХ-ХХХХХХХХХХ.mdb.yandexcloud.net
, гдеХХХХ-ХХХХХХХХХХ.mdb.yandexcloud.net
— это FQDN хоста с рольюMASTER
.
Получите список хостов и скопируйте
NAME
хоста с рольюMASTER
:yc managed-mysql host list --cluster-name <имя_кластера_MySQL>
+------------------------+----------------------+---------+--------+-------------------+-----------+ | NAME | CLUSTER ID | ROLE | HEALTH | ZONE ID | PUBLIC IP | +------------------------+----------------------+---------+--------+-------------------+-----------+ | rc1a-...mdb.yandexcloud.net | c9quhb1l32unm1sdn0in | MASTER | ALIVE | ru-central1-a | false | | rc1b-...mdb.yandexcloud.net | c9quhb1l32unm1sdn0in | REPLICA | ALIVE | ru-central1-b | false | +------------------------+----------------------+---------+--------+-------------------+-----------+
-
-
Перезапустите Nginx и PHP-FPM:
Debian/UbuntuCentOSsudo systemctl restart nginx.service sudo systemctl restart php7.4-fpm.service
sudo systemctl restart nginx.service sudo systemctl restart php-fpm.service
Завершите настройку WordPress
- В блоке Сеть на странице ВМ в консоли управления
найдите публичный IP-адрес ВМ. - Перейдите по адресу ВМ в браузере.
- Выберите язык и нажмите кнопку Продолжить.
- Заполните информацию для доступа к сайту:
- Укажите любое название сайта, например,
wp-your-project
. - Укажите имя пользователя, которое будет использоваться для входа в административную панель, например,
admin
. - Укажите пароль, который будет использоваться для входа в административную панель.
- Укажите вашу электронную почту.
- Укажите любое название сайта, например,
- Нажмите кнопку Установить WordPress.
- Если установка прошла успешно, нажмите кнопку Войти.
- Войдите на сайт, используя указанные на прошлых шагах имя пользователя и пароль. После этого откроется административная панель, в которой можно приступать к работе с вашим сайтом.
Настройте DNS
Если у вас есть зарегистрированное доменное имя, воспользуйтесь сервисом Cloud DNS для управления доменом.
Также настроить DNS можно с помощью Terraform, подробнее см. в разделе Как создать инфраструктуру с помощью Terraform.
В инструкции ниже описана настройка DNS для доменного имени example.com
.
Добавьте зону
Чтобы добавить публичную зону:
- Откройте раздел Cloud DNS в каталоге, где требуется создать зону DNS.
- Нажмите кнопку Создать зону.
- Задайте настройки зоны:
- Имя зоны:
example-zone-1
. - Зона:
example.com.
. Укажите ваш зарегистрированный домен. - Тип — Публичная.
- Имя зоны:
- Нажмите кнопку Создать.
Добавьте ресурсные записи
Создайте в публичной зоне записи DNS:
- В блоке Сеть на странице виртуальной машины в консоли управления
найдите публичный IP-адрес ВМ. - Создайте запись типа А:
- Откройте раздел Cloud DNS в каталоге, где находится зона
example.com
. - Выберите зону
example.com
из списка. - Нажмите кнопку Создать запись.
- Задайте параметры записи:
- Имя: оставьте пустым.
- Тип записи: оставьте значение
А
. - TTL (время кэширования записи): оставьте значение по умолчанию.
- Значение: введите публичный адрес вашей ВМ.
- Нажмите кнопку Создать.
- Откройте раздел Cloud DNS в каталоге, где находится зона
- Создайте запись типа CNAME:
- Выберите зону
example.com
из списка. - Нажмите кнопку Создать запись.
- Задайте параметры записи:
- Имя:
www
. - Тип записи: выберите значение
CNAME
. - TTL (время кэширования записи): оставьте значение по умолчанию.
- Значение: введите
example.com
.
- Имя:
- Нажмите кнопку Создать.
- Выберите зону
Делегируйте доменное имя
Делегирование — это перенос ответственности с серверов регистратора на ваши серверы. Для домена создаются ресурсные записи типа NS (ns1.yandexcloud.net
и ns2.yandexcloud.net
).
Чтобы делегировать домен, укажите для него DNS-серверы в личном кабинете регистратора.
Делегирование происходит не сразу. Серверы интернет-провайдеров обычно обновляют записи до 24 часов (86400 секунд). Это обусловлено значением TTL, в течение которого кэшируются записи для доменов.
Проверить делегирование домена можно с помощью сервиса Whoisdig
:
dig +short NS example.com
Результат:
ns2.yandexcloud.net.
ns1.yandexcloud.net.
Проверьте работу сайта
Чтобы проверить работу сайта, введите в браузере его IP-адрес или доменное имя:
http://<публичный_IP-адрес_ВМ>
.http://www.example.com
.
Для входа в панель управления WordPress используйте адрес http://www.example.com/wp-admin/
.
Как удалить созданные ресурсы
Чтобы перестать платить за развернутый сайт:
Если вы зарезервировали для ВМ статический публичный IP-адрес, удалите его.
Как создать инфраструктуру с помощью Terraform
Terraform
Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform
При изменении файлов конфигураций Terraform автоматически определяет, какая часть вашей конфигурации уже развернута, что следует добавить или удалить.
Чтобы разместить веб-сайт на WordPress с кластером MySQL с помощью Terraform:
-
Установите Terraform, получите данные для аутентификации и укажите источник для установки провайдера Yandex Cloud (раздел Настройте провайдер, шаг 1).
-
Подготовьте файлы с описанием инфраструктуры:
В руководстве используются группы безопасности. Если они вам недоступны, то запросите доступ в поддержке или уберите из файла конфигурации блок
yandex_vpc_security_group
и другие упоминанияsecurity_group
.Готовый архивВручную- Создайте папку для файлов.
- Скачайте архив
(1 КБ). - Разархивируйте архив в папку. В результате в ней должен появиться конфигурационный файл
wordpress-mysql.tf
.
-
Создайте папку для файлов.
-
Создайте в папке конфигурационный файл
wordpress-mysql.tf
:wordpress-mysql.tfterraform { required_providers { yandex = { source = "yandex-cloud/yandex" version = ">= 0.47.0" } } } provider "yandex" { zone = "ru-central1-a" } resource "yandex_compute_disk" "boot-disk" { name = "bootvmdisk" type = "network-hdd" zone = "ru-central1-a" size = "20" image_id = "<идентификатор_образа>" } resource "yandex_compute_instance" "vm-wordpress-mysql" { name = "wp-mysql-tutorial-web" platform_id = "standard-v3" zone = "ru-central1-a" resources { core_fraction = 20 cores = 2 memory = 2 } boot_disk { disk_id = yandex_compute_disk.boot-disk.id } network_interface { subnet_id = yandex_vpc_subnet.subnet-1.id security_group_ids = ["${yandex_vpc_security_group.sg-1.id}"] nat = true } metadata = { ssh-keys = "<имя_пользователя>:<содержимое_SSH-ключа>" } } resource "yandex_mdb_mysql_cluster" "wp-cluster" { name = "wp-mysql-tutorial-db-cluster" environment = "PRESTABLE" network_id = yandex_vpc_network.network-1.id version = "8.0" security_group_ids = ["${yandex_vpc_security_group.sg-1.id}"] resources { resource_preset_id = "s2.small" disk_type_id = "network-ssd" disk_size = "10" } host { zone = "ru-central1-a" subnet_id = yandex_vpc_subnet.subnet-1.id assign_public_ip = false } host { zone = "ru-central1-b" subnet_id = yandex_vpc_subnet.subnet-2.id assign_public_ip = false } host { zone = "ru-central1-d" subnet_id = yandex_vpc_subnet.subnet-3.id assign_public_ip = false } } resource "yandex_mdb_mysql_database" "wp-db" { cluster_id = yandex_mdb_mysql_cluster.wp-cluster.id name = "wp-mysql-tutorial-db" } resource "yandex_mdb_mysql_user" "wp-user" { cluster_id = yandex_mdb_mysql_cluster.wp-cluster.id name = "wordpress" password = "password" authentication_plugin = "MYSQL_NATIVE_PASSWORD" permission { database_name = yandex_mdb_mysql_database.wp-db.name roles = ["ALL"] } } resource "yandex_vpc_security_group" "sg-1" { name = "wordpress" description = "Description for security group" network_id = yandex_vpc_network.network-1.id ingress { protocol = "TCP" description = "ext-http" v4_cidr_blocks = ["0.0.0.0/0"] port = 80 } ingress { protocol = "TCP" description = "ext-ssh" v4_cidr_blocks = ["0.0.0.0/0"] port = 22 } ingress { protocol = "TCP" description = "ext-msql" v4_cidr_blocks = ["0.0.0.0/0"] port = 3306 } ingress { protocol = "TCP" description = "ext-https" v4_cidr_blocks = ["0.0.0.0/0"] port = 443 } egress { protocol = "ANY" description = "any" v4_cidr_blocks = ["0.0.0.0/0"] } } resource "yandex_vpc_network" "network-1" { name = "network1" } resource "yandex_vpc_subnet" "subnet-1" { name = "subnet1" zone = "ru-central1-a" network_id = yandex_vpc_network.network-1.id v4_cidr_blocks = ["192.168.1.0/24"] } resource "yandex_vpc_subnet" "subnet-2" { name = "subnet2" zone = "ru-central1-b" network_id = yandex_vpc_network.network-1.id v4_cidr_blocks = ["192.168.2.0/24"] } resource "yandex_vpc_subnet" "subnet-3" { name = "subnet3" zone = "ru-central1-d" network_id = yandex_vpc_network.network-1.id v4_cidr_blocks = ["192.168.3.0/24"] } resource "yandex_dns_zone" "zone-1" { name = "example-zone-1" description = "Public zone" zone = "example.com." public = true } resource "yandex_dns_recordset" "rs-1" { zone_id = yandex_dns_zone.zone-1.id name = "example.com." ttl = 600 type = "A" data = ["${yandex_compute_instance.vm-wordpress-mysql.network_interface.0.nat_ip_address}"] } resource "yandex_dns_recordset" "rs-2" { zone_id = yandex_dns_zone.zone-1.id name = "www" ttl = 600 type = "CNAME" data = ["example.com"] }
Более подробную информацию о параметрах используемых ресурсов в Terraform см. в документации провайдера:
-
В блоке
metadata
укажите метаданные для создания ВМ<имя_пользователя>:<содержимое_SSH-ключа>
. Указанное имя пользователя не играет роли, ключ будет присвоен пользователю, который задан в конфигурации образа. В разных образах это разные пользователи. Подробнее см. в разделе Ключи, обрабатываемые в публичных образах. -
В блоке
boot_disk
укажите идентификатор одного из образов ВМ с нужным набором компонентов: -
Создайте ресурсы:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validate
Если конфигурация является корректной, появится сообщение:
Success! The configuration is valid.
-
Выполните команду:
terraform plan
В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply
-
Подтвердите изменения: введите в терминале слово
yes
и нажмите Enter.
-