Установка и настройка LEMP стек — NGINX, MariaDB, PHP на CentOS Stream 9.

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

Для начала убедимся, что в процессе установки будут использоваться последние версии программных пакетов:
dnf update -y

Установим PHP и набор основных расширений.

dnf install -y php php-cli php-fpm php-common php-mbstring php-curl php-mysqlnd php-json php-xml php-phar php-pdo php-gd

Проверяем что PHP установился:

[root@waky ~]# php --version
PHP 8.0.30 (cli) (built: Aug  3 2023 17:13:08) ( NTS gcc x86_64 )
Copyright (c) The PHP Group
Zend Engine v4.0.30, Copyright (c) Zend Technologies
with Zend OPcache v8.0.30, Copyright (c), by Zend Technologies

По умолчанию для PHP-FPM заданы пользователь/группа apache, так как мы будем использовать NGINX надо их заменить. Можно вручную отредактировать файл /etc/php-fpm.d/www.conf и в секции Unix user/group of processes:

user = apache
group = apache
заменить на
user = nginx
group = nginx

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

sed -i -e 's/user = apache/user = nginx/' /etc/php-fpm.d/www.conf && sed -i -e 's/group = apache/group = nginx/' /etc/php-fpm.d/www.conf

Так же нужно заменить следующие строки:

;listen.owner = nobody
;listen.group = nobody
;listen.mode = 0660
убрав ‘;‘ чтобы раскоментировать их, и поменять nobody на nginx, должно получится:
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

Можете воспользоваться командой:

sed -i -e 's/;listen.owner = nobody/listen.owner = nginx/' /etc/php-fpm.d/www.conf && sed -i -e 's/;listen.group = nobody/listen.group = nginx/' /etc/php-fpm.d/www.conf && sed -i -e 's/;listen.mode = 0660/listen.mode = 0660/' /etc/php-fpm.d/www.conf

Добавим в автозапуск и запустим PHP-FPM:

[root@waky ~]# systemctl enable --now php-fpm.service
Created symlink /etc/systemd/system/multi-user.target.wants/php-fpm.service → /usr/lib/systemd/system/php-fpm.service.

Теперь установим сервер MariaDB

dnf install -y mariadb-server

проверяем

[root@waky ~]# mariadb --version
mariadb  Ver 15.1 Distrib 10.5.27-MariaDB, for Linux (x86_64) using  EditLine wrapper

Добавим в автозапуск и запустим сервер MariaDB

[root@waky ~]# systemctl enable --now mariadb.service
Created symlink /etc/systemd/system/mysql.service → /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/mysqld.service → /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/multi-user.target.wants/mariadb.service → /usr/lib/systemd/system/mariadb.service.

Проведем первичную настройку сервера MariaDB запустив mariadb-secure-installation. Для того чтобы обезопасить наш сервер базы данных, нам нужно удалить анонимного пользователя, тестовую базу данных и отключить удаленный доступ для пользователя root.

На запрос пароля от пользователя root нажимаем Enter. Это свежая установка и пароля еще не существует. Далее порядок ответов n y (вводим пароль) y y y y:

[root@waky waky.ru]# mariadb-secure-installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.

You already have your root account protected, so you can safely answer 'n'.

Switch to unix_socket authentication [Y/n] n
 ... skipping.

You already have your root account protected, so you can safely answer 'n'.

Change the root password? [Y/n] y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y
 ... Success!

Cleaning up...

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

Thanks for using MariaDB!
[root@waky waky.ru]#

Прежде чем установить NGINX, используем curl (на новом сервере может отсутствовать, для установки выполните dnf install curl) и получим ответ от нашего хоста:

[root@waky ~]# curl -I localhost
curl: (7) Failed to connect to localhost port 80: Connection refused

Ожидаемо мы не смогли подключиться к веб серверу, потому что он не запущен, да и его в принципе еще нет. Настало время установить NGINX:
dnf install -y nginx

Проверяем:

[root@waky ~]# nginx -v
nginx version: nginx/1.20.1

В файл конфигурации /etc/nginx/nginx.conf внутри директивы server добавляем обработку php файлов:

 location ~ \.php$ {
            try_files $uri =404;
            fastcgi_pass unix:/run/php-fpm/www.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }

и добавим директиву:

        index index.php index.html;

Зададим нашей веб директории пользователя и группу nginx:
chown -R nginx:nginx /usr/share/nginx/html/

Добавим в автозапуск и запустим NGINX:

[root@waky ~]# systemctl enable --now nginx.service
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.

Повторим пробу curl:

[root@waky ~]# curl -I localhost
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Tue, 04 Feb 2025 07:13:26 GMT
Content-Type: text/html
Content-Length: 2713881
Last-Modified: Tue, 04 Jun 2024 22:57:12 GMT
Connection: keep-alive
ETag: "665f9bc8-296919"
Accept-Ranges: bytes

Теперь наш веб сервер установлен и работает, а на запрос к хосту мы получили ответ с кодом успешно выполненного запроса: 200

Можно открыть в браузере страницу http://123.123.123.123/ где вместо 123.123.123.123 IP адрес вашего сервера.
Вы получите дефолтную страницу NGINX HTTP Server Test Page.

Если вы получили ошибку Превышено время ожидания ответа от сайта значит ваши запросы к веб серверу блокирует файрвол хоста. Нужно внести изменения в публичную зону файрвола.
vi /etc/firewalld/zones/public.xml

и добавьте две записи для сервисов http и https:
<service name="http"/>
<service name="https"/>

Перезапустите firewall:
firewall-cmd --reload

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