Установка и настройка стека LAMP (Linux, Apache, MariaDB, PHP)

Стек LAMP, представляющий собой комплексное решение, состоящее из операционной системы Linux, веб-сервера Apache, системы управления базами данных MariaDB/MySQL и языка сценариев PHP, остается ключевым фундаментом для подавляющего большинства веб-приложений и систем управления контентом (CMS). Его популярность обусловлена зрелостью компонентов, обширной документацией и надежностью, что делает его предпочтительным выбором для таких платформ, как WordPress и Drupal, а также современных PHP-фреймворков, включая Laravel и Symfony.  

Однако классическая методика установки LAMP, часто встречающаяся в устаревших руководствах, не отвечает строгим требованиям к производительности и безопасности, актуальным на сегодняшний день. Актуальность требует обязательного перехода на последние стабильные версии ПО, внедрения передовых методов оптимизации (таких как OPcache и JIT) и, что наиболее важно, применения современных протоколов безопасности (HTTPS, HSTS).  



Содержание

Что включает в себя современный стек LAMP?

В актуальной конфигурации каждый компонент стека имеет специфические требования к версии и настройке.

КомпонентРольАктуальная ВерсияКлючевая Особенность
L (Linux)Операционная системаПоследние LTS версииИспользование sudo и дифференцированный подход к пакетным менеджерам (apt / dnf).
A (Apache)Веб-сервер HTTPApache 2.4.xПереход на Event MPM для улучшения масштабируемости.  
M (MariaDB)Система управления БДMariaDB 11.x+Приоритет над MySQL за счет GPL-лицензии и оптимизации.  
P (PHP)Язык сценариевPHP 8.4.8Обязательная настройка OPcache и JIT-компиляции.  

Подготовка системы и фундаментальная безопасность

Успешное развертывание LAMP начинается с надлежащей подготовки базовой операционной системы и обеспечения базового уровня безопасности.

Подготовка и обновление системы

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

Debian/Ubuntu (APT):

Bash
sudo apt update && sudo apt upgrade -y

RHEL/CentOS/Fedora (DNF):

Bash
sudo dnf update -y

Фундаментальный харденинг SSH

Хотя веб-сервер является основной целью настройки LAMP, первичная точка входа для администратора — служба SSH. Безопасность сервера начинается с защиты этого канала. Распространенной ошибкой является концентрация внимания только на веб-службах, игнорирование наиболее прямого пути к компрометации — слабых паролей или прямого доступа пользователя  root

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

  • Отключение прямого входа root по SSH. Вместо этого администратор должен входить под обычным пользователем, а затем использовать команду sudo для выполнения привилегированных задач. Это не только ограничивает потенциальную атаку, но и обеспечивает логирование административных действий.  
  • Использование аутентификации по ключам. Следует полностью отказаться от входа по паролю в пользу SSH-ключей. Это значительно повышает стойкость к брутфорсу и является отраслевым стандартом безопасности.  
  • Установка Fail2Ban. Это программное обеспечение автоматически сканирует логи и блокирует IP-адреса, демонстрирующие подозрительную активность, например, многочисленные неудачные попытки входа по SSH или HTTP.

Настройка фаервола

На сервере необходимо принимать входящие соединения только по абсолютно необходимым портам: 22 (SSH), 80 (HTTP) и 443 (HTTPS). Использование встроенных фаерволов (UFW или Firewalld) позволяет создать этот минимальный барьер защиты.

Ubuntu/Debian (UFW):

Bash
sudo ufw allow OpenSSH
sudo ufw allow 'Apache Full'
sudo ufw enable

RHEL/CentOS (Firewalld):

Bash
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

Установка веб-сервера Apache 2.4+ и оптимизация MPM

Веб-сервер Apache HTTP Server (версия 2.4+) является краеугольным камнем стека, известным своей надежностью и богатым набором функций, включая поддержку IPv6, HTTP/2 и динамически загружаемые модули.  

Инсталляция Apache

При установке Apache важно учитывать различия в именовании пакетов и служб между семействами дистрибутивов. Debian-подобные системы используют название apache2, тогда как RHEL-подобные системы используют название httpd.  

Debian/Ubuntu (APT):

Bash
sudo apt install apache2 -y
sudo systemctl enable --now apache2

RHEL/CentOS (DNF):

Bash
sudo dnf install httpd -y
sudo systemctl enable --now httpd

Проверка статуса службы:

Debian/Ubuntu:

Bash
sudo systemctl status apache2

RHEL/CentOS:

Bash
sudo systemctl status httpd

