opened image

Как отключить open_basedir в HestiaCP: пошаговая инструкция

 

1. Что такое open_basedir и почему возникает ошибка?

 

Параметр open_basedir ограничивает доступ PHP к определённым директориям. Если скрипт пытается получить доступ к файлу или директории за пределами этих путей, ему будет отказано. Некоторые CMS или плагины требуют полного отключения open_basedir для корректной работы.

Когда появляется ошибка "Please disable the open_basedir setting to continue", это означает, что приложение не может работать из-за включённых ограничений.

 

 

2. Проверка текущей ситуации

 

Прежде чем что-то менять, важно убедиться, какую именно версию PHP использует ваш сайт и действительно ли включён open_basedir.

 

2.1. Узнаём, где PHP берёт свои настройки

 

Создайте в корневой директории вашего сайта example.com файл info.php:

 

echo "<?php phpinfo();" > /home/USER/web/example.com/public_html/info.php

 

Замените на:

  • USER - пользователь в котором создан сайт;
  • example.com - домен вашего сайта.

 

Откройте его в браузере:

 

 

https://example.com/info.php

 

Найдите строку Loaded Configuration File – это путь к основному php.ini, который действительно загружается.

 

 

 

 

2.2. Проверяем значение open_basedir

 

В терминале (SSH) выполните:


 

php -i | grep open_basedir

 


Если в выводе будет что-то вроде:
 

open_basedir => /home/USER/web/example.com/public_html:/tmp


– значит, open_basedir установлен.

 

Если результат будет no value => no valueглобально open_basedir отключён. Однако он может быть задан в конфигурации PHP-FPM для сайта (об этом ниже).

 

 

 

3. Основные способы отключить open_basedir

 

 

3.1. Отключение в глобальном php.ini

 

Если вы выяснили, что сайт использует, например, vim /etc/php/8.2/fpm/php.ini, откройте этот файл:


 

vim /etc/php/8.2/fpm/php.ini

 

 

Найдите строку:

 

open_basedir = ...

 

И замените её на:

 

open_basedir =

 

(пустое значение)

 

Примечание: Если строка закомментирована ;open_basedir =, проверьте, чтобы она содержала пустое значение или была просто откомментирована без пути.

 

 

После сохранения:


 

systemctl restart php8.2-fpm

 

 

Однако в HestiaCP такие глобальные изменения могут не сработать, если open_basedir прописан в файлах пулов pool.d.

 

 

