Ошибка: Apache2 с PHP-FPM выбирает неправильный пул

Вопрос или проблема

Я настроил 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.

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

  1. Конфигурация виртуальных хостов: Убедитесь, что конфигурации виртуальных хостов Apache корректно загружаются и не пересекаются. Если конфигурации загружаются неправильно, это может привести к тому, что Apache будет использовать неправильные параметры.

  2. Проблемы с кэшированием: Если у вас включено кэширование на уровне Apache, возможно, что кэшированные данные могут давать неправильный ответ. Попробуйте очистить кэш и перезапустить службу Apache.

  3. Проблемы с проксированием в конфигурации: В вашем случае необходимо удостовериться, что прокси настроен корректно, и Apache действительно находит соответствующий сокет для каждого пула PHP-FPM.

  4. Очередь запросов к сокету: В случае, если сокеты создаются с одинаковыми именами или с одинаковыми правами доступа, может возникнуть конфликт. Убедитесь, что для каждого пользователя у вас создаётся уникальный сокет и они могут использоваться независимо.

Решение:

  1. Проверьте правила проксирования в конфигурации:
    Убедитесь, что в блоке <FilesMatch> для .php файлов у вас правильно указано использование соответствующего пула. Например, обращение в блоке <FilesMatch> для каждого виртуального хоста должно быть уникальным.
<FilesMatch "\.php$">
    RemoveHandler       .php
    SetHandler proxy:fcgi://user-admin  # для пользовательского пула
    # или
    SetHandler proxy:fcgi://panel  # для панельного пула
</FilesMatch>
  1. Проверьте логирование Apache:
    Логи ошибок могут подсказать, почему используется неправильный пул. Убедитесь, что ведется логирование ошибок, и проверьте все лог-файлы на наличие подсказок.

  2. Проверьте разрешения на сокеты:
    Убедитесь, что все сокеты создаются с правильными разрешениями. Например, у вас должно быть разрешение 0660 на сокеты, чтобы нужные процессы могли к ним обращаться.

  3. Перезапустите службы:
    После внесения изменений перезапустите как Apache, так и PHP-FPM. Это гарантирует, что все новые конфигурации вступят в силу.

  4. Отладка:
    Если проблема не устранена, добавьте отладочный вывод в вашу конфигурацию, чтобы отслеживать, какой сокет пытается использовать Apache для обработки PHP. Это можно сделать временным изменением уровня логирования.

Заключение:

Хотя это достаточно сложная конфигурация, проблему можно устранить, проверив различные конфигурации, логи и разрешения. Убедившись, что каждый виртуальный хост использует свой собственный пул PHP-FPM и сокеты настроены правильно, можно добиться желаемого поведения. Если после выполнения всех вышеописанных рекомендаций проблема останется нерешенной, возможно, потребуется более глубокий анализ конфигурации сервера и логов.

Оцените материал
Добавить комментарий

Капча загружается...