MySQL

Создаем db для wordpress:

mysql -u root -p
create database wordpress default character set utf8 collate utf8_unicode_ci;

Создаем отдельного юзера для wordpress:

create user 'wordpressuser'@'localhost' identified with mysql_native_password by '<password>';
 
-- Вместо локалхоста, если подключаться будут по сети, нужно ввести IP, с которого будем подключаться
-- mysql_native_password используется для совместимости с PHP
-- Удалять юзера можно так:
drop user 'username'@'hostname';

Даем юзеру права на все таблицы в db (по сути, на весь db):

grant all on wordpress.* to 'wordpressuser'@'localhost';
flush privileges;
\q
-- flush обновляет привилегии, чтобы mysql узнал об измененных привилегиях

PHP

В этом стеке PHP выступает в роли интерпретатора, языка, который будет обрабатывать запросы.

Нужно установить модули/плагины для работы с nginx и mysql: php-fpm, php-mysql соответственно (сам php установится вместе с ними):

sudo apt install -y php-fpm php-mysql
 
# И проверь, что сервис php-fmp запустился
systemctl status php7.4-fpm.service
 
# И перезапускай, чтобы быть точно уверенным, что все установленные модули подхватились сервисом
systemctl restart php7.4-fpm.service

php-fpm после установки создаст сокет php*-fmp.sock в папке /var/run/php/
php-fpm использует этот сокет для обмена данными с nginx.

nginx

Нужно сконфигурировать nginx после установки.

/etc/nginx/sites-available/default
# root /var/www/html;
root /var/www/wordpress;  # корневая директория
 
# Добавляем index.php в список индекс-файлов
index index.html index.htm index.nginx-debian.html index.php;
 
location = /favicon.ico {log_not_found off; access_log off;}
location = /robots.txt {log_not_found off; access_log off; allow all;}
location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
	expires max;
	log_not_found off;
}
 
location / {
	try_files $uri $uri/ /index.php$is_args$args;
}
 
location ~ \.php$ {
	include snippets/fastcgi-php.conf;
	fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}

Про использование директив location

Указание пути к маленькой иконке сайта (favicon.ico), который отображается во вкладке браузера, в поисковике и т.д. :

/etc/nginx/sites-available/default
location = /favicon.ico {log_not_found off; access_log off;}

Указание пути к файлу robots.txt, в котором описывается поведение (что он должен индексировать, а что - не должен) робота интернет-поисковика (google, yandex и т.п.), когда он приходит на сайт:

/etc/nginx/sites-available/default
location = /robots.txt {log_not_found off; access_log off; allow all;}

Для директивы location с регулярным выражением ~* \.(css|gif|ico|jpeg|jpg|js|png)$ будут применены настройки в блоке {}:

/etc/nginx/sites-available/default
location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
	expires max;
	log_not_found off;
}

Explain параметров в {}

  • log_not_found off; указывает, что nginx не должен писать в логи ошибки о ненаходе(😱) данного файла. Позволяет не захламлять логи.
  • access_log off; указывает, что nginx не должен писать в логи инфу об обращении (access) к данному файлу. Позволяет не захламлять логи.
  • allow all; разрешает любому юзер получать доступ к данному файлу
  • expires max; указывает, что клиенты должны кэшировать эти файлы на максимальное значение срока действия, чтобы уменьшить кол-во таких требовательных запросов к серверу.

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

/etc/nginx/sites-available/default
location / {
	try files $uri $uri/ /index.php$is_args$args
}

try files $uri $uri/ /index.php$is_args$args указывает, как nginx будет искать нужные файлы для обработки запросов:

  1. Ищется файл, соответствующий переменной $uri (запрошенный URL)
  2. Ищется каталог, соответствующий $uri/ (запрошенный URL) и индексного файла в этом же каталоге
  3. При ненаходе(🤨) перенаправляет запрос файлу index.php (для дальнейшей обработки этого запроса) с передачей параметров $is_args и $args, а не выводит “404 Not Found” как в дефолтном конфиге

Настройки для URL-адресов, содержащих файлы с расширением .php (в этом случае, запросы, которые заканчиваются на .php):

/etc/nginx/sites-available/default
location ~ \.php$ {
	include snippets/fastcgi-php.conf;
	fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}

include snippets/fastcgi-php.conf; указывает, что нужно включить конфиг fastcgi-php.conf - настройки для обработки PHP-скриптов.

fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; указывает, что nginx должен передавать обработку PHP-скриптов FastCGI-серверу, которая работает локально по такому пути: /var/run/php/php7.4-fpm.sock .

Проверка конфига и nginx restart

После применения настроек нужно проверить конфиги на валидность и перезагрузить конфиги nginx:

sudo nginx -t
sudo systemctl reload nginx

WordPress

Установка

Скачать последнюю версию wp можно с офиц сайта:

wget https://wordpress.org/latest.tar.gz
tar xzvf latest.tar.gz && rm latest.tar.gz
 