3.2. Отключение в файлах пулов PHP-FPM (/etc/php/X.X/fpm/pool.d/*.conf)

 

HestiaCP создаёт отдельные конфигурационные файлы для каждого домена или пользователя в директории:


 

/etc/php/8.3/fpm/pool.d/

 

или

 

/etc/php/8.2/fpm/pool.d/

 



 

(версия PHP может отличаться)

 

Для домена example.com может существовать файл example.com.conf. В нём часто встречается строка:

 

php_admin_value[open_basedir] = /home/USER/web/example.com/public_html:/tmp

 

 

 

Чтобы полностью отключить open_basedir, откройте этот файл:


 

vim /etc/php/8.3/fpm/pool.d/example.com.conf

 

 

Найдите строку с php_admin_value[open_basedir] и поменяйте её на:


 

php_admin_value[open_basedir] = none

 

Или просто закомментируйте, добавив # в начале:


 

#php_admin_value[open_basedir] = ...

 

Сохраните изменения и перезапустите PHP-FPM:


 

systemctl restart php8.3-fpm

 

 

После этого проверьте сайт заново.

 

Именно этот способ (редактирование в pool.d) чаще всего помогает в HestiaCP, так как панель генерирует свои конфигурационные файлы для каждого домена.

 

 

3.3. Отключение через панель HestiaCP (если доступно)

 

В некоторых версиях HestiaCP предусмотрена команда:


 

v-options-set v_host_open_basedir NO

systemctl restart hestia

 

Она глобально отключает использование open_basedir в шаблонах конфигурации.

 

Если ваша HestiaCP поддерживает эту команду, выполните её и проверьте, не будет ли конфигурация перезаписываться снова.

 

 

3.4. Отключение в шаблонах HestiaCP

 

Иногда HestiaCP автоматически перезаписывает файлы pool.d согласно шаблонам, которые обычно лежат по пути:


 

/usr/local/hestia/data/templates/web/php-fpm/

 

Например, шаблон может называться default.tpl или PHP-XYZ.tpl.

 

Откройте соответствующий шаблон:

 

vim /usr/local/hestia/data/templates/web/php-fpm/default.tpl

 

Найдите строку:

 

php_admin_value[open_basedir] = …

 

Удалите её или закомментируйте:

 

#php_admin_value[open_basedir] = …

 

  1. Сохраните и выйдите.

 

 

Если HestiaCP создаёт новые конфиги на основе этого шаблона, впредь open_basedir не будет автоматически включаться.

 

 

3.5. Использование .user.ini или .htaccess

 

В некоторых случаях (особенно на Apache с модулем PHP-FPM) можно попробовать отключить open_basedir через .user.ini или .htaccess. Но часто это не срабатывает, потому что php_admin_value в pool.d имеет более высокий приоритет, а также open_basedir может быть заблокирован в глобальных настройках.

 

3.5.1. .user.ini


 

; /home/USER/web/example.com/public_html/.user.ini

 

open_basedir =

 

 

3.5.2. .htaccess


 

php_admin_value open_basedir none

 

Если php_admin_value установлено в конфигурации PHP-FPM, эти методы могут быть проигнорированы.

 

 

 

3.6. Защита файла конфигурации от перезаписи (если необходимо)

 

Бывает, что HestiaCP при каждом сохранении настроек в панели заново генерирует файл pool.d/*.conf. Тогда можно воспользоваться атрибутом chattr в Linux, чтобы сделать файл неизменным даже для root (до тех пор, пока атрибут не будет снят).


Сделать файл неизменным:


 

chattr +i /etc/php/7.2/fpm/pool.d/example.com.conf


    Если нужно внести правки, сначала снимите атрибут:


     

    chattr -i /etc/php/7.2/fpm/pool.d/example.com.conf
    
    

     

    После изменений снова установите +i, если хотите продолжать блокировку.

       

      Однако помните, что такой подход может усложнить работу панели управления.

       

       

       

      4. Пример полного решения (метод, который помог в нашем случае)


      Нашли файл пула PHP-FPM для домена:


       

      /etc/php/7.2/fpm/pool.d/example.com.conf
      


        Открыли его в редакторе:
         

        vim /etc/php/7.2/fpm/pool.d/example.com.conf
        


         

          Заменили строку:

           

          php_admin_value[open_basedir] = /home/USER/web/example.com/public_html:/tmp ...


          на
           

          php_admin_value[open_basedir] = none
          


            Сохранили файл и перезапустили PHP-FPM:


             

            systemctl restart php7.2-fpm
            

             

            Проверили работу сайта https://example.com/info.php – ошибка пропала.

             

             

            5. Часто задаваемые вопросы

             

            5.1. Почему в php.ini написано, что open_basedir отключён, а сайт всё равно ругается?

            Ваша глобальная конфигурация может не содержать open_basedir, но HestiaCP добавляет его на уровне файлов pool.d. Приоритет в php-fpm имеет именно файл пула.

             

            5.2. Безопасно ли отключать open_basedir?

            open_basedir – это одна из мер безопасности, ограничивающая работу PHP только в определённых директориях. Если у вас нет жёстких требований к безопасности (например, изоляции разных клиентов на одном сервере), его можно отключить. Однако в продакшен-средах стоит внимательно относиться к отключению этой опции.

             

            5.3. Нужно ли перезапускать HestiaCP?

             

            Иногда да. Если вы меняли шаблоны HestiaCP:


             

            systemctl restart hestia

             

            Но самое главное – перезапустить PHP-FPM:


             

            systemctl restart php8.2-fpm

             

            (или другую версию PHP, которую использует ваш сайт).

             

             

            Вывод

             

            1. Проверьте фактические настройки PHP через phpinfo() и узнайте, какой файл pool.d/*.conf действительно используется вашим доменом.
            2. Измените или удалите директиву php_admin_value[open_basedir], поставив none.
            3. Перезапустите PHP-FPM (при необходимости и HestiaCP).
            4. Если HestiaCP продолжает перезаписывать файл – измените шаблон в /usr/local/hestia/data/templates/web/php-fpm/ или используйте chattr +i.

             

            Чаще всего именно правка pool.d/example.com.conf решает проблему:


             

            php_admin_value[open_basedir] = none

             

             

            После перезапуска PHP-FPM ошибка "Please disable the open_basedir setting to continue" должна исчезнуть, и ваш сайт example.com заработает корректно. Если же панель по-прежнему восстанавливает настройки, обратите внимание на шаблоны PHP-FPM внутри самой HestiaCP и их конфигурации.