Установка стека Linux, Nginx, MySQL, PHP ( LEMP) в CentOS 8

Введение

Программный стек LEMP — это комплекс программного обеспечения, используемый для обслуживания динамических веб-страниц и веб-приложений, написанных на PHP. Название LEMP — это акроним, включающий операционную систему Linux с веб-сервером Nginx (произносится “Engine-X”). Данные серверной части хранятся в базе данных MySQL, а динамическая обработка выполняется PHP.

За слой базы данных в стеке LEMP обычно отвечает сервер базы данных MySQL, но до выхода CentOS 8 сервер MySQL не был доступен в репозиториях CentOS по умолчанию. В результате MariaDB, разработанное сообществом энтузиастов ответвление MySQL, получило широкое распространение в качестве альтернативы MySQL и используемой по умолчанию системы управления базами данных при использовании стека LEMP на серверах CentOS. MariaDB представляет собой упрощенную замену оригинального сервера MySQL, что на практике означает, что вы можете переключаться на MariaDB без необходимости внесения каких-либо изменений в конфигурацию или код вашего приложения.

В этом руководстве вы установите стек LEMP на сервер с CentOS 8. Хотя MySQL доступен в используемых по умолчанию репозиториях в CentOS 8, в этом руководстве мы рассмотрим процесс настройки стека LEMP с MariaDB в качестве системы управления базами данных.

Предварительные требования

Для выполнения этого обучающего руководства вам потребуется доступ к серверу CentOS 8, пользователь без прав root с привилегиями sudo и и активный брандмауэр, установленный на сервере. Чтобы выполнить настройку, воспользуйтесь руководством по начальной настройке сервера CentOS 8.

Шаг 1 — Установка веб-сервера Nginx

Для демонстрации веб-страниц посетителям нашего сайта мы будем использовать современный и эффективный веб-сервер Nginx. Мы будем использовать диспетчер пакетов dnf, который является новым диспетчером пакетов, используемым в CentOS 8 по умолчанию, для установки этого программного обеспечения.

Установите пакет nginx с помощью следующей команды:

  • sudo dnf install nginx

При получении запроса введите y для подтверждения того, что вы хотите установить nginx.

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

  • sudo systemctl start nginx

Если вы активировали брандмауэр firewalld в соответствии с руководством по начальной настройке сервера, вам нужно будет разрешить подключение к Nginx. Следующая команда будет постоянно активировать подключения по HTTP, запущенные на порту 80 по умолчанию:

  • sudo firewall-cmd --permanent --add-service=http

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

  • sudo firewall-cmd --permanent --list-all

Вывод будет выглядеть следующим образом:

Outputpublic   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-адресу или доменному имени сервера из вашего веб-браузера.

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

Если у вас нет доменного имени, указывающего на ваш сервер, и вы не знаете публичный IP-адрес вашего сервера, вы можете найти его, введя следующую команду:

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

Команда выведет несколько IP-адресов. Вы можете попробовать каждый из них в своем браузере.

Также вы можете проверить доступность IP-адреса из других мест в интернете:

  • curl -4 icanhazip.com

Введите полученный адрес в браузере, после чего вы попадете на страницу Nginx по умолчанию:

Страница Nginx по умолчанию в CentOS 8

Если вы увидите эту страницу, это значит, что ваш веб-сервер установлен корректно.

Шаг 2 — Установка MariaDB

Теперь, когда у вас есть рабочий и запущенный веб-сервер, вам нужно установить систему управления базы данных, которая может хранить данные вашего сайта и управлять ими. Мы установим MariaDB, разработанную энтузиастами версию оригинального сервера MySQL от Oracle.

Для установки данного ПО запустите следующую команду:

  • sudo dnf install mariadb-server

После завершения установки активируйте и запустите сервер MariaDB с помощью следующей команды:

  • sudo systemctl start mariadb

Чтобы повысить уровень безопасности вашего сервера базы данных, рекомендуется запустить скрипт безопасности, который устанавливается в комплекте с MariaDB. Этот скрипт будет удалять некоторые небезопасные настройки по умолчанию и блокировать доступ к системе управления базы данных. Для запуска интерактивного скрипта введите следующую команду:

  • sudo mysql_secure_installation

После запуска откроется серия диалогов, с помощью которых вы можете внести некоторые изменения в вашу настройку MariaDB. В первом диалоге вам нужно будет ввести пароль пользователя root для текущей базы данных. Не нужно путать его с системным root пользователем. Root пользователь базы данных — это пользователь с правами администратора, который имеет все права для работы с системой базы данных. Поскольку вы только что установили MariaDB и еще не меняли параметры конфигурации, пароль будет пустым, так что вам достаточно нажать ENTER в этом диалоге.

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

Далее вы можете использовать клавиши Y и ENTER, чтобы принять ответы по умолчанию для всех последующих вопросов. В результате вы удалите ряд анонимных пользователей и тестовую базу данных, отключите возможность удаленного входа пользователя root и загрузите новые правила, чтобы внесенные изменения немедленно активировались на сервере.

После выполнения указанных выше действий выполните вход в консоль MariaDB с помощью следующей команды:

  • sudo mysql

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

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

