Настройка PHP интерпретатора под Astra Linux
Установка и конфигурирование 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 с веб-сервером выполняется:
или временное отключение SELinux (не рекомендуется).sudo setsebool -P httpd_execmem 1 - Ошибка 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