LEMP это программный стек — набор инструментов, связанных вместе, для реализации задачи по построению WEB сервера. Этот акроним обозначает операционную систему Linux и Nginx, MySQL/MariaDB и PHP. LEMP — это аналог популярного стека LAMP, используемого для разработки и развертывания веб-приложений. Традиционно LAMP состоит из Linux, Apache, MySQL и PHP. 

В данной статье мы установим Nginx, MariaDB и PHP7.4 (я напишу пару слов и об установке других версий PHP). Также я покажу, как создавать сайты с доменами в Nginx и работать с базой данных на примере установки wordpress.

Все команды будут выполняться в терминале Ubuntu.

Установка веб-сервера Nginx

Для установки самого сервера выполняем команду:

sudo apt install nginx

После установки запустим сервер:

sudo systemctl start nginx

И проверим статус сервиса Nginx:

sudo systemctl status nginx

Он должен быть в состоянии «active (running)»:

Статус сервиса

Статус сервиса

Чтобы вернуть фокус ввода нажми клавишу q (если не срабатывает смени раскладку клавиатуры).

 

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

sudo systemctl enable nginx

Для отключения автозапуска используется команда:

sudo systemctl disable nginx

 

Последним шагом осталось присвоить каталог сервера пользователю www-data:

sudo chown www-data:www-data /usr/share/nginx/html -R

Добавить своего пользователя в группу www-data  ($USER — переменная с именем текущего пользователя):

sudo usermod -a -G www-data $USER

И задать права для группы на чтение и запись:

sudo chmod ug+rwx /usr/share/nginx/html/

Последние 3 шага не обязательны, но так мы сможем работать с каталогом html от имени своего пользователя, а не от root.

 

Настало время убедиться, что сервер работает. Для этого в браузере (например Firefox) наберем IP адрес машины, на которую мы устанавливаем LEMP. Если установка производится на локальный компьютер, тогда IP будет 127.0.0.1

Окно браузера

Окно браузера

Судя по приветствию «Welcome to nginx!» — все работает.

Для остановки сервера используется команда:

sudo systemctl stop nginx

 

Что, если после запуска сервера его статус active, но браузер показывает ошибку соединения?

Ошибка соединения

Ошибка соединения

Возможно запросы блокирует фаервол, например UFW или iptables. Для нормальной работы web-сервера нужно открыть в них 80 порт. Например, в iptables это делается командой:

sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT

А в UFW:

sudo ufw allow http

 

Для справки — логи Nginx хранятся в каталоге /var/log/nginx:

  • access.log — лог обращений к серверу
  • error.log — лог с возникающими ошибками

 

Установка сервера базы данных MariaDB

Для установки сервера MariaDB используем команду:

sudo apt install mariadb-server mariadb-client

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

systemctl status mariadb
Статус сервиса

Статус сервиса

 

Для запуска сервиса вручную используется команда:

sudo systemctl start mariadb

А для остановки:

sudo systemctl stop mariadb

Для включения автозагрузки при старте системы:

sudo systemctl enable mariadb

 

Продолжим, выполнив установочный скрипт:

sudo mysql_secure_installation

Когда скрипт попросит ввести текущий пароль root ничего не вводя просто жмем Enter:

Установка MariaDB

Установка MariaDB

Далее будет вопрос об установке пароля, соглашаемся (нажав Y):

Установка MariaDB

Установка MariaDB

И вводим новый пароль root пользователя базы данных. После этого нам будет задано еще четыре вопроса про ананимного пользователя и удаленный рут доступ, на все вопросы просто жмем Enter:

Установка MariaDB

Установка MariaDB

Установка MariaDB

Установка MariaDB

Установка MariaDB

Установка MariaDB

В конце в терминале мы увидим

All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

 

MariaDB использует unix_socket по умолчанию, значит для входа в консоль управления мы можем пользоваться логином и паролем администратора Ubuntu — запустив ее через sudo:

sudo mariadb -u root
Консоль MariaDB

Консоль MariaDB

«Сокет домена Unix или IPC-сокет — конечная точка обмена данными, подобная Интернет-сокету, но не использующая сетевого протокола для взаимодействия. Используется в операционных системах, поддерживающих стандарт POSIX, для межпроцессного взаимодействия…» Цитата из Wikipedia

Для выхода из консоли используется команда

exit

 

Установка PHP

Небольшое отступление по поводу версии PHP, ведь для некоторых проектов иногда требуется установка более ранних версий. Если тебе необходима другая версия php, например php5.6 или 7.0, тогда добавь в систему ppa ondrej/php и делай все по аналогии с инструкцией, но в первой команде установки PHP замени 7.4 на, например, 5.6 или 7.0 и далее используй не php7.4*, а php5.6* или 7.0. И, главное, обрати внимание, что в конфигурации сервера Nginx тебе тоже придется изменить адрес сокета PHP (с /run/php/php7.4-fpm.sock; на, например, /run/php/php7.0-fpm.sock) Команда добавления ppa:

sudo add-apt-repository ppa:ondrej/php

 

Вернемся к установке актуальной версии — 7.4. Выполним команду по установке php из стандартных репозиториев Ubuntu 20.04:

sudo apt install php7.4 php7.4-fpm php7.4-mysql php-common php7.4-cli php7.4-common php7.4-json php7.4-opcache php7.4-readline php7.4-mbstring php7.4-xml php7.4-gd php7.4-curl

Данная команда устанавливает не только сам препроцессор гипертекста, но и некоторые дополнительные расширения, необходимые для работы многих web-приложений, таких, как WordPress.

Запустим PHP:

sudo systemctl start php7.4-fpm

Остановка сервиса и его добавление и изъятие из автозагрузки происходит аналогично сервисам Nginx и MariaDB: systemctl stop — остановка, systemctl enable — автозапуск, systemctl disable — отключение автозапуска.