Обратите внимание, что вам не потребуется предоставлять пароль для подключения в качестве пользователя root. Это работает, поскольку используемый по умолчанию метод аутентификации для пользователя MariaDB с правами администратора — unix_socket, а не пароль. Хотя это может выглядеть как возможный источник проблем с безопасностью, на самом деле эти действия делают сервер базы данных более защищенным, поскольку единственные пользователи, которые могут выполнять вход в систему с правами доступа root для MariaDB, — это пользователи системы с привилегиями sudo, подключенные с использованием консоли или через приложение, использующее аналогичные привилегии. На практике это означает, что вы не сможете использовать root пользователя базы данных с правами администратора для подключения из вашего приложения 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;

Результат будет выглядеть следующим образом:

Output+--------------------+ | Database           | +--------------------+ | example_database   | | information_schema | +--------------------+ 2 rows in set (0.000 sec) 

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

  • exit

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

Шаг 3 — Установка PHP-FPM

Вы установили Nginx для обслуживания вашего контента и MariaDB для хранения и управления данными. Теперь вы можете установить PHP для обработки кода и генерации динамического контента для веб-сервера.

Хотя Apache встраивает интерпретатор PHP в каждый запрос, Nginx требуется внешняя программа для обработки PHP и организации моста между самим интерпретатором PHP и веб-сервером. Это позволяет обеспечить более высокую производительность на большинстве веб-сайтов на базе PHP, но для этого необходимо выполнить дополнительную настройку. Вы должны установить php-fpm, т.е. “менеджер процессов PHP fastCGI”, и указать Nginx на необходимость передачи запросов PHP данному программному обеспечению. Также вам потребуется php-mysqlnd, модуль PHP, который позволяет PHP взаимодействовать с базами данных MySQL. Ключевые PHP пакеты автоматически будут установлены в качестве зависимостей.

Для установки пакетов php-fpm и php-mysql воспользуйтесь следующей командой:

  • sudo dnf install php-fpm php-mysqlnd

После завершения установки вам потребуется изменить файл /etc/php-fpm.d/www.conf, чтобы задать несколько параметров.

Предоставляемый с CentOS 8 по умолчанию текстовый редактор — vi. vi очень мощный текстовый редактор, но освоить работу с ним неопытным пользователям достаточно сложно. Вы можете установить более удобный для пользователя редактор, например, nano, для облегчения редактирования файлов конфигурации на сервере CentOS 8:

  • sudo dnf install nano

Теперь откройте файл конфигурации /etc/php-fpm.d/www.conf с помощью nano или другого выбранного вами редактора:

  • sudo nano /etc/php-fpm.d/www.conf

Найдите директивы user и group. Если вы используете nano, вы можете нажать CTRL+W для поиска этих терминов в открытом файле.

/etc/php-fpm.d/www.conf

… ; 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 … 

Вы можете заметить, что для переменных user и group задано значение apache. Нам нужно изменить значения на nginx:

/etc/php-fpm.d/www.conf

… ; 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 … 

Сохраните и закройте файл после завершения редактирования. Если вы используете nano, нажмите CTRL + X, а затем нажмите Y и ENTER.

Чтобы активировать и запустить службу php-fpm, запустите следующую команду:

  • sudo systemctl start php-fpm

Перезапустите веб-сервер Nginx, чтобы он смог использовать файлы конфигурации, созданные при установке php-fpm:

  • sudo systemctl restart nginx

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

Шаг 4 — Тестирование PHP с помощью Nginx

В CentOS 8 при установке php-fpm по умолчанию автоматически создаются файлы конфигурации, которые позволят вашему веб-серверу Nginx обрабатывать файлы .php в корневой директории документов по умолчанию, расположенной в /usr/share/nginx/html. Вам не потребуется вносить какие-либо изменения в конфигурацию Nginx для обеспечения корректной работы PHP на вашем веб-сервере.

Единственное изменение, которое мы будем вносить, — это изменение параметров разрешений по умолчанию в корневой папке документов Nginx. Так вы сможете создавать и изменять файлы в данной папке, используя обычного системного пользователя без необходимости добавлять к каждой команде sudo.

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

  • sudo chown -R sammy.sammy /usr/share/nginx/html/

Теперь мы создадим тестовую страницу PHP, чтобы убедиться, что веб-сервер работает ожидаемым образом.

Создайте новый файл PHP с именем info.php в директории /usr/share/nginx/html:

  • nano /usr/share/nginx/html/info.php

Следующий код PHP будет отображать информацию о текущей среде PHP, которая запущена на сервере:

/usr/share/nginx/html/info.php

<?php  phpinfo(); 

После завершения редактирования сохраните и закройте файл.

Теперь мы можем проверить, может ли наш веб-сервер корректно отображать содержимое, созданное скриптом PHP. Перейдите в браузер и вставьте в адресную строку имя хоста вашего сервера или его IP-адрес, добавив /info.php:

http://server_host_or_IP/info.php 

Вы увидите приблизительно следующую страницу:

Отображаемая по умолчанию страница с данными PHP в CentOS 8

После проверки соответствующей информации о вашем сервере PHP с помощью данной страницы, рекомендуется удалить созданный вами файл, поскольку он содержит чувствительную информацию о вашей среде PHP и о вашем сервере CentOS. Вы можете использовать rm для удаления этого файла:

  • rm /usr/share/nginx/html/info.php

При необходимости вы всегда сможете восстановить этот файл. Далее мы протестируем подключение к базе данных со стороны 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;

Результат будет выглядеть следующим образом:

Output+---------+--------------------------+ | 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:

  • nano /usr/share/nginx/html/todo_list.php

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

/usr/share/nginx/html/todo_list.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-адрес и добавив /todo_list.php:

http://server_host_or_IP/todo_list.php 

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

Пример списка дел PHP

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

Заключение

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