# И следует создать папку, которую мы в конфиге nginx настроили как корневую
sudo mkdir /var/www/wordpress
# 

И туда же копируй содержимое извлеченной папки из архива со всеми скрытыми файлами и с разрешениями всех файлов:

sudo cp -a wordpress/. /var/www/wordpress/
# -a копирует с разрешениями, а точка после директории указывает

Указываем владельца папки /var/www/wordpress юзера и группу www-data это юзер и группа nginx-а, поэтому ему нужен доступ к этой папке:

sudo chown -R www-data:www-data /var/www/wordpress
# -R означает рекурсивно

Конфигурация wordpress

Копируем sample конфига в дефолтный конфиг wp-config.php (чтобы иметь основу для последующих изменений). Копируем сразу от юзера www-data, чтобы потом еще и не chown-ить из root-а в www-data:

sudo -u www-data cp /var/www/wordpress/wp-config-sample.php /var/www/wordpress/wp-config.php

Нужно поменять секретные ключи в конфиге wp-config.php; они будут использоваться только внутри WP и лишние действия производить не нужно будет с удобством использования проблем не будет. Чтобы сгенерировать эти ключи можно использовать API с офиц сайта WP:

curl -s https://api.wordpress.org/secret-key/1.1/salt/

Output будет примерно такой:

define('AUTH_KEY',         '<XF0|pKDoZ9Gq&uY+ z0zRxD>&]/C[Y1B-D7C*uf`+:ym,&{[*@Y)^]0-[ios*#9');
define('SECURE_AUTH_KEY',  'XbZ8`Kin8:|>zdrXST<:<-dDJKmv5iE2SBmK-nY -f[+j+JRiCy}xc(r$tNz7`->');
define('LOGGED_IN_KEY',    ';#pgpqOMV5P!uc&h@^.SLANJgQCQVtJJ&+wumrAd1_E/c!Y]*qeb8.yV$c3FI)n&');
define('NONCE_KEY',        '%vN*4Fj-4+yoD-1K;KeaYe/q$ST2|,z)DE]~v :RBzD9.E0_PMR.!oUkHFrAp;5|');
define('AUTH_SALT',        ',GmU^+@-f0JUEx<sgVv]_dG<)~ !;J80%CUva0APn^}AN*u2m)X%KIYDsu3bU-(O');
define('SECURE_AUTH_SALT', 'iRn1t(jfw6CmC%gywn(VD$9iKI%evYk*k/;Kfs&t_m9/GJS /p29Yf)- !f^F}n$');
define('LOGGED_IN_SALT',   'yfu^h!U~3(]f}Sw,+sc/}#EZ} xqB(mxN.-A7@[GGsr1?tNX7qGk<`ohWL-YiORO');
define('NONCE_SALT',       'KQfS,A#5RNr)Y=CG)P-{9<+Jz7T+R#;~PYc{=)7jv+@J[D&OC=#G#mr=_z$Tq<cG');

Его нужно вставить в конфиг wordpress вместо этого шаблона:

wp-config.php
define('AUTH_KEY',         'put your unique phrase here');
define('SECURE_AUTH_KEY',  'put your unique phrase here');
define('LOGGED_IN_KEY',    'put your unique phrase here');
define('NONCE_KEY',        'put your unique phrase here');
define('AUTH_SALT',        'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT',   'put your unique phrase here');
define('NONCE_SALT',       'put your unique phrase here');

Нужно изменить параметры БД в этом месте:

wp-config.php
// ** Database settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'database_name_here' );
 
/** Database username */
define( 'DB_USER', 'username_here' );
 
/** Database password */
define( 'DB_PASSWORD', 'password_here' );
 
/** Database hostname */
define( 'DB_HOST', 'localhost' );
 
/** Database charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8' );
 
/** The database collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );

А именно:

wp-config.php
/** The name of the database for WordPress */
define( 'DB_NAME', 'wordpress' );
 
/** Database username */
define( 'DB_USER', 'wordpressuser' );
 
/** Database password */
define( 'DB_PASSWORD', '<password>' );

И нужно ниже добавить настройку метода, которым WP будет пользоваться для записи данных в БД (по сути, даем веб-серверу разрешение на запись):

wp-config.php
/**Даем веб-серверу разрешение на запись в БД*/
define( 'FS_METHOD', 'direct' );

Завершение настройки через WebUI

Нужно зайти на страницу (я захожу со своего ПК, поэтому просто ввожу в браузере IP виртуалки, т.к. там стоит веб-сервер).
После выбора языка нужно будет ввести название сайта, username, пароль к сайту, email и нажать Установить WordPress.
После этого мы попадем на wp-admin - панель управления WP. Получить к нему доступ можно по URL https:///wp-admin

Unsolved PHP dependencies for WordPress

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

sudo apt install -y php-curl php-imagick php-mbstring php-zip php-gd php-intl

Можно еще настроить HTTPS через Lets Encrypt
Homework по этой теме: Module 19
LAMP стек