Стек LEMP – это сокращение, которое описывает типичную конфигурацию веб-сервера для хостинга и развёртывания веб-приложений. Как правило, LEMP включает следующие компоненты:
- Linux – операционная система, которая обеспечивает базовое окружение для запуска веб-сервера и других компонентов стека.
- Nginx – веб-сервер, который также широко используется и в качестве прокси-сервера, и обратного прокси. Он способен обрабатывать большое количество одновременных соединений и работать с высокими нагрузками.
- MySQL (или MariaDB) – реляционная система управления базами данных (СУБД), использующаяся для хранения и управления данными веб-приложения.
- PHP – интерпретируемый язык программирования, который применяется для разработки веб-приложений. В контексте стека LEMP, PHP часто используется для обработки динамических запросов и генерации содержимого веб-страниц на сервере.
В настоящем руководстве мы разберём установку данного комплекса на виртуальный выделенный сервер, работающий под управлением Ubuntu 22.04.
Перед началом работ по установке LEMP необходимо произвести предварительную настройку сервера, по крайней мере, в части установки и запуска брандмауэра, а также добавления в систему пользователя, обладающего полномочиями администратора для того, чтобы избавиться от необходимости использовать учётную запись root
.
Установка Nginx
За отображение веб-страниц в стеке LEMP отвечает веб-сервер Nginx. Его установку можно произвести, используя менеджер пакетов apt
. Соответственно, начать следует с обновления индекса пакетов:
$ sudo apt update
Затем запустите установку Nginx:
$ sudo apt install nginx
После того, как установка завершится, ваш Nginx уже будет готов к работе. Но поскольку в системе функционирует брандмауэр ufw
, нужно разрешить подключения к Nginx через брандмауэр. При установке веб-сервер зарегистрировал в ufw
несколько профилей, которые могут использоваться межсетевым экраном. Просмотреть список приложений, известных брандмауэру, можно при помощи команды:
$ sudo ufw app list
Как видно из вывода команды, ufw
знает о трёх профилях Nginx:

Если вы планируете использовать на веб-сервере доступ к страницам сайта не только через протокол HTTP, но и более защищённый протокол HTTPS, добавьте в ufw
разрешающее правило для профиля Nginx Full
:
$ sudo ufw allow 'Nginx Full'
Чтобы убедиться в том, что разрешающее правило добавлено в брандмауэр, проверьте его текущее состояние:
$ sudo ufw status
Вывод команды говорит о том, что разрешающее правило в ufw
, присутствует:

Теперь тестовая страница веб-сервера уже доступна для просмотра. Чтобы проверить это, откройте браузер и введите в командную строку доменное имя или IP-адрес вашего VPS.

Установка MySQL
Теперь, когда веб-сервер уже работает, нам нужно будет установить СУБД для хранения и управления данными вашего сайта. В настоящем руководстве в качестве СУБД мы установим MySQL, а также произведём её первоначальную настройку.
Для установки MySQL нужно также использовать утилиту apt
:
$ sudo apt install mysql-server
По завершении установки мы рекомендуем запустить скрипт настройки безопасности, который поставляется с дистрибутивом MySQL. Данный скрипт должен обеспечить по крайней мере минимальный уровень защиты базы данных и самой СУБД. Запуск интерактивного скрипта выполняется следующей командой:
$ sudo mysql_secure_installation
В начале работы скрипта вам будет предложено ответить на вопрос, хотите ли вы настроить плагин. Включение этой функции является чем-то вроде принятия решения. Если она включена, пароли, которые не соответствуют указанным критериям, будут отклоняться с ошибкой.
Нажмите Y
для согласия или нажмите любую другую клавишу для того, чтобы продолжить без включения функции:

Если вы ответили утвердительно, вам нужно будет выбрать уровень проверки пароля. При этом следует иметь в виду, что если вы введете 2
для активации использования самого надёжного уровня, то вы будете получать сообщения об ошибках при попытке установить любой пароль, который не содержит прописных и строчных букв, цифр, а также специальных символов:

Затем скрипт предложит удалить анонимных пользователей, которые по умолчанию содержатся в СУБД и позволяют кому угодно подключаться к MySQL без необходимости создания пользователей сразу после установки. Для того, чтобы удалить их, нажмите y
:

Далее нажмите y
, чтобы отключить удалённый вход с правами root
, который по умолчанию разрешён:

