Установка стека LEMP в Debian 10

Стек LEMP – это группа программ, предназначенная для обслуживания динамических веб-страниц и веб-приложений. Этот акроним расшифровывается как Linux (операционная система), Nginx (веб-сервер), MariaDB (система управления базами данных) и PHP (серверный язык сценариев для обработки динамического контента).

Данный мануал научит устанавливать все компоненты стека LEMP на сервер Debian 10. Поскольку сервер уже использует операционную систему Debian, первый компонент – Linux – уже установлен. Мануал поможет установить остальное.

Требования

Для работы вам понадобится сервер Debian 10, настроенный по этому мануалу. Сервер должен поддерживать MariaDB в качестве системы управления базами данных.

1: Установка Nginx

Для отображения веб-страниц в этом стеке используется современный и производительный веб-сервер Nginx.

Все программное обеспечение, необходимое для установки веб-сервера, находится в стандартных репозиториях системы.

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

sudo apt update
sudo apt install nginx

В системе Debian 10 веб-сервер Nginx автоматически запускается после установки.

Если ранее вы настроили брандмауэр, нужно разрешить соединения сервиса Nginx. Во время установки Nginx регистрируется как сервис в ufw, потому разрешить трафик веб-сервера очень просто.

Рекомендуется выбрать наиболее строгий профиль веб-сервера. Однако, поскольку на сервере ещё не настроен SSL, мы можем настроить только порт 80.

Чтобы включить этот профиль, введите:

sudo ufw allow 'Nginx HTTP'

Убедитесь в том, что профиль включен:

sudo ufw status

Команда должна сообщить, что трафик HTTP разрешен:

Status: active
To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx HTTP                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

Добавив новое правило брандмауэра, нужно проверить, работает ли сервер. Попробуйте открыть стандартную посадочную страницу в браузере. Эта страница доступна по доменному имени или IP-адресу.

Если вы не знаете своего IP-адреса, вы можете узнать его с помощью командной строки. Введите:

ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'

Команда вернёт несколько строк. Проверьте каждый адрес в браузере.

Узнав свой IP, введите его в браузер, чтобы убедиться, что веб-сервер работает должным образом.

http://server_domain_or_IP

На экране должна появиться стандартная посадочная страница Nginx:

Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

2: Установка MariaDB

Теперь нужно установить MariaDB, систему управления базами данных, которая будет хранить и систематизировать данные сайта.

По умолчанию в Debian 10 вместо традиционного метапакета mysql-server используется MariaDB, разработанный сообществом форк проекта MySQL. MariaDB хорошо работает в большинстве случаев, но если вам нужны функции, доступные только в Oracle MySQL, вы можете установить и использовать пакеты из репозитория, поддерживаемого разработчиками MySQL.

Однако для более долгосрочной совместимости рекомендуется вместо метапакета MySQL установить MariaDB (через пакет mariadb-server).

Чтобы сделать это, введите:

sudo apt install mariadb-server

После установки MariaDB требует настройки. Чтобы защитить установку, можно запустить простой скрипт безопасности, который удалит потенциально рискованные настройки. Инициируйте скрипт:

sudo mysql_secure_installation

Сценарий задаст ряд вопросов. Сначала нужно указать root-пароль MariaDB. Это административная учетная запись MariaDB, которая имеет повышенные привилегии. Вы установили MariaDB только что и еще не внесли никаких изменений в конфигурацию, этого пароля пока у вас нет, поэтому просто нажмите Enter.

В следующем запросе скрипт предложит настроить пароль root для базы данных. Введите N и нажмите клавишу Enter. В Debian учетная запись root MariaDB тесно связана с автоматизированным обслуживанием системы, поэтому изменять стандартные методы аутентификации этой учетной записи нельзя. Иначе при обновлении пакета БД может повредиться, а доступ к учетной записи root может быть утрачен. Позже мы рассмотрим, как настроить дополнительную учетную запись администратора, если аутентификация сокетов вам не подходит.

На остальные вопросы можно нажать Y и Enter. Это удалит анонимных пользователей и тестовые базы данных, отключит удалённый root логин и обновит текущие настройки MariaDB.

После этого откройте командную строку MariaDB в терминале:

sudo mariadb

Вы подключитесь к серверу MariaDB в качестве root пользователя базы данных. Вы должны увидеть примерно такой результат:

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 74
Server version: 10.3.15-MariaDB-1 Debian 10
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>

