Создание сайта на WordPress с кластером базы данных MySQL® с помощью Terraform
Чтобы создать инфраструктуру для сайта на WordPress с кластером базы данных MySQL® c помощью Terraform:
Чтобы настроить веб-сайт на WordPress с кластером MySQL®:
- Подготовьте облако к работе.
- Создайте инфраструктуру.
- Настройте веб-сервер Nginx.
- Установите WordPress и дополнительные компоненты.
- Завершите настройку WordPress.
- Проверьте работу веб-сайта.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в 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-запросы и зоны DNS (см. тарифы Yandex Cloud DNS).
Создайте инфраструктуру
Terraform
Terraform распространяется под лицензией Business Source License
Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform
Для создания инфраструктуры c помощью Terraform:
-
Установите Terraform, получите данные для аутентификации и укажите источник для установки провайдера Yandex Cloud (раздел Настройте провайдер, шаг 1).
-
Подготовьте файлы с описанием инфраструктуры:
Готовый архивВручную- Создайте папку для файлов.
- Скачайте архив
(1 КБ). - Разархивируйте архив в папку. В результате в ней должен появиться конфигурационный файл
wordpress-mysql.tf
.
-
Создайте папку для файлов.
-
Создайте в папке конфигурационный файл
wordpress-mysql.tf
:wordpress-mysql.tf
terraform { 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 см. в документации провайдера:
- Сеть — yandex_vpc_network
. - Подсети — yandex_vpc_subnet
. - Группы безопасности — yandex_vpc_security_group
. - Виртуальная машина — yandex_compute_instance
. - Кластер MySQL® — yandex_mdb_mysql_cluster
. - БД PostgreSQL — yandex_mdb_mysql_database
. - Пользователь БД — yandex_mdb_mysql_user
. - Зона DNS — yandex_dns_zone
. - Ресурсная запись DNS — yandex_dns_recordset
.
-
В блоке
metadata
укажите метаданные для создания ВМ<имя_пользователя>:<содержимое_SSH-ключа>
. Указанное имя пользователя не играет роли, ключ будет присвоен пользователю, который задан в конфигурации образа. В разных образах это разные пользователи. Подробнее см. в разделе Ключи, обрабатываемые в публичных образах. -
В блоке
boot_disk
укажите идентификатор одного из образов ВМ с нужным набором компонентов: -
Создайте ресурсы:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validate
Если конфигурация является корректной, появится сообщение:
Success! The configuration is valid.
-
Выполните команду:
terraform plan
В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply
-
Подтвердите изменения: введите в терминале слово
yes
и нажмите Enter.
-
После создания инфраструктуры, настройте веб-сервер Nginx.
Настройте веб-сервер 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 --silent 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 | +------------------------+----------------------+---------+--------+-------------------+-----------+
- Перейдите на страницу кластера MySQL® в консоли управления
-
-
Перезапустите 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.
- Если установка прошла успешно, нажмите кнопку Войти.
- Войдите на сайт, используя указанные на прошлых шагах имя пользователя и пароль. После этого откроется административная панель, в которой можно приступать к работе с вашим сайтом.
Проверьте работу сайта
Чтобы проверить работу сайта, введите в браузере его IP-адрес или доменное имя:
http://<публичный_IP-адрес_ВМ>
.http://www.example.com
.
Для входа в панель управления WordPress используйте адрес http://www.example.com/wp-admin/
.
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы:
-
Откройте конфигурационный файл
single-node-file-server.tf
и удалите описание создаваемой инфраструктуры из файла. -
Примените изменения:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validate
Если конфигурация является корректной, появится сообщение:
Success! The configuration is valid.
-
Выполните команду:
terraform plan
В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply
-
Подтвердите изменения: введите в терминале слово
yes
и нажмите Enter.
-