После этого вам будет предложено удалить тестовую базу данных. Она присутствует в MySQL для удобства разработки, тестирования и демонстрации возможностей. Чтобы удалить её, нажмите y
:

Затем следует согласиться с перезагрузкой таблиц привилегий, которая обеспечит применение всех внесённых на данный момент изменений. Что это сделать, нажмите y
:

После окончания работы скрипта попробуйте войти в консоль MySQL:
$ sudo mysql
В результате вы должны получить вывод такого вида, который говорит об удачном подключении к консоли MySQL:

Для выход наберите:
mysql> exit
Обратите внимание, что вам не пришлось вводить пароль для подключения от имени учётной записи
root
. Связано это с тем, что в Ubuntu для административного пользователя MySQL методом аутентификации по умолчанию являетсяauth_socket
, но не использования пароля. На первый взгляд это может показаться проблемой безопасности, но на самом деле это делает СУБД более безопасной, поскольку единственными пользователями, которым разрешено входить в систему в качестве корневого пользователя MySQL, являются системные пользователи с привилегиямиsudo
. На практике это означает, что вы не сможете использовать администратора базы данныхroot
для подключения к MySQL из PHP-приложения. Для повышения безопасности лучше всего настроить выделенные учётные записи пользователей для каждой базы данных с менее широкими привилегиями, особенно если вы планируете разместить на своем сервере несколько баз данных.
На этом установка MySQL завершена. Далее необходимо будет установить PHP – ещё один компонент в стеке LEMP.
Установка PHP
Итак, у вас установлен Nginx в качестве веб-сервера и MySQL как СУБД. Это значит, что на следующем шаге нужно будет установить PHP, который будет использоваться для обработки кода и генерации динамического контента.
В то время как Apache применяет встраивание интерпретатора PHP во все запросы, для работы Nginx необходимо наличие внешнего софта для обработки PHP. Кроме того, Nginx является своего рода мостом между веб-сервером и самим интерпретатором. В большинстве случаев это приводит к повышению общей производительности ве веб-сайтов, использующих PHP, но при этом требует проведения дополнительных настроек. Исходя из этого, на нашем VDS потребуется произвести установку приложения php8.1-fpm
(PHP FastCGI process manager). Данный софт использует текущую версию PHP для того, чтобы Nginx мог передавать PHP-запросы этому менеджеру для обработки. Дополнительно нам потребуется модуль php-mysql
. С его помощью PHP сможет взаимодействовать с базами данных нашего MySQL. Основные же пакеты PHP будут проинсталлированы как зависимости.
Для запуска инсталляции выполните команду:
$ sudo apt install php8.1-fpm php-mysql
После окончания установки компонентов PHP для их дальнейшего использования следует настроить Nginx.
Настройка Nginx
При использовании Nginx мы можем создавать серверные блоки, чтобы инкапсулировать детали конфигурации и размещать более одного домена на одном сервере.
В качестве примера мы рассмотрим процесс размещения на нашем веб-сервере сайта с доменным именем your-domain.host
.
По умолчанию в Nginx включен один серверный блок, и он настроен на обслуживание файлов из каталога по адресу /var/www/html/
. Это хорошо работает для одного сайта, но при размещении нескольких может возникнуть сложность в управлении. Вместо того, чтобы изменять /var/www/html/
, мы создадим структуру каталогов для your-domain.host
внутри /var/www/
, при этом оставим /var/www/html/
в качестве каталога по умолчанию. Он и будет обслуживаться, если запрос клиента не будет соответствовать каким-либо другим сайтам.
Итак, сначала создайте корневой каталог для своего сайта. Используя данную команду не забудьте заменить your-domain.host
на имя вашего домена:
$ sudo mkdir /var/www/your-domain.host
Затем назначьте владельца каталога с помощью переменной окружения $USER. Таким образом данная переменная будет ссылаться на вашего текущего пользователя в системе:
$ sudo chown -R $USER:$USER /var/www/your-domain.host
Затем создайте новый конфигурационный файл. Сделать это можно, например, с использованием текстового редактора nano
:
$ sudo nano /etc/nginx/sites-available/your-domain.host
Скопируйте в него следующий текст:
server {
listen 80;
root /var/www/your-domain.host;
index index.html index.htm index.php;
server_name your-domain.host www.your-domain.host;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
В данном случае:
listen
— параметр определяет, какой порт будет прослушивать Nginx. В нашей конфигурации он прослушивает порт 80, то есть дефолтный порт HTTP.root
— параметр указывает на корневой каталог документа, в котором хранятся файлы веб-сайта.index
— параметр определяет то, в каком порядке Nginx будет расставлять приоритеты индексных файлов для веб-сайта. Обычной практикой является перечисление данных файлов в порядке уменьшения приоритета. Естественно, у вас есть возможность настроить этот параметр в соответствии с потребностями именно вашего приложения.server_name
— параметр определяет за какие доменные имена и/или IP-адреса должен отвечать данный серверный блок.location /
— данный блок включает директивуtry_files
, которая проверяет наличие файлов или каталогов, соответствующих URL-запросу. Если Nginx не сможет найти соответствующий ресурс, он вернёт ошибку 404.location ~ \.php$
— данный блок указывает Nginx на файл конфигурацииfastcgi-php.conf
, а также на файлphp8.1-fpm.sock
, в котором определён связанный с ним сокет.location ~ /\.ht
— данный блок имеет дело с файлами.htaccess
, которые Nginx не обрабатывает. В нашем примере блок содержит директивуdeny all
. Это означает, что файлы.htaccess
, попавшие в корень не будут доступны посетителям.
При редактировании файла замените your-domain.host
на имя вашего домена. Когда вы закончите работу с файлом, закройте текстовый редактор с сохранением внесённых изменений, для чего используйте комбинацию клавиш Ctrl
X
, затем поочерёдно нажмите Y
и Enter
.
Активируйте новую конфигурацию используя следующую команду, где замените your-domain.host
на имя вашего домена:
$ sudo ln -s /etc/nginx/sites-available/your-domain.host /etc/nginx/sites-enabled/
После чего отлинкуйте дефолтную конфигурацию от каталога /sites-enabled/
:
$ sudo unlink /etc/nginx/sites-enabled/default
Если когда-нибудь вам понадобится восстановить конфигурацию по умолчанию, вы можете сделать это, воссоздав символьную ссылку:
$ sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/
Далее проверьте конфигурацию на наличие синтаксических ошибок:
$ sudo nginx -t
Если вывод команды будет содержать сообщения о каких-либо ошибках, вернитесь к конфигурационному файлу, чтобы ещё раз проверить его содержимое перед тем, как продолжить дальше.

Если ошибок нет, запустите процесс перезагрузки конфигурации Nginx:
$ sudo systemctl reload nginx
С этого момента сайт уже активен, но он пуст, так как каталог /var/www/your-domain.host/
не содержит ничего. Следовательно, в данном каталоге необходимо создать файл сайта – index.html
. Мы сделаем это для того, чтобы убедиться, что сайт действительно работает.
Итак, создайте файл index.html
при помощи текстового редактора nano
перейдя в каталог вашего сайта:
$ cd /var/www/your-domain.host/
$ nano index.html
В качестве примера мы внесём в него следующее содержимое:
<p>Your Nginx site - your-domain.host</p>
<p>You see your new Nginx site <b>your-domain.host</b> on Ubuntu 22.04</p>
Закройте файл index.html
сохранив внесённые изменения. После чего в браузере перейдите по ссылке вида http://your-domain.host
, где your-domain.host
замените на имя вашего сайта.

Если вы увидите страницу вашего сайта, значит серверный блок Nginx работает должным образом.
На данном этапе стек LEMP полностью настроен. Теперь мы создадим самый простой PHP-скрипт, чтобы проверить, действительно ли Nginx способен обрабатывать php-файлы на только что настроенном веб-ресурсе.
Тестирование PHP с помощью Nginx
Чтобы проверить работоспособность PHP, создайте файл index.php
в корневом каталоге вашего сайта:
$ cd /var/www/your-domain.host/
$ nano index.php
Затем вставьте в него следующий текст:
<?php
phpinfo();
После чего закройте файл с сохранением изменений и в браузере перейдите по ссылке вида http://your-domain.host/index.php
. В результате вы должны получить веб-страницу, содержащую подробную информацию о вашем сервере:

После этого лучше всего удалить файл index.php
, поскольку он содержит конфиденциальную информацию о вашей среде PHP и сервере в целом. Для удаления используйте команду rm
:
$ cd /var/www/your-domain/
$ sudo rm index.php
Заключение
В результате проведённой работы мы развернули веб-сервер Nginx. С его помощью мы сможем создавать веб-страницы, используя PHP в качестве скриптового языка и MySQL как систему управления базами данных.