Обратите внимание: вам не нужно было указывать пароль. Это потому, что метод аутентификации администратора по умолчанию в MariaDB — unix_socket, а не пароль. Сначала это может показаться проблемой для безопасности, но это делает сервер базы данных более защищенным, поскольку войти в систему как пользователь root MariaDB могут только системные пользователи с привилегиями sudo, подключающиеся с консоли или через приложение, работающее с теми же привилегиями. Практически это означает, что вы не сможете использовать аккаунт администратора для подключения с вашего PHP-приложения.

Для повышения безопасности лучше иметь для каждой базы данных отдельные учетные записи с более узкими привилегиями (особенно если вы планируете разместить на своем сервере несколько баз данных). Давайте создадим базу данных example_database и пользователя example_user (вы можете заменить эти имена другими значениями).

Чтобы создать новую базу данных, выполните следующую команду из консоли MariaDB:

CREATE DATABASE example_database;

Теперь вы можете создать нового пользователя и предоставить ему полные права на новую базу данных. Следующая команда определяет условный пароль этого пользователя (password), вы должны заменить это значение безопасным паролем.

GRANT ALL ON example_database.* TO 'example_user'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;

Это предоставит пользователю example_user полные права доступа к базе данных example_database, в то же время запретив ему создавать или изменять другие базы данных на вашем сервере.

Сбросьте привилегии:

FLUSH PRIVILEGES;

После этого выйдите из оболочки MariaDB:

exit

Вы можете проверить, есть ли у нового пользователя соответствующие права доступа. Снова войдите в консоль MariaDB, на этот раз с помощью новых учетных данных:

mariadb -u example_user -p

Обратите внимание на флаг -p в этой команде, который запрашивает пароль, который вы указали при создании пользователя example_user. После входа в консоль MariaDB убедитесь, что у вас есть доступ к базе данных example_database:

SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| example_database   |
| information_schema |
+--------------------+
2 rows in set (0.000 sec)

Чтобы выйти из оболочки MariaDB, введите:

exit

3: Установка PHP

PHP – это серверный язык сценариев для создания динамических страниц.

В отличие от Apache, Nginx поставляется без интерпретатора PHP. Nginx требуется внешняя программа для обработки PHP и соединения самого интерпретатора PHP с веб-сервером. Это позволяет повысить общую производительность большинства веб-сайтов на основе PHP, но требует дополнительной настройки.

Сейчас нужно установить php-fpm (fastCGI process manager). Так Nginx сможет передавать PHP-запросы на обработку.  Кроме того, вам понадобится php-mysql, модуль PHP, который позволяет PHP взаимодействовать с базами данных на основе MySQL. Базовые пакеты PHP будут автоматически установлены как зависимости.

sudo apt install php-fpm php-mysql

4: Настройка Nginx для поддержки PHP

Все компоненты стека установлены. Теперь нужно настроить взаимодействие Nginx и PHP.

Для этого нужно отредактировать блок server (виртуальный хост). Мы оставим конфигурацию Nginx по умолчанию без изменений, создадим новый файл конфигурации и новый корневой каталог для хранения файлов PHP. Файл конфигурации и каталог должен называться так же, как домен или хост, для которого он предназначен.

В Debian 10 Nginx поставляется с одним блоком server, он включен по умолчанию и настроен на обслуживание документов вне каталога /var/www/html. Это хорошо работает для одного сайта, но управлять несколькими сайтами так не получится. Вместо того чтобы изменять /var/www/html, создайте структуру каталогов в /var/www  для веб-сайта your_domain, оставив /var/www/html в качестве каталога по умолчанию, который будет обслуживаться, если запрос клиента не совпадает ни с одним другим сайтом.

Создайте корневой каталог для вашего домена:

sudo mkdir /var/www/your_domain

Затем укажите владельца каталога с помощью переменной среды $USER, которая должна ссылаться на вашего текущего системного пользователя:

sudo chown -R $USER:$USER /var/www/your_domain

Затем откройте новый конфигурационный файл в каталоге sites-available:

sudo nano /etc/nginx/sites-available/your_domain

Вы увидите пустой файл. Вставьте в него:

server {
listen 80;
listen [::]:80;
root /var/www/your_domain;
index index.php index.html index.htm;
server_name your_domain;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
}
}

Это базовая конфигурация, которая прослушивает порт 80 и обслуживает файлы из только что созданного каталога. Она будет отвечать только на запросы к имени, указанному в server_name. Любые файлы, оканчивающиеся на .php, будут обрабатываться процессом php-fpm до того, как Nginx отправит результаты пользователю.

