Skip to content

Сборка LEMP стека

MySQL

[[Установка MySQL в Debian]]

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

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

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

SQL
create user 'wordpressuser'@'localhost' identified with mysql_native_password by '<password>';

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

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

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


PHP

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

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

Bash
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]] .

Nginx Configuration File
# 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), который отображается во вкладке браузера, в поисковике и т.д. :

Nginx Configuration File
location = /favicon.ico {log_not_found off; access_log off;}

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

Nginx Configuration File
location = /robots.txt {log_not_found off; access_log off; allow all;}

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

Nginx Configuration File
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; -> указывает, что клиенты должны кэшировать эти файлы на максимальное значение срока действия, чтобы уменьшить кол-во таких требовательных запросов к серверу.

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

Nginx Configuration File
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):

Nginx Configuration File
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

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

Bash
sudo nginx -t

И перезагружаем конфиги nginx:

Bash
sudo systemctl reload nginx


WordPress

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

Bash
wget https://wordpress.org/latest.tar.gz
tar xzvf latest.tar.gz && rm latest.tar.gz

# И следует создать папку, которую мы в конфиге nginx настроили как корневую
sudo mkdir /var/www/wordpress
# 

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

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

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

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

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

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

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

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

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

Его нужно скопировать и вставить в wp-config.php вместо этого шаблона:

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

А именно:

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 будет пользоваться для записи данных в БД (по сути, даем веб-серверу разрешение на запись):

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

Завершение настройки через веб-интерфейс

Нужно зайти на страницу (я захожу со своего ПК, поэтому просто ввожу в браузере IP виртуалки, т.к. там стоит веб-сервер):
600
После выбора языка нужно будет ввести название сайта, username, пароль к сайту и email:
500

После этого мы попадем на wp-admin - панель управления WP. Получить к нему доступ можно по URL https:///wp-admin .
Ниже скрины панели управления и главной страницы сайта:
600
600

PHP dependencies for WordPress

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

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

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

nginx #php #wordpress #mysql #LEMP