Проверим статус сервиса PHP:

systemctl status php7.4-fpm
Статус сервиса PHP

Статус сервиса PHP

 

Создание блока сервера Nginx и тест PHP

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

Для начала удалим дефолтный:

sudo rm /etc/nginx/sites-enabled/default

И создадим свой:

sudo nano /etc/nginx/conf.d/default.conf

И вставим в него следующий текст (ничего менять не надо, это блок по умолчанию):

server {
  listen 80;
  listen [::]:80;
  server_name _;
  root /usr/share/nginx/html/;
  index index.php index.html index.htm index.nginx-debian.html;
  
  location / {
    try_files $uri $uri/ /index.php;
  }
  
  location ~ \.php$ {
    fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    include snippets/fastcgi-php.conf;
  }
  
  location ~ /\.ht {
      access_log off;
      log_not_found off;
      deny all;
  }
}

В окне редактора nano нужно нажать SHIFT+INSERT, чтобы вставить текст (или мышкой можно). Далее сохраним файл, нажав CTRL+O и выйдем — CTRL+W.

После этого нужно перезагрузить Nginx:

sudo systemctl restart nginx

Приступим к тесту php, создадим файл с функцией phpinfo() в корне сервера:

sudo nano /usr/share/nginx/html/phpinfo.php

Впишем в него:

<?php
phpinfo();
?>
Редактор nano

Редактор nano

После сохранения файла php перейдем в браузере по ссылке IP/phpinfo.php

phpinfo

phpinfo

Если мы видим информационную таблицу препроцессора, значит все работает.

 

Создание блоков для нескольких доменов

Для примера создадим домен test.ru на машине с только что установленным LEMP. Если машина локальная, то сначала нужно добавить домен в файл hosts, чтобы можно было обратиться к нему из браузера, на хостинге же нужно просто указать вручную в NS записях домена (у регистроатора домена), свой ip адрес сервера и дождаться обновления DNS и делать все по аналогии (в hosts добавлять не нужно, хотя и можно, чтобы не ждать, пока обновятся записи DNS).

Добавим домен в файл hosts:

sudo nano /etc/hosts

Впишем строку:

127.0.0.1       test.ru

 

Далее продолжим обязательные манипуляции и создадим каталог для домена (не обязательно он должен располагаться в /usr/share/nginx/html, он может быть, например в /var/www):

sudo mkdir /usr/share/nginx/html/test.ru

Зададим права и пользователя для каталога:

sudo chown www-data:www-data /usr/share/nginx/html/test.ru -R
sudo chmod ug+rwx /usr/share/nginx/html/test.ru -R

Создадим в каталоге файл index.html:

nano /usr/share/nginx/html/test.ru/index.html

В него вставим html код:

<html><head></head><body>Hello world!</body></html>

Далее копируем наш файл default.conf в каталог sites-available и назовем его test.ru:

sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/sites-available/test.ru

Откроем его в текстовом редакторе и немного изменим:

sudo nano /etc/nginx/sites-available/test.ru
server {
  listen 80;
  listen [::]:80;
  server_name test.ru www.test.ru;
  root /usr/share/nginx/html/test.ru;
  index index.php index.html index.htm index.nginx-debian.html;

  location / {
    try_files $uri $uri/ /index.php;
  }

  location ~ \.php$ {
    fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    include snippets/fastcgi-php.conf;
  }

  location ~ /\.ht {
      access_log off;
      log_not_found off;
      deny all;
  }
}

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

server_name test.ru www.test.ru;

root /usr/share/nginx/html/test.ru;

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

sudo ln -s /etc/nginx/sites-available/test.ru /etc/nginx/sites-enabled/test.ru

Все, нужно перезагрузить Nginx, чтобы изменения вступили в силу:

sudo systemctl restart nginx

Открываем в браузере test.ru для проверки:

Тестовый сайт

Тестовый сайт

Настройки Nginx для сайта test.ru будут в созданном файле /etc/nginx/sites-available/test.ru (например настройка кэша или IP6). И по аналогии с созданием test.ru можно создать любое количество сайтов.

Установим WordPress

Для более детального примера и понимания работы с базой данных установим на сайт test.ru CMS WordPress.

Создадим базу данных и пользователя для нее. Откроем консоль MariaDB в терминале:

sudo mariadb -u root

Создадим базу (внимание, здесь обратные кавычки):

CREATE DATABASE `wordpress`;

Создадим пользователя: (myuser — логин, pass- пароль)

CREATE USER 'myuser' IDENTIFIED BY 'pass';

Дадим пользователю разрешение на работу с MariaDB

GRANT USAGE ON *.* TO 'myuser'@localhost IDENTIFIED BY 'pass';

И все права на базу wordpress (имя базы в обратных кавычках):

GRANT ALL privileges ON `wordpress`.* TO 'myuser'@localhost;

Обновим данные прав в MariaDB:

FLUSH PRIVILEGES;

Ну вот, мы создали пользователя и базу данных. Приступим к установке CMS.

Скачаем и распакуем в корневой каталог test.ru (/usr/share/nginx/html/test.ru) сам WordPress с официального сайта (https://ru.wordpress.org/latest-ru_RU.tar.gz).

Перейдем в браузере по адресу test.ru:

Установка wordpress

Установка wordpress

Жмем вперед и заполняем все поля:

Установка wordpress

Установка wordpress

Затем создаем файл конфига и сохраняем его, создаем пользователя в WordPress и готово:

Установка wordpress

Установка wordpress

Переходим на test.ru:

Установка wordpress

Установка wordpress

Как мы видим — все работает!

 

На этом установка LEMP с начальной конфигурацией закончена и можно приступать к созданию сайтов и web приложений или их отладке.