IT-BLOG

Установка стека LEMP на Ubuntu 20.04

2022-08-22 в категории Обучающие материалы

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

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

Требования

Для работы вам понадобится сервер Ubuntu 20.04

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

Для отображения веб-страниц в этом стеке используется производительный веб-сервер Nginx. Все программное обеспечение, необходимое для установки веб-сервера, находится в стандартных репозиториях системы, его можно установить с помощью пакетного менеджера apt. Поскольку это первое взаимодействие с apt в текущей сессии, нужно обновить индекс пакетов. После этого можно установить Nginx.

$sudo apt update
$sudo apt install nginx

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

Чтобы просмотреть доступные профили, введите:

$sudo ufw app list
Available applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH

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

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

sudo ufw allow 'Nginx HTTP'

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

$sudo ufw status

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-адрес видят другие точки в сети. Для этого введите:

$curl -4 icanhazip.com

Узнав вой 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. Установка MySQL

Теперь нужно установить MySQL, систему управления базами данных, которая будет хранить и систематизировать данные вашего сайта. MySQL – популярная СУБД в средах PHP. Чтобы установить MySQL, используйте apt:

$sudo apt install mysql-server

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

$sudo mysql_secure_installation

Сначала он предложит настроить Validate Password Plugin, который проверяет надежность вашего пароля. Примечание: Этот плагин оценивает сложность вашего пароля MySQL. Если пароль недостаточно сложный, он не пройдет проверку и будет отклонен с ошибкой. В целом этот плагин можно не включать, но вы должны всегда использовать надежные и уникальные пароли для защиты своих данных. Если вы хотите включить этот плагин, введите Y:

VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?
Press y|Y for Yes, any other key for No:

Если вы включили Validate Password Plugin, сценарий предложит выбрать уровень проверки пароля. Наивысший уровень можно включить, нажав 2; тогда ваш пароль должен будет включать минимум 8 символов, среди которых должны быть буквы в верхнем и нижне регистре, цифры и специальные символы.

There are three levels of password validation policy:
LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1

Независимо от того, включили вы VALIDATE PASSWORD PLUGIN или нет, ваш сервер затем попросит вас выбрать и подтвердить пароль для пользователя root MySQL. Не путайте его с системным root. Root-пользователь базы данных – это администратор с полными привилегиями. Метод аутентификации root-пользователя MySQL по умолчанию не требует пароля, даже если пароль установлен; несмотря на это, вы должны определить здесь надежный пароль – в качестве дополнительной меры безопасности. Мы поговорим об этом чуть позже.

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

Estimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y

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

$sudo mysql

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

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 22
Server version: 8.0.19-0ubuntu5 (Ubuntu)
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>

Чтобы закрыть консоль MySQL, введите:

>exit

Обратите внимание: вам не нужно было указывать пароль. Это потому, что метод аутентификации администратора по умолчанию в MySQL – unix_socket, а не password. Сначала такой метод может показаться проблемой безопасности, но он делает сервер базы данных более защищенным, поскольку войти в систему как пользователь root MySQL могут только системные пользователи с привилегиями sudo, подключающиеся из консоли или приложения с теми же привилегиями. Практически это значит, что вы не сможете использовать аккаунт администратора для подключения с вашего PHP-приложения. Выбранный нами ранее root-пароль MySQL нужен на тот случай, если метод аутентификации unix_socket будет изменен на password. Для повышения безопасности лучше иметь отдельные учетные записи с более узкими привилегиями для каждой базы данных (особенно если вы планируете разместить на своем сервере несколько БД). Примечание: На момент написания этого мануала PHP-библиотека MySQL mysqlnd не поддерживает caching_sha2_authentication, метод аутентификации по умолчанию для MySQL 8. Потому при создании пользователей БД для приложений PHP на MySQL 8 вам необходимо убедиться, что они используют mysql_native_password. Мы поговорим об этом в разделе 6. Теперь ваш сервер MySQL защищен. Далее мы установим PHP, последний компонент в стеке LAMP.

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

PHP – это серверный язык сценариев для написания динамических страниц. Он позволяет запускать сценарии, подключаться к БД MySQL и передавать обработанный контент в браузер для отображения. В отличие от Apache, Nginx поставляется без интерпретатора PHP. Nginx требуется внешняя программа для обработки PHP и соединения самого интерпретатора PHP с веб-сервером. Это позволяет повысить общую производительность большинства веб-сайтов на основе PHP, но требует дополнительной настройки. Сейчас нужно установить php-fpm (fastCGI process manager). Так Nginx сможет передавать PHP-запросы на обработку. Кроме того, вам понадобится php-mysql, модуль PHP, который позволяет PHP взаимодействовать с базами данных на основе MySQL. Базовые пакеты PHP будут автоматически установлены как зависимости. Чтобы установить пакеты php-fpm и php-mysql, введите:

$sudo apt install php-fpm php-mysql

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

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

Чтобы настроить взаимодействие Nginx и PHP, нужно отредактировать блок server (виртуальный хост). Мы оставим конфигурацию Nginx по умолчанию без изменений, создадим новый файл конфигурации и новый корневой каталог для хранения файлов PHP. Файл конфигурации и каталог должен называться так же, как домен или хост, для которого он предназначен. Примечание: В данном мануале мы используем условный домен your_domain, который вы должны заменить своим доменом. В Ubuntu 20.04 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;
  server_name your_domain www.your_domain;
  root /var/www/your_domain;
  index index.html index.htm index.php;
  location / {
    try_files $uri $uri/ =404;
  }
  location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
  }
  location ~ /\.ht {
    deny all;
  }
}

