Вопрос или проблема
Я настроил PHP
и Apache
так, чтобы для каждого пользователя в многохостинговой системе создавался отдельный пул PHP-FPM
.
Веб-панель работает в своем собственном пуле с различными правами.
Веб-панель Администратора
<VirtualHost *:80>
# КОНФИГУРАЦИЯ
Define DOMAIN my.fruit
Define SOCKET /run/php/panel.sock
Define ROOT /etc/fruithost/panel/
# НЕ ИЗМЕНЯТЬ
ServerAdmin support@${DOMAIN}
DocumentRoot ${ROOT}
ServerName ${DOMAIN}
ErrorLog "/var/fruithost/logs/panel_error.log"
CustomLog "/var/fruithost/logs/panel_access.log" combined
CustomLog "/var/fruithost/logs/panel_bandwidth.log" common
# Безопасность
<IfModule mpm_itk_module>
AssignUserId www-data www-data
</IfModule>
# Режим отладки
#ProxyErrorOverride Off
#ServerSignature On
#LogLevel debug
<IfModule headers>
Header set X-Frame-Options: "SAMEORIGIN"
</IfModule>
<IfModule mod_alias.c>
# Определить страницы ошибок
Alias /errors/100.html /etc/fruithost/placeholder/errors/100.html
Alias /errors/101.html /etc/fruithost/placeholder/errors/101.html
Alias /errors/401.html /etc/fruithost/placeholder/errors/401.html
Alias /errors/403.html /etc/fruithost/placeholder/errors/403.html
Alias /errors/404.html /etc/fruithost/placeholder/errors/404.html
Alias /errors/405.html /etc/fruithost/placeholder/errors/405.html
Alias /errors/408.html /etc/fruithost/placeholder/errors/408.html
Alias /errors/410.html /etc/fruithost/placeholder/errors/410.html
Alias /errors/411.html /etc/fruithost/placeholder/errors/411.html
Alias /errors/412.html /etc/fruithost/placeholder/errors/412.html
Alias /errors/413.html /etc/fruithost/placeholder/errors/413.html
Alias /errors/414.html /etc/fruithost/placeholder/errors/414.html
Alias /errors/415.html /etc/fruithost/placeholder/errors/415.html
Alias /errors/500.html /etc/fruithost/placeholder/errors/500.html
Alias /errors/501.html /etc/fruithost/placeholder/errors/501.html
Alias /errors/502.html /etc/fruithost/placeholder/errors/502.html
Alias /errors/503.html /etc/fruithost/placeholder/errors/503.html
Alias /errors/504.html /etc/fruithost/placeholder/errors/504.html
Alias /errors/505.html /etc/fruithost/placeholder/errors/505.html
Alias /errors/506.html /etc/fruithost/placeholder/errors/506.html
# Определить URL модулей
Alias /app /etc/fruithost/modules
# Определить URL темы
Alias /theme /etc/fruithost/themes
</IfModule>
# PHP-FPM
<IfModule !mod_php8.c>
<IfModule proxy_fcgi_module>
# Перенаправить заголовок авторизации
<IfModule setenvif_module>
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
</IfModule>
# Определить прокси
<Proxy "unix:${SOCKET}|fcgi://panel">
ProxySet disablereuse=on
</Proxy>
# Когда будут посещены .php-файлы
<FilesMatch "\.php$">
# Удалить старые обработчики (если есть)
RemoveHandler .php
ProxyFCGIBackendType FPM
ProxyFCGISetEnvIf "true" DOCUMENT_ROOT "%{reqenv:DOCUMENT_ROOT}"
ProxyFCGISetEnvIf "true" CONTEXT_DOCUMENT_ROOT "%{reqenv:DOCUMENT_ROOT}"
ProxyFCGISetEnvIf "true" PATH_INFO "%{PATH_INFO}"
ProxyFCGISetEnvIf "true" PATH_TRANSLATED "%{reqenv:DOCUMENT_ROOT}%{reqenv:PATH_INFO}%{reqenv:SCRIPT_NAME}"
#ProxyFCGISetEnvIf "true" REQUEST_URI "${REQUEST_URI}"
ProxyFCGISetEnvIf "true" SCRIPT_NAME "%{reqenv:SCRIPT_NAME}"
ProxyFCGISetEnvIf "true" SCRIPT_FILENAME "%{reqenv:SCRIPT_FILENAME}"
SetHandler proxy:fcgi://panel
</FilesMatch>
# Статус отладки
<LocationMatch "/fh-panel-status">
ProxyPass "unix:${SOCKET}|fcgi://panel/fh-panel-status"
</LocationMatch>
</IfModule>
</IfModule>
# Доступность
<Directory /etc/fruithost/panel>
Options +FollowSymLinks -Indexes +IncludesNoExec
AllowOverride All
Require all granted
</Directory>
<Directory /etc/fruithost/themes>
Options +FollowSymLinks -Indexes +IncludesNoExec
AllowOverride All
Require all granted
</Directory>
<Directory /etc/fruithost/modules>
Options +FollowSymLinks -Indexes +IncludesNoExec
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
[panel]
user = www-data
group = www-data
listen = /run/php/$pool.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0770
listen.allowed_clients = 127.0.0.1
process.dumpable = yes
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.status_path = /fh-panel-status
slowlog = /var/fruithost/logs/$pool_slow.log
request_slowlog_timeout = 1m
;request_slowlog_trace_depth = 20
decorate_workers_output = yes
catch_workers_output = yes
php_flag[display_errors] = on
php_admin_value[error_log] = /var/fruithost/logs/php_error.log
php_admin_flag[log_errors] = on
Проблема в чем?
Все конфигурации пользователей/доменных всегда имеют одну и ту же схему.
Когда я перезапускаю службу PHP-FPM
, все отображается корректно, когда я вызываю домен (информация PHP в порядке, и ограничения openbasedir также используются правильно).
Однако, когда я теперь вызываю веб-панель (my.fruit
), Apache
выбирает пул PHP-FPM
panel
так, как указано в конфигурации. После попытки вызвать домен (например, example.com
) Apache
больше не использует определенный PHP-FPM
пул, а использует пул панели и, следовательно, больше не имеет никаких записей openbasedir.
Что я делаю неправильно?
Почему внезапно используется другой пул PHP-FPM?
Ответ или решение
Проблема, с которой вы столкнулись, связана с тем, что Apache не использует правильные PHP-FPM
пула в зависимости от запрашиваемого домена. При этом для вашего веб-панели на my.fruit
настроен отдельный пул panel
, в то время как для других доменов он должен использовать разные пулы, но вместо этого используется пул panel
.
Возможные причины проблемы:
-
Конфигурация виртуальных хостов: Убедитесь, что конфигурации виртуальных хостов Apache корректно загружаются и не пересекаются. Если конфигурации загружаются неправильно, это может привести к тому, что Apache будет использовать неправильные параметры.
-
Проблемы с кэшированием: Если у вас включено кэширование на уровне Apache, возможно, что кэшированные данные могут давать неправильный ответ. Попробуйте очистить кэш и перезапустить службу Apache.
-
Проблемы с проксированием в конфигурации: В вашем случае необходимо удостовериться, что прокси настроен корректно, и Apache действительно находит соответствующий сокет для каждого пула
PHP-FPM
. -
Очередь запросов к сокету: В случае, если сокеты создаются с одинаковыми именами или с одинаковыми правами доступа, может возникнуть конфликт. Убедитесь, что для каждого пользователя у вас создаётся уникальный сокет и они могут использоваться независимо.
Решение:
- Проверьте правила проксирования в конфигурации:
Убедитесь, что в блоке<FilesMatch>
для.php
файлов у вас правильно указано использование соответствующего пула. Например, обращение в блоке<FilesMatch>
для каждого виртуального хоста должно быть уникальным.
<FilesMatch "\.php$">
RemoveHandler .php
SetHandler proxy:fcgi://user-admin # для пользовательского пула
# или
SetHandler proxy:fcgi://panel # для панельного пула
</FilesMatch>
-
Проверьте логирование Apache:
Логи ошибок могут подсказать, почему используется неправильный пул. Убедитесь, что ведется логирование ошибок, и проверьте все лог-файлы на наличие подсказок. -
Проверьте разрешения на сокеты:
Убедитесь, что все сокеты создаются с правильными разрешениями. Например, у вас должно быть разрешение0660
на сокеты, чтобы нужные процессы могли к ним обращаться. -
Перезапустите службы:
После внесения изменений перезапустите какApache
, так иPHP-FPM
. Это гарантирует, что все новые конфигурации вступят в силу. -
Отладка:
Если проблема не устранена, добавьте отладочный вывод в вашу конфигурацию, чтобы отслеживать, какой сокет пытается использовать Apache для обработки PHP. Это можно сделать временным изменением уровня логирования.
Заключение:
Хотя это достаточно сложная конфигурация, проблему можно устранить, проверив различные конфигурации, логи и разрешения. Убедившись, что каждый виртуальный хост использует свой собственный пул PHP-FPM
и сокеты настроены правильно, можно добиться желаемого поведения. Если после выполнения всех вышеописанных рекомендаций проблема останется нерешенной, возможно, потребуется более глубокий анализ конфигурации сервера и логов.