Настройка модуля многопроцессной обработки (MPM)

Ключевым шагом в модернизации Apache является отказ от устаревшего модуля prefork в пользу Event MPM. Модуль Event (ставший полностью поддерживаемым и неэкспериментальным в Apache 2.4) использует гибрид потоков и процессов.  

MPM Event значительно более эффективен, чем prefork, поскольку он позволяет Apache обрабатывать более 10 000 одновременных соединений при минимальном потреблении памяти, что является критически важным для высокомасштабируемых систем. Кроме того, Event MPM идеально интегрируется с современной архитектурой обработки PHP через PHP-FPM (FastCGI Process Manager), что является рекомендуемой практикой для повышения производительности PHP.  

Действия (Ubuntu/Debian):

Bash
# Отключение
prefork: $ sudo a2dismod mpm_prefork
# Включение
event: $ sudo a2enmod mpm_event

Активация критических модулей

Для обеспечения полного функционала современного веб-приложения необходимо включить ряд ключевых модулей Apache:

  • mod_rewrite: Незаменим для создания ЧПУ (человеко-понятных URL) и обеспечения работы большинства CMS и фреймворков.
  • mod_headers: Требуется для установки критически важных заголовков безопасности, таких как HSTS, Content Security Policy (CSP) и X-Frame-Options.  
  • mod_ssl: Необходим для работы с HTTPS и шифрования TLS.
  • mod_proxy_fcgi: Обязателен, если используется рекомендованный Event MPM в сочетании с PHP-FPM.

После включения модулей ($ sudo a2enmod <имя_модуля> в APT-системах) требуется перезапуск Apache: $ sudo systemctl restart apache2.


Установка и защита базы данных MariaDB

Исторически стек LAMP использовал MySQL. Однако в современных практиках MariaDB, являющаяся полностью открытым форком MySQL, часто выбирается в качестве предпочтительной СУБД.  

Выбор MariaDB и установка

MariaDB поддерживается активным сообществом, полностью лицензирована под GPL и предлагает преимущества в скорости и масштабируемости, особенно в части репликации и управления пулом потоков (Thread Pooling) по сравнению с MySQL Enterprise Edition.  

Установка MariaDB Server:

APT:

Bash
sudo apt install mariadb-server -y

DNF:

Bash
sudo dnf install mariadb-server -y

Запуск и активация службы:

Bash
sudo systemctl enable --now mariadb

Обязательная первоначальная защита MariaDB

Свежеустановленная СУБД по умолчанию имеет настройки, которые делают ее уязвимой, включая возможность анонимного доступа и удаленного входа root. Скрипт mysql_secure_installation является критически важным для устранения этих начальных рисков.  

В MariaDB скрипт mysql_secure_installation является универсальным и выполняет все необходимые функции, будучи символической ссылкой на mariadb-secure-installation.  

Bash
sudo mysql_secure_installation

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

  • Установка или изменение пароля для учетной записи root.
  • Удаление анонимных учетных записей.
  • Запрет удаленного входа для root (что крайне важно, если база данных и веб-сервер находятся на одном хосте).
  • Удаление тестовой базы данных.

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


Актуализация PHP: репозитории и модули

Для обеспечения максимальной производительности и использования современных возможностей, таких как JIT-компиляция, необходимо установить последнюю стабильную версию PHP, которая на момент написания статьи составляет PHP 8.4.8. Стандартные LTS-репозитории (например, Ubuntu 22.04) поставляют более старые версии (например, PHP 8.1), что делает их непригодными для современного развертывания.  

Добавление актуальных епозиториев

Чтобы получить доступ к PHP 8.4, администраторам приходится использовать надежные сторонние репозитории, такие как PPA от Ondrej Sury для Debian/Ubuntu или Remi Repository для RHEL/CentOS.

 Ubuntu/Debian (APT):

Bash
sudo add-apt-repository ppa:ondrej/php
sudo apt update

RHEL/CentOS (DNF):

Bash
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-<версия_ОС>.rpm
sudo dnf module reset php

Замените <версия_ОС> на мажорную версию вашего дистрибутива. Например, для CentOS Stream 9 это будет:

Bash
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm

Установка PHP и критических модулей

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

APT (Ubuntu/Debian):

Bash
sudo apt install php8.4 php8.4-cli php8.4-mysql php8.4-mbstring php8.4-xml php8.4-curl php8.4-zip php8.4-opcache libapache2-mod-php -y

DNF (RHEL/CentOS):

Bash
sudo dnf module install php:remi-8.4 -y $ sudo dnf install php-cli php-mysqlnd php-mbstring php-xml php-curl php-zip php-opcache php-fpm -y

