Так выглядит функционал отображения и управления "Мои сайты" в CMS Wordpress

Задача: Хочу разобрать как настраивается MultiSite on WordPress

Меня давно интересовал функционал от WordPress о том, как можно управлять множеством сайтов из единой консоли, т.е. не как сейчас у меня для каждого блога своя Консоль, а все соединено в одном месте. Есть как минусы, так и плюсы такого решения. Но для расширения кругозора нужно рассмотреть, как на Ubuntu 22.04 + WordPress (последний релиз) разворачивается MultiSite. Можно ли его использовать в боевой эксплуатации. Сейчас я составлю пошаговую заметку по данной задаче.

Тестовые характеристики системы на которой разбираю интересующую меня тему

  • RAM: 4Gb
  • CPU: 1 sockets, 2 cores
  • HDD: 50Gb
  • OS: Ubuntu 22.04 Server

Виртуальная машина создана на тестовом сервере под управлением Debian 10 + Proxmox 6.4-13

Шаг №1: Провожу базовую настройку системы для последующего использования:

ekzorchik@srv-us2204a:~$ sudo nano /etc/sudoers.d/ekzorchik
ekzorchik ALL=(ALL) NOPASSWD:ALL
ekzorchik@srv-us2204a:~$ sudo rm -Rf /var/lib/apt/lists
ekzorchik@srv-us2204a:~$ sudo nano /etc/update-manager/release-upgrades
 [DEFAULT]
Prompt=never
ekzorchik@srv-us2204a:~$ sudo apt-get update && sudo apt-get upgrade -y && sudo apt-get dist-upgrade -y
ekzorchik@srv-us2204a:~$ sudo apt-get install -y mc qemu-guest-agent htop net-tools
ekzorchik@srv-us2204a:~$ sudo reboot
ekzorchik@srv-us2204a:~$ uname -a && lsb_release -a
Linux srv-us2204a 5.15.0-79-generic #86-Ubuntu SMP Mon Jul 10 16:07:21 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.3 LTS
Release:        22.04
Codename:       jammy
ekzorchik@srv-us2204a:~$

Шаг №2: Настраиваю локаль:

ekzorchik@srv-us2204a:~$ sudo rm -f /etc/localtime
ekzorchik@srv-us2204a:~$ sudo ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime
ekzorchik@srv-us2204a:~$ sudo locale-gen en_US.UTF-8
Generating locales (this might take a while)...
  en_US.UTF-8... done
Generation complete.
ekzorchik@srv-us2204a:~$ echo "LC_ALL="en_US.UTF-8"" | sudo -s tee /etc/default/locale
LC_ALL=en_US.UTF-8
ekzorchik@srv-us2204a:~$ echo "LANG="en_US.UTF-8"" | sudo tee -a /etc/default/locale
LANG=en_US.UTF-8
ekzorchik@srv-us2204a:~$ echo "LANGUAGE="en.US.UTF-8"" | sudo tee -a /etc/default/locale
LANGUAGE=en.US.UTF-8
ekzorchik@srv-us2204a:~$

Шаг №3: Устанавливаю сервис базы данных, удаляю тестовые базы, создаю базу под WordPress, создаю пользователя под базу WordPress и создаю пароль под пользователя WordPress:

ekzorchik@srv-us2204a:~$ sudo apt-get install -y mariadb-server mariadb-client
ekzorchik@srv-us2204a:~$ mysql --version
mysql  Ver 15.1 Distrib 10.6.12-MariaDB, for debian-linux-gnu (x86_64) using  EditLine wrapper
ekzorchik@srv-us2204a:~$
ekzorchik@srv-us2204a:~$ mysqld --version
mysqld  Ver 10.6.12-MariaDB-0ubuntu0.22.04.1 for debian-linux-gnu on x86_64 (Ubuntu 22.04)
ekzorchik@srv-us2204a:~$
ekzorchik@srv-us2204a:~$ sudo mysql -u root -e "alter user 'root'@'localhost' identified by '712mbddr@';"
ekzorchik@srv-us2204a:~$ sudo mysql -u root
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
ekzorchik@srv-us2204a:~$ sudo mysql -u root -p712mbddr@ -e "show databases";
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
ekzorchik@srv-us2204a:~$
ekzorchik@srv-us2204a:~$ sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
[mysqld]
default-authentication-plugin=mysql_native_password
ekzorchik@srv-us2204a:~$ sudo systemctl restart mariadb.service && sudo systemctl status mariadb.service | head -n5
● mariadb.service - MariaDB 10.6.12 database server
     Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2023-08-23 09:47:30 MSK; 13ms ago
       Docs: man:mariadbd(8)
             https://mariadb.com/kb/en/library/systemd/
