Совместная работа Apache 2.4 и PHP 8.2: различные варианты

Раздел: Администрирование серверов -> Настройка веб-сервера

Основные способы настройки Apache 2.4 и PHP 8.2

Как быстро развернуть Apache 2.4 с PHP 8.2 на Debian/Ubuntu?

Установка через репозиторий Sury

Наиболее эффективный способ - использование официального репозитория Sury, содержащего актуальные версии PHP. Выполните следующие команды:

sudo apt update
sudo apt install -y lsb-release ca-certificates curl
sudo curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg
sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
sudo apt update
sudo apt install -y apache2 php8.2 libapache2-mod-php8.2

Mod rewrite index php (настройка mod_rewrite для index.php)

После установки включите модуль rewrite и перезапустите Apache:

sudo a2enmod rewrite
sudo systemctl restart apache2

Upstream php fpm (настройка upstream для php-fpm в nginx)

Проверьте работу, создав файл /var/www/html/info.php с содержимым <?php phpinfo(); ?>.

Возможные проблемы

  • Если страница отображает пустой экран или код PHP, значит модуль PHP не загружен. Проверьте командой apache2ctl -M наличие php8_module.
  • Ошибка 403 Forbidden - проверьте права на каталог /var/www/html и файл info.php.
  • Конфликт портов, если Apache уже использует порт 80. Измените порт в /etc/apache2/ports.conf.

Какие преимущества даёт использование PHP-FPM вместо mod_php?

PHP-FPM позволяет разделить обработку PHP-скриптов и веб-сервера, повышая производительность и безопасность. Установка:

sudo apt install -y php8.2-fpm
sudo a2enmod proxy_fcgi setenvif
sudo systemctl restart apache2

запустить локальный сервер php (запуск локального сервера php)

Настройте виртуальный хост для использования PHP-FPM, добавив директиву:

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/example
    <Directory /var/www/example>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
    <FilesMatch \.php$>
        SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost"
    </FilesMatch>
</VirtualHost>

Php non thread safe (php non-thread-safe (не потокобезопасная версия))

Перезагрузите Apache.

Типичные ошибки

  • Ошибка 502 Bad Gateway - проверьте, запущен ли PHP-FPM и работает ли сокет. Выполните sudo systemctl status php8.2-fpm.
  • Если используется TCP-сокет, укажите правильный порт (по умолчанию 9000).

Как установить PHP 8.2 из исходного кода для нестандартной конфигурации?

Сборка из исходников даёт полный контроль над опциями компиляции. Загрузите исходный код с php.net, распакуйте и выполните:

./configure --with-apxs2=/usr/bin/apxs --with-mysqli --with-pdo-mysql --enable-mbstring --with-openssl --with-zlib
make
sudo make install

Rewritecond request filename php (правило rewritecond для php в .htaccess)

После установки отредактируйте php.ini, который обычно находится в /usr/local/lib/php.ini. Подключите модуль к Apache, добавив строку LoadModule php8_module /usr/lib/apache2/modules/libphp8.2.so в конфигурацию.

Проблемы при сборке

  • Отсутствие библиотек (libxml2, libssl) - установите зависимости: sudo apt install -y libxml2-dev libssl-dev.
  • Ошибка "apxs not found" - установите apache2-dev.

Как использовать Docker для изолированного стека Apache и PHP 8.2?

Docker упрощает развёртывание и обеспечивает повторяемость окружения. Пример Dockerfile:

FROM php:8.2-apache
COPY . /var/www/html/
RUN a2enmod rewrite

Соберите образ: docker build -t my-php-app .. Запустите контейнер: docker run -d -p 8080:80 my-php-app.

Возможные ошибки

  • При изменении кода в контейнере данные не сохраняются - используйте тома (-v ./html:/var/www/html).
  • Нет доступа к базе данных - свяжите контейнеры через docker-compose.
- Var www html index php (размещение index.php в var/www/html)
- веб серверы php (веб-серверы для php)

Расширенные примеры конфигурации

Ниже приведены подробные примеры для различных сценариев использования Apache 2.4 и PHP 8.2.

Пример 1: Настройка виртуального хоста с PHP-FPM и SSL

Пример
<VirtualHost *:443>
    ServerName secure.example.com
    DocumentRoot /var/www/secure
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/example.crt
    SSLCertificateKeyFile /etc/ssl/private/example.key
    <Directory /var/www/secure>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
    <FilesMatch \.php$>
        SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost"
    </FilesMatch>
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Результат: при обращении к https://secure.example.com запросы к .php-файлам передаются в PHP-FPM через Unix-сокет.

Пример 2: Настройка пула PHP-FPM с ограничением ресурсов

В файле /etc/php/8.2/fpm/pool.d/www.conf задайте параметры:

Пример
[www]
user = www-data
group = www-data
listen = /run/php/php8.2-fpm.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 10
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 5
pm.max_requests = 500

Перезапустите PHP-FPM: sudo systemctl restart php8.2-fpm.

Пример 3: Использование .htaccess для перезаписи URL

В корневой директории сайта создайте файл .htaccess:

Пример
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

Этот код перенаправляет все запросы, не соответствующие реальным файлам/папкам, на index.php, что часто используется для CMS.

Пример 4: Настройка кеширования через OPcache

В php.ini или отдельном файле в /etc/php/8.2/apache2/conf.d/ добавьте:

Пример
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=2

Проверьте статус OPcache через phpinfo().

Пример 5: Параллельная работа PHP 8.2 и PHP 7.4 через разные пулы

Установите две версии PHP-FPM. Настройте второй пул на прослушивание другого сокета. В конфигурации Apache укажите разные виртуальные хосты с разными прокси:

Пример
<VirtualHost *:80>
    ServerName old.example.com
    <FilesMatch \.php$>
        SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
    </FilesMatch>
    ...
</VirtualHost>
<VirtualHost *:80>
    ServerName new.example.com
    <FilesMatch \.php$>
        SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost"
    </FilesMatch>
    ...
</VirtualHost>

Пример 6: Отладка с помощью phpinfo и error_log

Создайте файл test.php:

Пример
<?php
phpinfo(INFO_ALL);
?>

Результат (сокращённый):

PHP Version 8.2.10
System  Linux server 5.15.0 ...
Loaded Configuration File /etc/php/8.2/apache2/php.ini
...

Для включения логирования ошибок PHP в Apache, добавьте в php.ini:

Пример
error_reporting = E_ALL
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log

Настройка Apache 2.4 с PHP 8.2 - comments

En
Apache 2.4 php 8.2 (php)