Руководство по объединению Apache и PHP в Linux-среде

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

Настройка Apache и PHP: от модуля до PHP-FPM

Как организовать изолированную и производительную обработку PHP-скриптов с помощью Apache?

Наиболее эффективным решением является использование PHP-FPM (FastCGI Process Manager) в связке с Apache через модуль mod_proxy_fcgi. Этот подход позволяет отделить процессы PHP от веб-сервера, повышает безопасность и упрощает масштабирование.

Установка необходимых пакетов (на примере Debian/Ubuntu):

sudo apt update
sudo apt install apache2 php php-fpm libapache2-mod-fcgid

Linux apache php (настройка apache и php в linux)

После установки включаем необходимые модули Apache:

sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php8.2-fpm  # или версия вашего PHP

Php fpm linux (настройка php-fpm в linux)

Настраиваем виртуальный хост, чтобы PHP-файлы обрабатывались через сокет PHP-FPM. Пример конфигурации для сайта (файл /etc/apache2/sites-available/example.conf):

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/example

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

Linux версия php (проверка версии php в linux)

Перезагружаем Apache и проверяем работу:

sudo systemctl reload apache2
echo '<?php phpinfo();' | sudo tee /var/www/example/index.php

Linux установить php (установка php в linux)

Открыв браузером http://example.com/index.php, можно увидеть информацию о PHP.

Типичная ошибка: страница не обрабатывается, а предлагается скачать PHP-файл. Причина: не включен модуль proxy_fcgi или неверно указан путь к сокету. Решение: проверить команду sudo a2enmod proxy_fcgi и убедиться, что сокет существует (ls /run/php/).

Также может возникнуть ошибка 502 Bad Gateway при недоступности PHP-FPM. Проверяется статус службы: sudo systemctl status php8.2-fpm.

Цель использования: изоляция PHP-процессов, возможность запуска разных версий PHP для разных сайтов, улучшенное управление ресурсами через пулы FPM.

Как установить PHP как модуль Apache (mod_php) для простых проектов?

Этот способ подходит, когда требуется минимальная настройка и нет необходимости в изоляции. PHP встраивается непосредственно в процесс Apache.

Установка:

sudo apt install apache2 php libapache2-mod-php

Php mysql linux (установка php и mysql в linux)

Модуль mod_php активируется автоматически. После перезапуска Apache PHP-файлы начнут обрабатываться.

sudo systemctl restart apache2

Alt linux php (установка php на alt linux)

Создаем тестовый файл:

echo '<?php phpinfo();' | sudo tee /var/www/html/index.php

Php oracle linux (установка php на oracle linux)

Открываем http://localhost/index.php.

Проблема: Если после установки PHP не выполняется, возможно, не включен модуль. Проверяем: sudo a2enmod php8.2 (или php7.4).

Также может возникать конфликт с другими модулями, например, mod_fcgid. В этом случае отключаем ненужные: sudo a2dismod fcgid.

Когда использовать: простые сайты, окружения разработки, где безопасность не критична.

Как собрать PHP из исходников, чтобы получить кастомную конфигурацию?

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

Шаги сборки:

Установка зависимостей (Debian/Ubuntu):

sudo apt install build-essential autoconf libtool libxml2-dev libssl-dev libcurl4-openssl-dev pkg-config

Скачивание исходного кода PHP:

wget https://www.php.net/distributions/php-8.2.12.tar.gz
tar -xzf php-8.2.12.tar.gz
cd php-8.2.12

Настройка с нужными опциями. Пример с базовыми расширениями:

./configure --prefix=/usr/local/php8.2 --with-apxs2=/usr/bin/apxs2 --with-mysqli --with-pdo-mysql --with-curl --enable-mbstring --with-openssl

Сборка и установка:

make -j$(nproc)
sudo make install

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

Пример строки в apache2.conf:

LoadModule php8_module /usr/local/php8.2/libexec/libphp.so