Вот что делает каждая директива:

  • listen: определяет порт. Который будет слушать Nginx (здесь это порт 80).
  • root: определяет корневой каталог проекта, в котором должен храниться весь контент. index: задает список, по которому Nginx сможет определить приоритет index файлов для этого сайта. Как правило, файлы index.html имеют более высокий приоритет, чем index.php, чтобы можно было быстро настроить целевую страницу обслуживания в приложениях PHP. Вы можете настроить эти параметры согласно потребностям вашего приложения.
  • server_name: определяет доменные имена и/или IP-адреса, которые должен обслуживать этот блок server. В этой директиве укажите домен сервера или его внешний IP-адрес.
  • location /: первый блок location включает в себя директиву try_files, которая проверяет наличие файлов или каталогов, соответствующих запросу URI. Если Nginx не может найти соответствующий ресурс, он вернет ошибку 404.
  • location ~ .php: этот блок location обеспечивает фактическую обработку PHP, указывая Nginx на файл конфигурации fastcgi-php.conf и файл php7.4-fpm.sock, в котором объявляется, какой сокет связан с php-fpm.
  • location ~ /.ht: последний блок location работает с файлами .htaccess, которые Nginx не обрабатывает. При добавлении директивы deny all любые файлы .htaccess, попавшие в корневой каталог проекта, не будут предоставляться посетителям. Сохраните и закройте файл. Активируйте свою конфигурацию, создав симлинк из каталога sites-enabled:
$sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/

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

$sudo nginx -t

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

$sudo systemctl reload nginx

Ваш новый веб-сайт теперь включен, но корневой каталог /var/www/your_domain все еще пуст. Создайте в нем файл index.html, чтобы проверить, правильно ли работает ваш новый блок server:

$nano /var/www/your_domain/index.html

Вставьте в файл такие строки:

<html>
<head>
<title>your_domain website</title>
</head>
<body>
<h1>Hello World!</h1>
<p>This is the landing page of <strong>your_domain</strong>.</p>
</body>
</html>

Теперь откройте браузер и перейдите по своему домену или IP-адресу, который вы указали в server_name.

http://server_domain_or_IP

На экране вы увидите:

Hello World! This is the landing page of your_domain

Если вы видите эту страницу, это означает, что ваш блок server работает должным образом. Вы можете оставить этот файл как временную посадочную страницу своего приложения, пока не создадите файл index.php для его замены. Как только вы это сделаете, не забудьте удалить или переименовать файл index.html из корневого каталога, так как он будет иметь приоритет над файлом index.php по умолчанию. Ваш стек LEMP теперь полностью настроен. Давайте далее создадим PHP-скрипт и убедимся, что Nginx действительно может обрабатывать файлы .php на вашем недавно настроенном веб-сайте.

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

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

$nano /var/www/your_domain/info.php

Вставьте в этот файл такие строки:

<?php
phpinfo();
?>

Сохраните и закройте файл. Теперь попробуйте открыть его в браузере:

http://server_domain_or_IP/info.php

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

$sudo rm /var/www/your_domain/info.php

При необходимости вы сможете легко восстановить эту страницу.

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

Если вы хотите проверить, может ли PHP подключаться к MySQL и выполнять запросы к базе данных, вы можете создать тестовую таблицу с фиктивными данными и запросить ее содержимое из сценария PHP. Сначала нам нужно создать тестовую базу данных и пользователя для доступа к ней. На момент написания этого мануала mysqlnd (PHP-библиотека для MySQL) не поддерживает caching_sha2_authentication, стандартный метод аутентификации MySQL 8. Нам нужно создать нового пользователя с аутентификацией mysql_native_password, чтобы иметь возможность подключиться к БД MySQL из PHP. Давайте создадим базу данных example_database и пользователя example_user (вы можете заменить эти имена другими значениями). Чтобы создать новую базу данных, войдите в СУБД как root:

$sudo mysql

И выполните следующую команду из консоли MySQL:

CREATE DATABASE example_database;

Теперь можно создать нового пользователя и предоставить ему полные права на новую базу данных.

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

CREATE USER 'example_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

Эта команда предоставит пользователю example_user полные права доступа к БД example_database:

GRANT ALL ON example_database.* TO 'example_user'@'%';

В то же время она запретит ему создавать или изменять другие базы данных на вашем сервере.

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

>exit

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

$mysql -u example_user -p

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

>show databases;
+--------------------+
| Database           |
+--------------------+
| example_database   |
| information_schema |
+--------------------+
2 rows in set (0.000 sec)

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

>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)

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

exit

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

$nano /var/www/your_domain/todo_list.php

Добавьте в PHP-скрипт следующие строки. Такой скрипт PHP подключается к базе данных MySQL и запрашивает содержимое таблицы todo_list, отображая результаты на экране в виде списка. Если у вас есть проблема с подключением к базе данных, он выдаст исключение.

<?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();
}
?>

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

http://server_domain_or_IP/todo_list.php

Вы должны увидеть свой контент, который вы добавили в тестовую таблицу. Это означает, что среда PHP может подключаться и взаимодействовать с вашим сервером MySQL.

Заключение

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

Sasha

Персональный блог Sasha.

Блог об информационных технологиях