ekzorchik@srv-us2204a:~$ sudo systemctl is-active ma
machine.slice    man-db.service   man-db.timer     mariadb.service  mariadb.socket
ekzorchik@srv-us2204a:~$ sudo systemctl is-active mariadb.service
active
ekzorchik@srv-us2204a:~$

Изменяю режим работы mysql:

ekzorchik@srv-us2204a:~$ sudo mysql -u root -p712mbddr@ -e "alter user 'root'@'localhost' identified via mysql_native_password;"
ekzorchik@srv-us2204a:~$ sudo mysql -u root -e "set password=password('712mbddr@');"
ekzorchik@srv-us2204a:~$ sudo mysql -u root -p712mbddr@ -e "delete from mysql.user where user=''"
ekzorchik@srv-us2204a:~$ sudo mysql -u root -p712mbddr@ -e "delete from mysql.user where user='root' and host not in ('localhost','127.0.0.1','::1')"
ekzorchik@srv-us2204a:~$ sudo mysql -u root -p712mbddr@ -e "drop database if exists test"
ekzorchik@srv-us2204a:~$ sudo mysql -u root -p712mbddr@ -e "delete from mysql.db where db='test' or db='test\\_%'"
ekzorchik@srv-us2204a:~$ sudo mysql -u root -p712mbddr@ -e "drop database if exists db_wp"
ekzorchik@srv-us2204a:~$ sudo mysql -u root -p712mbddr@ -e "create database db_wp character set utf8 collate utf8_general_ci";
ekzorchik@srv-us2204a:~$ sudo mysql -u root -p712mbddr@ -e "drop user if exists 'us_wp'@'localhost'"
ekzorchik@srv-us2204a:~$ sudo mysql -u root -p712mbddr@ -e "create user 'us_wp'@'localhost' identified by '612mbddr@'"
ekzorchik@srv-us2204a:~$ sudo mysql -u root -p712mbddr@ -e "grant all on db_wp.* to 'us_wp'@'localhost'";
ekzorchik@srv-us2204a:~$

Шаг №4: Устанавливаю в систему Ubuntu 22.04 Webсервис, в моем случае я предпочитаю nginx:

ekzorchik@srv-us2204a:~$ sudo apt-get install -y nginx
ekzorchik@srv-us2204a:~$ sudo systemctl enable nginx
Synchronizing state of nginx.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable nginx
ekzorchik@srv-us2204a:~$
ekzorchik@srv-us2204a:~$ sudo rm /etc/nginx/sites-enabled/default
ekzorchik@srv-us2204a:~$ sudo rm /etc/nginx/sites-available/default
ekzorchik@srv-us2204a:~$ sudo rm -f /var/www/html/index.html /var/www/html/index.nginx-debian.html

Шаг №5: Устанавливаю интерпретатор PHP:

ekzorchik@srv-us2204a:~$ sudo apt install -y php php-{fpm,pear,cgi,common,mbstring,net-socket,gd,xml-util,mysql,bcmath}
ekzorchik@srv-us2204a:~$ sudo nano /etc/php/8.1/fpm/php.ini
upload_max_filesize = 32M
post_max_size = 32M
memory_limit = 128M
max_execution_time = 300
max_input_time = 60
;max_input_vars = 1000
ekzorchik@srv-us2204a:~$ sudo nano /etc/php/8.1/fpm/pool.d/www.conf
user = www-data
group = www-data
listen.owner = www-data
listen.group = www-data

проверяю внесенные изменения в fpm:

ekzorchik@srv-us2204a:~$ sudo php-fpm8.1 --test
[24-Aug-2023 12:17:57] NOTICE: configuration file /etc/php/8.1/fpm/php-fpm.conf test is successful
ekzorchik@srv-us2204a:~$ sudo systemctl restart nginx.service php8.1-fpm.service