Затем добавить обработчик для .php файлов.

Типичные ошибки: отсутствие библиотек приводит к ошибкам configure. Например, configure: error: xml2-config not found - необходимо установить libxml2-dev. Также может потребоваться переустановка apxs2.

После установки может возникнуть конфликт с системным PHP. Рекомендуется использовать префикс, отличный от /usr, и управлять приоритетом через переменные PATH или виртуальные хосты.

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

Расширенные примеры настройки Apache и PHP

Пример 1. Детальная конфигурация пула PHP-FPM

Файл /etc/php/8.2/fpm/pool.d/www.conf (основной пул). Параметры управления процессами:

Пример
; Настройка пула www
[www]
user = www-data
group = www-data
listen = /run/php/php8.2-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
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 можно посмотреть количество дочерних процессов:

ps aux | grep php-fpm
root       ... php-fpm: master process (/etc/php/8.2/fpm/php-fpm.conf)
www-data   ... php-fpm: pool www
www-data   ... php-fpm: pool www
www-data   ... php-fpm: pool www

Пример 2. Настройка Apache для использования разных версий PHP на одном сервере

Предположим, установлены PHP 7.4 (mod_php) и PHP 8.2 (FPM). В виртуальном хосте для legacy-сайта используем mod_php:

Пример
<VirtualHost *:80>
    ServerName old-site.example.com
    DocumentRoot /var/www/old
    <FilesMatch \.php$>
        SetHandler application/x-httpd-php
    </FilesMatch>
</VirtualHost>

Для нового сайта используем PHP-FPM 8.2:

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

Результат: оба сайта работают с разными версиями PHP, проверяется через phpinfo().

Пример 3. Сборка PHP с расширенным набором опций

Команда configure с дополнительными расширениями:

Пример
./configure \
    --prefix=/usr/local/php8.2 \
    --with-apxs2=/usr/bin/apxs2 \
    --with-mysqli=mysqlnd \
    --with-pdo-mysql=mysqlnd \
    --with-curl \
    --with-openssl \
    --enable-mbstring \
    --enable-zip \
    --enable-bcmath \
    --with-mhash \
    --with-xsl \
    --with-gd \
    --with-freetype-dir=/usr/include/freetype2 \
    --with-jpeg-dir=/usr/include \
    --with-png-dir=/usr/include \
    --enable-intl \
    --with-zlib

Результат успешной сборки:

Build complete.
Don't forget to run 'make test'.

После установки проверяем расширения:

Пример
/usr/local/php8.2/bin/php -m
[PHP Modules]
bcmath
Core
ctype
curl
date
dom
fileinfo
filter
gd
hash
iconv
intl
json
libxml
mbstring
mysqli
mysqlnd
openssl
pcre
PDO
pdo_mysql
Phar
posix
readline
Reflection
session
SimpleXML
spl
standard
tokenizer
xml
xmlreader
xmlwriter
xsl
zip
zlib

[Zend Modules]

Пример 4. Обработка ошибок с помощью пользовательской страницы в Apache и PHP

В конфигурации виртуального хоста добавляем директиву ErrorDocument для PHP-ошибок:

Пример
ErrorDocument 503 /error/503.html
ErrorDocument 500 /error/500.html

В файле .htaccess или конфигурации <Directory> настраиваем обработку ошибок PHP:

Пример
php_value error_reporting E_ALL & ~E_DEPRECATED & ~E_STRICT
php_flag display_errors Off
php_flag log_errors On
php_value error_log /var/log/php_errors.log

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

Пример 5. Использование mod_rewrite для красивых URL с PHP

Включение модуля и базовое правило:

Пример
sudo a2enmod rewrite

В конфигурации виртуального хоста:

Пример
<Directory /var/www/example>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php [QSA,L]
</Directory>

Результат: все запросы к несуществующим файлам направляются на index.php.

Настройка Apache и PHP в Linux - comments

En
Linux apache php (php)