Сохраните и закройте файл.

Активируйте свою конфигурацию, создав симлинк из каталога sites-enabled:

sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/

Теперь Nginx сможет использовать конфигурацию при следующей перезагрузке. Сначала проверьте вашу конфигурацию на наличие ошибок:

sudo nginx -t

Если команда найдет какие-то ошибки, вернитесь и перепроверьте файл, прежде чем продолжить.

Когда ошибок не останется, перезагрузите Nginx, чтобы внести изменения в настройку:

sudo systemctl reload nginx

5: Тестирование установки

Теперь установка стека LEMP полностью завершена. Пора убедиться, что веб-сервер успешно обслуживает файлы PHP.

Для этого нужно создать тестовый файл info.php в каталоге document root.

nano /var/www/your_domain/info.php

Вставьте в него следующий код:

<?php
phpinfo();

Сохраните и закройте файл.

Теперь попробуйте открыть его в браузере:

http://your_domain/info.php

На экране появится страница, содержащая информацию о сервере. Если такая страница появилась, Nginx правильно обслуживает файлы PHP.

После проверки обязательно удалите этот файл, иначе любой пользователь сможет получить доступ к конфиденциальным данным о сервере.

rm /var/www/your_domain/info.php

6: Тестирование соединения базы данных с PHP (опционально)

Если вы хотите проверить, может ли PHP подключаться к MariaDB и выполнять запросы к базе данных, вы можете создать тестовую таблицу с фиктивными данными и запросить ее содержимое из сценария PHP.

Сначала подключитесь к консоли MariaDB с помощью пользователя БД, которого вы создали в разделе 2 данного руководства:

mariadb -u example_user -p

Создайте таблицу по имени todo_list. В консоли MariaDB выполните следующую команду:

CREATE TABLE example_database.todo_list (
item_id INT AUTO_INCREMENT,
content VARCHAR(255),
PRIMARY KEY(item_id)
);

Теперь вставьте в тестовую таблицу несколько строк. Для этого вы можете повторить следующую команду несколько раз, используя разные значения:

INSERT INTO example_database.todo_list (content) VALUES ("My first important item");

Чтобы подтвердить, что данные были успешно сохранены в вашей таблице, выполните:

SELECT * FROM example_database.todo_list;

Вы увидите следующий вывод:

+---------+--------------------------+
| item_id | content                  |
+---------+--------------------------+
|       1 | My first important item  |
|       2 | My second important item |
|       3 | My third important item  |
|       4 | and this one more thing  |
+---------+--------------------------+
4 rows in set (0.000 sec)

Убедившись, что в тестовой таблице есть данные, вы можете выйти из консоли MariaDB:

exit

Теперь можно создать PHP-скрипт, который будет подключаться к MariaDB и запрашивать контент. Создайте новый PHP-файл в корневом каталоге.

nano /var/www/your_domain/todo_list.php

Добавьте в PHP-скрипт следующее содержимое:

<?php
$user = "example_user";
$password = "password";
$database = "example_database";
$table = "todo_list";
try {
$db = new PDO("mysql:host=localhost;dbname=$database", $user, $password);
echo "<h2>TODO</h2><ol>";
foreach($db->query("SELECT content FROM $table") as $row) {
echo "<li>" . $row['content'] . "</li>";
}
echo "</ol>";
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}

Сохраните и закройте файл, когда закончите редактирование.

Теперь вы можете получить доступ к этой странице в своем веб-браузере, посетив домен или внешний IP-адрес, который вы указали в конфигурации Nginx. К нему нужно добавить секцию /todo_list.php:

http://your_domain/todo_list.php

Вы должны увидеть свой контент, который вы вставили в тестовую таблицу.

Это означает, что среда PHP может подключаться и взаимодействовать с вашим сервером MariaDB.

Заключение

Теперь на сервере Debian установлен программный стек LEMP – надёжная и гибкая платформа для развёртывания сайта или приложения. На этом этапе можно приступать к дальнейшей настойке сервера.

Например, можно установить Composer. Также вы можете зашифровать соединения с вашим сервером. Для этого нужно зашифровать установку Nginx с помощью сертификата Let’s Encrypt. Следуя этому мануалу, вы получите бесплатный сертификат TLS/SSL для своего сервера, что позволит ему обслуживать контент через HTTPS.

Tags: , , , , ,