Сборка LEMP стека
MySQL
[[Установка MySQL в Debian]]
Создаем 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
Нужно внести изменения в /etc/nginx/sites-available/default после установки и первоначальной настройки [[nginx]] .
# 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), который отображается во вкладке браузера, в поисковике и т.д. :
location = /favicon.ico {log_not_found off; access_log off;}
Указание пути к файлу robots.txt, в котором описывается поведение (что он должен индексировать, а что - не должен) робота интернет-поисковика (google, yandex и т.п.), когда он приходит на сайт:
location = /robots.txt {log_not_found off; access_log off; allow all;}
Для директивы location с регулярным выражением ~* \.(css|gif|ico|jpeg|jpg|js|png)$
будут применены настройки в блоке {}:
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; -> указывает, что клиенты должны кэшировать эти файлы на максимальное значение срока действия, чтобы уменьшить кол-во таких требовательных запросов к серверу.
Определение настроек для обработки запросов, которые относятся к корневому каталогу сайта:
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):
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
После применения настроек нужно проверить конфиги на валидность:
sudo nginx -t
И перезагружаем конфиги nginx:
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
Копируем сэмпл конфига в дефолтный конфиг 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 будет примерно такой:
Его нужно скопировать и вставить в 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 будет пользоваться для записи данных в БД (по сути, даем веб-серверу разрешение на запись):
/**Даем веб-серверу разрешение на запись в БД*/
define( 'FS_METHOD', 'direct' );
Завершение настройки через веб-интерфейс
Нужно зайти на страницу (я захожу со своего ПК, поэтому просто ввожу в браузере IP виртуалки, т.к. там стоит веб-сервер):
После выбора языка нужно будет ввести название сайта, username, пароль к сайту и email:
После этого мы попадем на wp-admin - панель управления WP. Получить к нему доступ можно по URL https://
Ниже скрины панели управления и главной страницы сайта:
PHP dependencies for WordPress
WP будет ругаться, что не все нужные расширения установлены, поэтому можно их установить командой:
sudo apt install php-curl php-imagick php-mbstring php-zip php-gd php-intl
Можно еще настроить HTTPS через [[Lets Encrypt]]
Homework по этой теме: [[Module 19]]
[[LAMP стек]]