Ключевые модули, такие как php-opcache, php-mbstring (для UTF-8 и локализации) и php-curl (для внешних HTTP-запросов), являются основой для большинства современных PHP-приложений.  

Интеграция PHP с Apache: стандарт PHP-FPM

Традиционный подход с использованием mod_php прост, но имеет ограничения по производительности и изоляции процессов. В современных высоконагруженных системах стандартной практикой является использование PHP-FPM (FastCGI Process Manager).  

PHP-FPM работает как отдельная служба, обрабатывающая запросы PHP, и обеспечивает лучшую стабильность и изоляцию процессов. Эта архитектура позволяет Apache использовать более эффективный Event MPM, что приводит к значительному повышению масштабируемости сервера.

Для использования PHP-FPM необходимо:

  • Запустить службу FPM: $ sudo systemctl enable --now php8.4-fpm (название службы зависит от версии PHP).
  • Настроить Apache Virtual Host на проксирование запросов .php к сокету FPM, используя модуль mod_proxy_fcgi, который был активирован ранее.

Оптимизация PHP 8.4: OPcache и JIT

Настройка производительности PHP — это то, что отличает базовую установку от профессиональной. Оптимизация фокусируется на механизмах кэширования байт-кода и JIT-компиляции, присущих PHP 8.x.

Критическая оптимизация: настройка OPcache

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

Конфигурация OPcache осуществляется в файле php.ini (например, в секции [opcache]):

ДирективаРекомендованное ЗначениеЗначимость
opcache.enable1Обязательное включение.  
opcache.memory_consumption512 или вышеМинимальный рекомендуемый объем для большинства приложений. Для крупных CMS (например, Adobe Commerce) требуются значения до 2048 MB (2 GB).  
opcache.max_accelerated_files10000Увеличенный лимит для больших проектов, содержащих тысячи файлов.  
opcache.revalidate_freq0 (Prod) или 60 (Dev)В режиме Production (0) файлы не перепроверяются, что максимизирует скорость, но требует ручной очистки кэша после развертывания.

JIT-компиляция: максимизация скорости

PHP 8.x включает JIT (Just-In-Time) компиляцию, которая компилирует часто используемые части PHP-кода в нативный машинный код. Это обеспечивает существенный прирост производительности, особенно для ресурсоемких, процессорозависимых задач.

Рекомендуется использовать режим трассировки JIT (Tracing JIT), который обеспечивает наилучший баланс между производительностью и надежностью :  

INI
opcache.jit=tracing

Харденинг и управление ресурсами PHP

  • Лимит Памяти (memory_limit): Настройки по умолчанию (часто 128M ) недостаточны для современных PHP-фреймворков. Рекомендуется установить более высокий лимит, например:  
INI
memory_limit = 512M
  • Скрытие версии PHP: Для снижения поверхности атаки, следует отключить отображение информации о версии PHP в HTTP-заголовках:
INI
expose_php = Off
  • Отключение Опасных Функций: В производственной среде необходимо отключить функции, которые позволяют PHP-скриптам выполнять системные команды, предотвращая потенциальные уязвимости удаленного выполнения кода (RCE):
INI
disable_functions = exec, passthru, shell_exec, system, proc_open, popen

После завершения всех настроек в php.ini, необходимо перезапустить веб-сервер и/или PHP-FPM для применения изменений:

Bash
sudo systemctl restart apache2 
#и/или
sudo systemctl restart php8.4-fpm

Конфигурация виртуального хоста и верификация

Создание продуктивного виртуального хоста (VHost)

Вместо использования конфигурации по умолчанию, которая часто является небезопасной и неоптимизированной, следует создать выделенный файл виртуального хоста для домена (например, yourdomain.com).

Для Debian/Ubuntu VHost создается в каталоге /etc/apache2/sites-available/.

Apache
<VirtualHost *:80>
    ServerAdmin admin@yourdomain.com
    ServerName yourdomain.com
    ServerAlias www.yourdomain.com

    DocumentRoot /var/www/yourdomain.com/public_html/

    # Логирование
    ErrorLog ${APACHE_LOG_DIR}/yourdomain.com_error.log
    CustomLog ${APACHE_LOG_DIR}/yourdomain.com_access.log combined

    # Настройка директории: разрешение.htaccess (AllowOverride All)
    <Directory /var/www/yourdomain.com/public_html>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    # Если используется PHP-FPM, необходимо добавить проксирование:
    # <FilesMatch \.php$>
    #     SetHandler "proxy:unix:/var/run/php/php8.4-fpm.sock|fcgi://localhost/"
    # </FilesMatch>
