Русский (Russian)

Установка стека LEMP на Linux VPS с AlmaLinux 9

2 min
VPS/VDS-хостинг

Стек LEMP (Linux, Nginx, MariaDB, PHP-FPM) — быстрая и лёгкая альтернатива Apache для PHP-сайтов. В AlmaLinux 9 всё ставится из официального репозитория AppStream, но SELinux и firewalld требуют внимания. Это руководство проведёт вас через чистую установку на ваш VPS Linux Infrawire; те же шаги работают и в Rocky Linux 9.

📋 Требования

  • KVM VPS с AlmaLinux 9 (IP-адрес и пароль root указаны в вашем личном кабинете)
  • SSH-доступ под root
  • Домен example.com, указывающий на VPS_IP

1. Обновление системы и установка утилит

Bash
dnf -y update dnf -y install nano policycoreutils-python-utils

Пакет policycoreutils-python-utils содержит semanage, который понадобится в разделе про SELinux.

2. Установка Nginx и открытие файрвола

Bash
dnf -y install nginx systemctl enable --now nginx firewall-cmd --permanent --add-service=http --add-service=https firewall-cmd --reload firewall-cmd --list-services

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

Bash
dnf -y install mariadb-server systemctl enable --now mariadb mysql_secure_installation

Ответьте на вопросы мастера: задайте пароль root, удалите анонимных пользователей, запретите удалённый вход root и удалите тестовую базу. Затем создайте базу данных и отдельного пользователя:

Bash
mysql -u root -p
SQL
1CREATE DATABASE appdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 2CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'STRONG_PASSWORD'; 3GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'localhost'; 4FLUSH PRIVILEGES; 5EXIT;

4. Установка PHP 8.3 из модуля AppStream

AppStream предлагает несколько потоков PHP. Перед установкой выберите нужный:

Bash
dnf module list php dnf -y module reset php dnf -y module enable php:8.3 dnf -y install php-fpm php-cli php-mysqlnd php-gd php-mbstring php-xml php-intl php-opcache php-pecl-zip php -v

По умолчанию пул PHP-FPM работает от пользователя apache. Поскольку Nginx работает от nginx, приведите пул и каталоги сессий в соответствие:

Bash
sed -i 's/^user = apache/user = nginx/; s/^group = apache/group = nginx/' /etc/php-fpm.d/www.conf chown -R root:nginx /var/lib/php/session /var/lib/php/wsdlcache /var/lib/php/opcache grep -E '^(user|group|listen)' /etc/php-fpm.d/www.conf systemctl enable --now php-fpm

Пул слушает Unix-сокет /run/php-fpm/www.sock.

5. Создание server block

Bash
mkdir -p /var/www/example.com/public chown -R nginx:nginx /var/www/example.com nano /etc/nginx/conf.d/example.com.conf
Nginx
1server { 2 listen 80; 3 listen [::]:80; 4 server_name example.com www.example.com; 5 root /var/www/example.com/public; 6 index index.php index.html; 7 8 location / { 9 try_files $uri $uri/ /index.php?$query_string; 10 } 11 12 location ~ \.php$ { 13 include fastcgi_params; 14 fastcgi_pass unix:/run/php-fpm/www.sock; 15 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 16 } 17 18 location ~ /\.(?!well-known) { 19 deny all; 20 } 21}
Bash
nginx -t && systemctl reload nginx

6. Настройка SELinux

Оставьте SELinux в режиме enforcing (getenforce). Файлы, созданные в /var/www, уже получают метку httpd_sys_content_t, но файлы, перемещённые командой mv из другого места, сохраняют старую. Переразметьте их и давайте право записи только тем каталогам, которым оно нужно:

Bash
restorecon -Rv /var/www/example.com mkdir -p /var/www/example.com/public/uploads semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/example.com/public/uploads(/.*)?' restorecon -Rv /var/www/example.com/public/uploads

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

Bash
# PHP подключается к базе по TCP (удалённый сервер или 127.0.0.1) setsebool -P httpd_can_network_connect_db 1 # PHP или Nginx устанавливают исходящие соединения (API, proxy_pass к приложению) setsebool -P httpd_can_network_connect 1

Локальной MariaDB, доступной через сокет, ни один из них не нужен. Чтобы увидеть, что блокирует SELinux, выполните ausearch -m avc -ts recent. Никогда не «решайте» проблему командой setenforce 0.

7. Проверка PHP и удаление тестового файла

Bash
echo '<?php phpinfo();' > /var/www/example.com/public/info.php curl -sI http://example.com/info.php | head -n 1 rm /var/www/example.com/public/info.php

Ожидайте HTTP/1.1 200 OK. Страница phpinfo() раскрывает вашу конфигурацию, поэтому сразу удалите её. Напоследок проверьте службы:

Bash
systemctl is-active nginx php-fpm mariadb

🛠️ Решение проблем

502 Bad Gateway. PHP-FPM остановлен или путь к сокету в fastcgi_pass указан неверно. Выполните systemctl status php-fpm, проверьте ls -l /run/php-fpm/www.sock и прочитайте /var/log/nginx/error.log. Если в журнале Permission denied на сокете, поищите отказ AVC через ausearch.

403 Forbidden или Permission denied. Проверьте владельца (nginx:nginx) и метку SELinux командой ls -Z /var/www/example.com/public. Должно быть httpd_sys_content_t; если нет, выполните restorecon -Rv.

«File not found.» или пустая страница. Неверен путь root или строка SCRIPT_FILENAME. Проверьте обе, затем nginx -t.

Нет соединения с внешней базой или API. SELinux по умолчанию блокирует исходящие соединения: включите httpd_can_network_connect_db или httpd_can_network_connect, как показано выше.


🎉 Nginx, MariaDB и PHP-FPM работают на AlmaLinux 9, а SELinux остаётся в режиме enforcing.

Следите за последними предложениями, скидками и специальными акциями.

Смотреть акции

Мы используем файлы cookie

Аналитические cookie улучшают работу сайта. Данные не продаются третьим лицам. Подробнее в политике конфиденциальности.