вместе с пакетами выше была произведена установка apache2, поэтому выключаю сервис apache2:

ekzorchik@srv-us2204a:~$ sudo systemctl disable apache2.service
Synchronizing state of apache2.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable apache2
Removed /etc/systemd/system/multi-user.target.wants/apache2.service.
ekzorchik@srv-us2204a:~$
ekzorchik@srv-us2204a:~$ sudo netstat -tulpn | grep apache2
ekzorchik@srv-us2204a:~$ php --version
PHP 8.1.2-1ubuntu2.13 (cli) (built: Jun 28 2023 14:01:49) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.2, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.2-1ubuntu2.13, Copyright (c), by Zend Technologies
ekzorchik@srv-us2204a:~$

Шаг №6: Скачиваю с официального сайта wordpress самую последнюю версию CMS WordPress:

ekzorchik@srv-us2204a:~$ wget wordpress.org/latest.tar.gz
ekzorchik@srv-us2204a:~$ tar zxf latest.tar.gz
ekzorchik@srv-us2204a:~$ rm -f latest.tar.gz
ekzorchik@srv-us2204a:~$ sudo mv wordpress/ /var/www/html/wordpress
ekzorchik@srv-us2204a:~$ sudo chown -R www-data:www-data /var/www/html/wordpress/
ekzorchik@srv-us2204a:~$ sudo chmod -R 755 /var/www/html/wordpress/
ekzorchik@srv-us2204a:~$

Шаг №7: Привожу wp-config.php к виду для работы с MultiSite:

ekzorchik@srv-us2204a:~$ sudo cp /var/www/html/wordpress/wp-config-sample.php /var/www/html/wordpress/wp-config.php

На заметку: Отобразить содержимое wp-config.php без комментариев и пустых строк:

cat /var/www/html/wordpress/wp-config.php | grep -v "/***/\|*" | grep -v "^[[:space:]]*$"
ekzorchik@srv-us2204a:~$ sudo nano /var/www/html/wordpress/wp-config.php
<?php
define( 'DB_NAME', 'db_wp' );
define( 'DB_USER', 'us_wp' );
define( 'DB_PASSWORD', '612mbddr@' );
define( 'DB_HOST', 'localhost' );
define( 'DB_CHARSET', 'utf8' );
define( 'DB_COLLATE', '' );
define( 'AUTH_KEY',         'put your unique phrase here1' );
define( 'SECURE_AUTH_KEY',  'put your unique phrase here1a' );
define( 'LOGGED_IN_KEY',    'put your unique phrase here2b' );
define( 'NONCE_KEY',        'put your unique phrase here3c' );
define( 'AUTH_SALT',        'put your unique phrase here4d' );
define( 'SECURE_AUTH_SALT', 'put your unique phrase here5e' );
define( 'LOGGED_IN_SALT',   'put your unique phrase here6f' );
define( 'NONCE_SALT',       'put your unique phrase here7g' );
$table_prefix = 'wp_cms_db';
define( 'WP_DEBUG', false );
if ( ! defined( 'ABSPATH' ) ) {
}
require_once ABSPATH . 'wp-settings.php';

Шаг №8: Создаю конфигурацию описывающую поведение nginx для работы с CMS сервисом WordPress:

ekzorchik@srv-us2204a:~$ sudo nano /etc/nginx/sites-available/wordpress.conf
server {
        listen 80;
        server_name 172.33.33.112;

        root /var/www/html/wordpress;
        index index.php;

        access_log /var/log/access-wp.log;
        error_log /var/log/error-wp.log;


        location / {
                try_files $uri $uri/ /index.php?$args;
        }

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/run/php/php8.1-fpm.sock;
                gzip on; #
                gzip_disable "msie6";
                gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;

        location ~ /\. {
                deny all;
                }

        location ~ /.well-known {
                allow all;
                }

        location ~* /(?:uploads|files)/.*\.php$ {
                deny all;
                }

        location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
                access_log off;
                log_not_found off;
                expires max;
                }
}
}
ekzorchik@srv-us2204a:~$ sudo ln -s /etc/nginx/sites-available/wordpress.conf /etc/nginx/sites-enabled/wordpress.conf
ekzorchik@srv-us2204a:~$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
ekzorchik@srv-us2204a:~$ sudo systemctl restart nginx php8.1-fpm.service
ekzorchik@srv-us2204a:~$ sudo netstat -tulpn | grep :80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      3416/nginx: master
ekzorchik@srv-us2204a:~$