</VirtualHost>

Активация и проверка синтаксиса

Активация хоста (APT):

Bash
sudo a2ensite yourdomain.com.conf

Проверка синтаксиса:

Перед перезапуском сервера необходимо проверить конфигурационные файлы Apache на наличие ошибок. Это позволяет избежать простоя в случае синтаксических неточностей.

Bash
sudo apachectl -t
#Ожидаемый вывод: Syntax OK

Перезапуск Apache:

Bash
sudo systemctl restart apache2

Комплексная верификация стека с phpinfo()

Для окончательной проверки функциональности всех компонентов (Apache, PHP, MariaDB) и, самое главное, подтверждения работы оптимизаций, используется тестовый файл phpinfo.php.

  • Создание файла:
Bash
sudo nano /var/www/yourdomain.com/public_html/phpinfo.php
  • Код:
PHP
<?php phpinfo();?>
  • Доступ: http://ВашIPили_Домен/phpinfo.php

Верификация OPcache и JIT:

Одного лишь отображения версии PHP 8.4 недостаточно. Администратор должен прокрутить страницу phpinfo() и найти секцию OPcache. Необходимо подтвердить, что статус OPcache указан как «Up and running» , и что соответствующие настройки памяти и JIT-компиляции применены. Это является прямым доказательством того, что сервер работает в режиме высокой производительности.  


Пост-установочный харденинг: HTTPS и заголовки безопасности

Для производственного развертывания обязательным стандартом является использование HTTPS. Это требует установки SSL/TLS сертификатов и настройки заголовков, принуждающих браузеры использовать безопасное соединение.

Внедрение HTTPS с Certbot и Let’s Encrypt

Certbot — это наиболее распространенный и рекомендуемый инструмент для автоматического получения бесплатных сертификатов от Let’s Encrypt. Он упрощает процесс установки и настройки, а также автоматизирует продление сертификатов.  

Установка Certbot: Требуется установка клиента Certbot и модуля для интеграции с Apache:

Bash
 sudo apt install certbot python3-certbot-apache

Получение и установка сертификата: Certbot автоматически анализирует существующую конфигурацию VHost (порт 80) и создает новую защищенную конфигурацию (порт 443).

Bash
sudo certbot --apache -d yourdomain.com -d www.yourdomain.com

Certbot также автоматически настраивает редирект с HTTP на HTTPS, обеспечивая, что весь трафик будет защищен.  

Заголовки безопасности: защита браузера и HSTS

После установки HTTPS необходимо принудительно диктовать браузеру правила безопасности, используя модуль mod_headers. Наиболее критичным является заголовок Strict-Transport-Security (HSTS).

HSTS предписывает браузеру, что для данного домена всегда должно использоваться только HTTPS-соединение в течение указанного времени (max-age). Это предотвращает атаки, пытающиеся принудительно понизить протокол до HTTP (SSL stripping).  

Рекомендуемые заголовки безопасности, добавляемые в SSL Virtual Host (yourdomain.com-le-ssl.conf):

Apache
<IfModule mod_headers.c>
    # 1. Принудительное HTTPS (HSTS)
    # 31536000 секунд = 1 год. includeSubDomains - включает поддомены
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"

    # 2. Защита от Clickjacking
    Header always set X-Frame-Options "SAMEORIGIN"

    # 3. Защита от MIME-Sniffing
    Header always set X-Content-Type-Options "nosniff"

    # 4. Content Security Policy (Базовый уровень)
    # CSP предотвращает XSS-атаки и инъекции данных
    Header always set Content-Security-Policy "default-src 'self';"
</IfModule>

После внесения изменений необходимо снова перезапустить Apache:

Bash
sudo systemctl restart apache2

Заключение

В этой статье продемонстрировали установку, оптимизацию и харденинг современного стека LAMP, используя актуальные компоненты, включая PHP 8.4.8, Apache Event MPM и MariaDB.

Внедрение передовых практик, таких как использование PHP-FPM, настройка OPcache и JIT-компиляции, а также обязательное применение HTTPS с HSTS и другими заголовками безопасности, гарантирует, что развернутая платформа не только функциональна, но и соответствует требованиям к высокой производительности и безопасности для современных веб-приложений.

Этот комплексный, оптимизированный и защищенный фундамент является идеальной отправной точкой для разработки или развертывания масштабируемых CMS и фреймворков.


Читайте также

Было ли это полезно?

1 / 0

Добавить комментарий 0