Thank you for reading this post, don't forget to subscribe!
Программный стек LEMP – это группа программ, предназначенная для обслуживания динамических веб-страниц и приложений, написанных на PHP. Акроним LEMP расшифровывается как Linux (операционная система), Nginx (веб-сервер), MySQL (система управления базами данных) и PHP (язык для обработки динамического контента).
Обычно уровень БД в стеке LEMP обслуживается системой управления базами данных MySQL. Но до релиза CentOS 8 пакета MySQL не было в стандартном репозитории системы CentOS. Поэтому в качестве альтернативы на машинах CentOS стала широко использоваться система MariaDB, поддерживаемый сообществом форк MySQL. На практике это значит, что вы можете перейти на MariaDB, не меняя код или конфигурации своего приложения.
Этот мануал поможет вам установить все компоненты стека LEMP на сервер CentOS 8. Хотя пакет MySQL есть в стандартном репозитории системы CentOS 8, мы установим MariaDB.
Поскольку сервер использует операционную систему Linux, первый компонент уже установлен. Мануал поможет вам установить остальное.
1: Установка Nginx
Для отображения страниц в стеке LEMP используется высокопроизводительный веб-сервер Nginx. Мы установим его с помощью dnf, нового стандартного менеджера пакетов CentOS 8.
Поскольку это первое взаимодействие с менеджером dnf в текущей сессии, нам нужно обновить индекс пакетов. После этого можно установить Nginx
sudo dnf update
sudo dnf install nginx
Чтобы подтвердить установку, нажмите y.
После завершения установки введите эту команду, чтобы включить и запустить сервер:
sudo systemctl start nginx
Если ранее вы включили брандмауэр firewalld, нужно разблокировать в нем сервис Nginx. Следующая команда откроет порт 80 для HTTP соединений на постоянной основе:
sudo firewall-cmd --permanent --add-service=http
Чтобы убедиться, что политика брандмауэра изменилась, введите:
sudo firewall-cmd --permanent --list-all
Вы получите такой вывод:
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: cockpit dhcpv6-client http ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Перезапустите брандмауэр, чтобы изменения вступили в силу:
sudo firewall-cmd --reload
Добавив новое правило брандмауэра, нужно проверить, работает ли сервер. Попробуйте открыть стандартную посадочную страницу в браузере по доменному имени или IP-адресу сервера.
Если вы не знаете своего IP-адреса, вы можете узнать его с помощью команды:
ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'
Команда вернёт несколько адресов. Проверьте каждый из них в браузере.
Также вы можете узнать свой рабочий IP с помощью этой команды, которая запрашивает, как другие точки в интернете видят ваш сервер.
curl -4 icanhazip.com
Полученный IP-адрес введите в браузер, чтобы убедиться, что веб-сервер работает должным образом.
На экране должна появиться стандартная посадочная страница Nginx:
Welcome to nginx on Red Hat Enterprise Linux!
2: Установка MariaDB
Теперь нужно установить MariaDB, СУБД, которая будет хранить и систематизировать данные сайта.
Чтобы сделать это, введите:
sudo dnf install mariadb-server
Когда установка завершится, включите и запустите сервис MariaDB:
sudo systemctl start mariadb
После установки MariaDB требует дополнительной настройки. Чтобы защитить установку, можно запустить простой скрипт безопасности, который удалит потенциально рискованные параметры. Запустите скрипт:
sudo mysql_secure_installation
Скрипт задаст ряд вопросов. Сначала нужно указать root-пароль MariaDB. Это административная учетная запись MariaDB, которая имеет повышенные привилегии. Вы установили MariaDB только что и еще не внесли никаких изменений в конфигурацию, этого пароля пока у вас нет, поэтому просто нажмите Enter.
В следующем окне скрипт предложит настроить root пароль для базы данных. Введите N и нажмите клавишу Enter. Вместо пароля MariaDB использует для root более надежный метод аутентификации, поэтому пароль сейчас можно не устанавливать.
На остальные вопросы можно нажать Y и Enter. Это удалит анонимных пользователей и тестовые базы данных, отключит удалённый root логин и обновит текущие настройки MariaDB.
После этого откройте командную строку MariaDB в терминале:
sudo mysql
Вы подключитесь к серверу MariaDB в качестве root пользователя базы данных. Вы должны увидеть примерно такой результат:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 10.3.17-MariaDB MariaDB Server
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, а не password. Сначала такой подход может показаться проблемой для безопасности, но это делает сервер БД более защищенным, поскольку войти в систему как пользователь 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, на этот раз с помощью новых учетных данных:
mysql -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-FPM
PHP – это серверный язык сценариев для создания динамических страниц.
В отличие от Apache, Nginx поставляется без интерпретатора PHP. Потому Nginx нужна внешняя программа для обработки PHP и соединения самого интерпретатора PHP с веб-сервером. Это позволяет повысить общую производительность большинства веб-сайтов на основе PHP, но требует дополнительной настройки.
Сейчас нужно установить php-fpm (fastCGI process manager). Так Nginx сможет передавать PHP-запросы на обработку. Кроме того, вам понадобится php-mysqlnd (модуль PHP, который позволяет PHP взаимодействовать с MySQL-подобными БД). Базовые пакеты PHP будут автоматически установлены как зависимости.
sudo dnf install php-fpm php-mysqlnd
После установки нужно открыть файл /etc/php-fpm.d/www.conf и внести несколько поправок.
По умолчанию CentOS 8 поставляется с текстовым редактором vi. Это очень мощный редактор, но новичкам легко в нем запутаться. Вы можете установить более удобный редактор, например nano:
sudo dnf install nano
Откройте файл в этом редакторе:
sudo nano /etc/php-fpm.d/www.conf
Найдите директивы user и group. В nano можно выполнить поиск по открытому файлу с помощью клавиш CTRL+W.
…
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
; will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
user = apache
; RPM: Keep a group allowed to write in log dir.
group = apache
…
Как видите, в этих директивах находится значение apache, что нужно изменить на nginx:
…
; RPM: apache user chosen to provide access to the same directories as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx
…
Сохраните и закройте файл (Ctrl + X, Y и Enter).
Чтобы включить и запустить сервис php-fpm, введите:
sudo systemctl start php-fpm
Перезапустите Nginx, чтобы он добавил конфигурацию установки php-fpm:
sudo systemctl restart nginx
4: Тестирование взаимодействия PHP и Nginx
В CentOS 8 стандартная установка php-fpm автоматически создает конфигурационные файлы, с помощью которых веб-сервер Nginx сможет обрабатывать файлы .php в корневом каталоге /usr/share/nginx/html. Вам не нужно вносить изменения в конфигурацию Nginx, чтобы PHP смог работать корректно.
Единственное изменение, которое нужно внести, – это в привилегии на корневой каталог Nginx. Это даст вам возможность создавать и редактировать файлы в этом каталоге в сессии своего обычного пользователя без необходимости использовать префикс sudo.
Следующая команда передаст права на стандартный корневой каталог Nginx пользователю и группе по имени 8host (вместо этого условного имени вы должны указать в команде имя своего пользователя и группы).
sudo chown -R 8host.8host /usr/share/nginx/html/
Пора убедиться, что веб-сервер успешно обслуживает файлы PHP.
Для этого нужно создать тестовый файл info.php в каталоге document root.
nano /usr/share/nginx/html/info.php
Вставьте в этот файл следующий код:
<?php
phpinfo();
Сохраните и закройте файл.
Теперь попробуйте открыть его в браузере:
На экране появится страница, содержащая информацию о сервере. Если такая страница появилась, Nginx правильно обслуживает файлы PHP.
После проверки обязательно удалите этот файл, иначе любой посторонний пользователь сможет получить доступ к конфиденциальным данным о вашем сервере.
rm /usr/share/nginx/html/info.php
При необходимости вы всегда можете снова создать этот файл.
5: Тестирование соединения базы данных с PHP (опционально)
Если вы хотите убедиться, что PHP может подключаться к MariaDB и выполнять запросы к базе данных, создайте тестовую таблицу с фиктивными данными и запросите ее содержимое из сценария PHP.
Сначала подключитесь к консоли MariaDB с помощью пользователя БД, которого вы создали в разделе 2 данного руководства:
mysql -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 /usr/share/nginx/html/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://server_host_or_IP/todo_list.php
Вы должны увидеть тезначения, которые вы вставили в тестовую таблицу.
Это означает, что среда PHP может подключаться и взаимодействовать с вашим сервером MariaDB.