Настройка PHP интерпретатора под Astra Linux

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

Установка и конфигурирование PHP на операционной системе Astra Linux

Наиболее эффективным способом развертывания PHP в Astra Linux является установка из официального репозитория с использованием менеджера пакетов apt. Данный метод обеспечивает автоматическое разрешение зависимостей, простоту обновления и совместимость с системными библиотеками. Рекомендуется использовать связку PHP-FPM и веб-сервера Nginx для достижения высокой производительности и гибкости конфигурации.

Как установить PHP-FPM и настроить его для работы с Nginx на Astra Linux?

sudo apt update
sudo apt install php-fpm nginx

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

sudo systemctl status php*-fpm

Имя службы зависит от установленной версии, например php7.4-fpm или php8.1-fpm. Состояние службы должно быть активным.

Далее требуется настроить блок сервера Nginx для передачи запросов к PHP-FPM. Пример конфигурации для сайта, расположенного в /var/www/site:

server {
    listen 80;
    server_name example.com;
    root /var/www/site;

    index index.php index.html;

    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

После изменения конфигурации необходимо перезагрузить Nginx:

sudo systemctl reload nginx

Типичные проблемы и их решения

  • Ошибка подключения к сокету PHP-FPM. Путь к сокету в конфигурации Nginx и в пуле PHP-FPM (файл /etc/php/*/fpm/pool.d/www.conf) должен совпадать.
  • Проблемы с SELinux. В Astra Linux может быть включен мандатный контроль доступа. Для разрешения работы PHP-FPM с веб-сервером выполняется:
    sudo setsebool -P httpd_execmem 1
    или временное отключение SELinux (не рекомендуется).
  • Ошибка 502 Bad Gateway. Следует убедиться, что PHP-FPM запущен и слушает на указанном сокете или порту. Проверка логов: /var/log/php*-fpm.log.

Вариант 1: Установка PHP как модуля Apache (mod_php)

Цель: использование PHP непосредственно внутри веб-сервера Apache без дополнительного проксирования. Случай: уже развернут Apache, требуется минимальная конфигурация.

sudo apt install php libapache2-mod-php
sudo systemctl restart apache2

Для проверки работы создается файл info.php с <?php phpinfo(); ?> и обращением к нему через браузер.

Проблемы:

  • Потребление памяти выше, чем при использовании FPM, так как модуль работает в каждом процессе Apache.
  • Активация модуля может потребовать включения mpm_prefork, так как mod_php не совместим с mpm_event или mpm_worker. Установка mpm_prefork:
    sudo a2dismod mpm_event
    sudo a2enmod mpm_prefork
    sudo systemctl restart apache2

Вариант 2: Сборка PHP из исходного кода

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

sudo apt install build-essential libxml2-dev libsqlite3-dev libcurl4-openssl-dev libssl-dev
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-config-file-path=/usr/local/php8.2/etc --with-curl --with-openssl --enable-mbstring --enable-fpm
make -j$(nproc)
sudo make install

После установки необходимо скопировать конфигурационные файлы и настроить службу:

sudo cp php.ini-production /usr/local/php8.2/etc/php.ini
sudo cp sapi/fpm/php-fpm.conf /usr/local/php8.2/etc/php-fpm.conf
sudo cp /usr/local/php8.2/etc/php-fpm.d/www.conf.default /usr/local/php8.2/etc/php-fpm.d/www.conf
sudo /usr/local/php8.2/sbin/php-fpm

Частые ошибки:

  • Отсутствие зависимостей. При configure могут выводиться ошибки о нехватке библиотек. Установка недостающих пакетов через apt.
  • Конфликт с системной версией PHP. При конфигурации указывается другой префикс, чтобы не затирать системные файлы.
  • Не запускается FPM. Проверка путей в php-fpm.conf, особенно опций listen и user/group.

Вариант 3: Запуск PHP в контейнере Docker

Цель: изолировать среду PHP, упростить развертывание на разных версиях OC и обеспечить повторяемость. Случай: микросервисная архитектура, необходимо быстро переключаться между версиями PHP.

sudo apt install docker.io
sudo systemctl start docker
sudo docker pull php:8.2-fpm
sudo docker run -d --name php82 -v /var/www/site:/var/www/html -p 9000:9000 php:8.2-fpm

Для связи с Nginx на хосте применяется сеть Docker или проброс порта. В конфигурации Nginx указывается fastcgi_pass 127.0.0.1:9000; вместо unix-сокета.

Возможные сложности:

  • Права доступа к файлам. Пользователь в контейнере (www-data) может не совпадать с владельцем файлов на хосте. Используется опция --user или настройка правильных прав.
  • Сетевое взаимодействие. Контейнер должен быть доступен по сети (localhost или IP). При использовании Docker по умолчанию порты пробрасываются на 127.0.0.1.
  • Персистентность данных. Сессии и логи хранятся внутри контейнера; для сохранения используются volumes.

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

Настройка множественных пулов PHP-FPM

Для разделения ресурсов между разными сайтами или пользователями создаются отдельные пулы. Пример конфигурации пула для site1:

Пример
# /etc/php/8.1/fpm/pool.d/site1.conf
[site1]
user = site1
group = site1
listen = /run/php/php8.1-site1.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
security.limit_extensions = .php .phar

php_admin_value[open_basedir] = /var/www/site1
php_admin_value[session.save_path] = /var/www/site1/sessions
# Проверка загрузки пула:
systemctl status php8.1-fpm
# В выводе присутствует информация о пуле site1.

PHP-FPM через TCP-сокет

Если использование unix-сокета невозможно (например, при разделении служб на разные хосты), PHP-FPM настраивается на прослушивание TCP-порта. Конфигурация пула www.conf:

Пример
[www]
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
; остальные параметры остаются без изменений
# После перезапуска службы:
netstat -tlnp | grep php
# Результат: tcp  0  0 127.0.0.1:9000  0.0.0.0:*  LISTEN  1234/php-fpm: pool

Включение Xdebug для отладки

Расширение Xdebug устанавливается из репозитория или через pecl. Настройка в php.ini:

Пример
zend_extension=xdebug.so
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_host=127.0.0.1
xdebug.client_port=9003
# Проверка активации:
php -v | grep Xdebug
# Вывод: PHP 8.1.12 (cli) (built: ... ) with Xdebug v3.2.0 ...

Сборка PHP с расширением Swoole

Расширение Swoole позволяет создавать асинхронные приложения. Сборка из исходного кода с поддержкой HTTP/2 и OpenSSL:

Пример
sudo apt install libpcre3-dev gcc make autoconf
wget https://pecl.php.net/get/swoole-5.1.0.tgz
tar xzf swoole-5.1.0.tgz
cd swoole-5.1.0
phpize
./configure --enable-openssl --enable-http2
make -j$(nproc)
sudo make install
echo "extension=swoole.so" | sudo tee /etc/php/8.1/cli/conf.d/20-swoole.ini
php -m | grep swoole
# Результат: swoole

Настройка OPcache для повышения производительности

Увеличение размера кэша и количества файлов для ускорения выполнения PHP-скриптов. Рекомендуемые параметры в php.ini:

Пример
opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.revalidate_freq=2
opcache.fast_shutdown=1
# Проверка через phpinfo() или командой:
php -i | grep opcache
# Должна отображаться информация о включенном OPcache.

Использование Redis для хранения сессий PHP

Сессии могут храниться в Redis, что ускоряет доступ и позволяет масштабировать приложение. Установка расширения redis и настройка php.ini:

Пример
sudo apt install php-redis
# или сборка из pecl:
sudo pecl install redis
echo "extension=redis.so" | sudo tee /etc/php/8.1/mods-available/redis.ini
sudo phpenmod redis

# в php.ini:
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379"
# Проверка работы сессий через тестовый скрипт:
<?php
session_start();
$_SESSION['test'] = 'value';
echo session_id();
?>

Настройка PHP CLI для выполнения скриптов под выделенным пользователем

Для автоматизации задач часто требуется запускать PHP-скрипты от имени конкретного системного пользователя. Пример systemd unit:

Пример
# /etc/systemd/system/php-worker.service
[Unit]
Description=PHP Worker Script
After=network.target

[Service]
User=appuser
Group=appuser
ExecStart=/usr/bin/php /opt/worker/script.php
Restart=always

[Install]
WantedBy=multi-user.target
# Запуск и проверка:
sudo systemctl enable --now php-worker
sudo systemctl status php-worker

PHP на Astra Linux - comments

En
Php astra linux (php)