Шаг №9: Затем обращаюсь через браузер с основной системы к системе где развернут WordPress и произвожу окончательную настройку:

http://172.33.33.112/wp-admin/install.php

  • Язык: выбираю Русский

И нажимаю "Продолжить"

Указываю именование сайта, административный логин и пароль

  • Название сайта: tips_db_home
  •  Имя пользователя: ekzorchik
  • Пароль: 712mbddr@
  • Ваш e-mail: support@ekzorchik.ru

Указываю информацию по создаваемому сайту

и нажимаю «Установить WordPress»

После чего, вижу

Поздравляем!

WordPress установлен. Желаем успешно работы!

  • Имя пользователя: ekzorchik
  • Пароль: Выбранный вами пароль

Нажимаю «Войти» и URL-ссылка в браузере трансформируется в http://172.33.33.112/wp-login.php

Авторизуюсь в развернутой CMS WordPress

И после успешной авторизации

Вход в CMS WordPress успешно произведен под Административной учетной записью

Шаг №10: Настраиваем WordPress на работу в режиме Multisite:

ekzorchik@srv-us2204a:~$ sudo nano /var/www/html/wordpress/wp-config.php
/* добавляем перед следующим комментария всего лишь одну строку */
define( 'WP_ALLOW_MULTISITE', true);
/* That's all, stop editing! Happy publishing. */
ekzorchik@srv-us2204a:~$ sudo systemctl restart nginx php8.1-fpm.service

Перелогиниваемся в развернутый WordPress под административной записью, в моем случае это учетная запись ekzorchik.

Открываем "Консоль" - Инструменты (Tools) - Установка сети (Network Setup)

  • Установка в подкаталог: Поскольку ваш сайт установлен в каталог, сайты вашей сети должны использовать подкаталоги.
  • Адрес сервера: Интернет-адресом вашей сети будет 172.33.33.112.
  • Название сети: Сайты tips_db_home
  • E-mail администратора сети: support@ekzorchik.ru

Указываю "Параметры сети" / "Network Setup" для MultiSite

и нажимаю "Установить", после сформируют правила конфигурации сети для wp-config.php которые нужно указать перед строкой /* Это всё, дальше не редактируем. Успехов! */: (выглядеть это будет так)

/* Add any custom values between this line and the "stop editing" line. */

define( 'WP_ALLOW_MULTISITE', true);
define( 'MULTISITE', true );
define( 'SUBDOMAIN_INSTALL', false );
define( 'DOMAIN_CURRENT_SITE', '172.33.33.112' );
define( 'PATH_CURRENT_SITE', '/' );
define( 'SITE_ID_CURRENT_SITE', 1 );
define( 'BLOG_ID_CURRENT_SITE', 1 );

/* That's all, stop editing! Happy publishing. */

После не забываем сохранить внесенные изменения.

ekzorchik@srv-us2204a:~$ sudo systemctl restart nginx php8.1-fpm.service

опять перелогиниваемся в WordPress (http://172.33.33.112/wp-login.php)

  • Имя пользователя или email: ekzorchik
  • Пароль: 712mbbdr@
  • Язык: Русский

и нажимаю "Войти".

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

Вход в Консоль WordPress где отображается меню "Мои Сайты"

Отобразить какие сайты в данный момент присутствуют или добавить

Мои сайты - Управление сетью - Сайты

Так выглядит функционал отображения и управления "Мои сайты" в CMS WordPress

Итого, я для себя рассмотрел, как включается настройка мультисайт для CMS системы WordPress когда можно из единой консоли управлять несколькими сайтами на одном хостинге. Вот только следует учитывать нагрузку, создаваемую уже ими, не получится оптимизировать по отдельности, т.к. конфигурационные файлы одни и база одна.

Для себя мне проще развернуть каталоги под блоги: /var/www/html/{win,lin,net,home,ekzorchik} и уже в них развернуть файлы wordpress.org/latest.tar.gz дабы после под каждый сайт создать конфигурационный файл для Web-сервиса nginx с учетом нагрузки.

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