Индивидуальные настройки PHP для разных доменов на одном сервере

Раздел: Администрирование PHP -> Конфигурация и настройка PHP

Способы настройки PHP для каждого домена

Как сделать изоляцию настроек PHP для разных сайтов на одном сервере?

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

Для создания пула в файле /etc/php/8.1/fpm/pool.d/example.com.conf:


[example.com]
user = example
 group = example
 listen = /run/php/php8.1-fpm-example.sock
 listen.owner = www-data
 listen.group = www-data
 pm = dynamic
 pm.max_children = 10
 pm.start_servers = 2
 pm.min_spare_servers = 1
 pm.max_spare_servers = 5
 php_admin_value[memory_limit] = 256M
 php_admin_value[upload_max_filesize] = 100M
 php_admin_value[post_max_size] = 110M
 php_admin_value[max_execution_time] = 60
 php_admin_flag[display_errors] = off
  

Moodle config php (php: конфигурация moodle (config.php))

Пояснение шагов: задаются пользователь и группа для процессов пула, сокет для взаимодействия с веб‑сервером, настройки менеджера процессов (pm) и директивы php_admin_value или php_admin_flag, которые переопределяют любые пользовательские настройки PHP.

После изменения конфигурации требуется перезапуск PHP-FPM: systemctl restart php8.1-fpm.

Типичные проблемы: пул не запускается из‑за синтаксической ошибки в конфигурации (проверка командой php-fpm8.1 --test); неверные права на сокет (ошибка 502 Bad Gateway); значения php_admin_value не применяются, если пул использует другой режим безопасности. Решение - внимательная сверка синтаксиса и назначение корректных прав для пользователя веб‑сервера.

Как изменить параметры PHP без доступа к основному php.ini?

Вариант с .user.ini - подходит для shared‑хостинга, где разрешена переопределение директив через файлы в корне сайта. Создаётся файл .user.ini в корневой директории домена.


; /home/example/public_html/.user.ini
memory_limit = 128M
upload_max_filesize = 50M
post_max_size = 55M
max_execution_time = 30
display_errors = Off
  

Phpmyadmin config inc php (php: конфигурация phpmyadmin (config.inc.php))

Ограничения: работают не все директивы (только из категории PHP_INI_PERDIR), требуется поддержка в PHP (режим user_ini.filename). Изменения применяются не мгновенно, а при перезагрузке PHP‑процессов.

Ошибка: директива не сработала - часто из‑за того, что сервер запретил переопределение. Проверить можно через phpinfo() в секции Local Value. Если значение осталось глобальным, значит, директива заблокирована Admin Value.

Как настроить PHP через .htaccess при использовании mod_php или suPHP?

Вариант с .htaccess применим для Apache, работающего с mod_php (реже с suPHP). В файл .htaccess в корне домена добавляются директивы php_value, php_flag, php_admin_value, php_admin_flag.


# /home/example/public_html/.htaccess
php_value upload_max_filesize 64M
php_value post_max_size 70M
php_flag display_errors on
php_admin_value memory_limit 256M
  

Config config php домен (php: настройка конфигурации для домена)

Пояснение: php_value и php_flag могут быть переопределены в более глубоких каталогах; php_admin_* - только в контексте VirtualHost и блокируют последующие изменения.

Ошибка 500 Internal Server Error - возникает, если директива не поддерживается в контексте .htaccess (например, php_admin_value запрещена в .htaccess) или синтаксис неверен. Решение: перенос директив в конфигурацию VirtualHost или использование файла конфигурации Apache.

Как передать переменные окружения в PHP скрипт для домена?

Вариант через SetEnvIf в Apache или fastcgi_param в Nginx. Данные становятся доступны через $_SERVER или getenv().

Пример для Nginx + PHP-FPM:


location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.1-fpm-example.sock;
    fastcgi_param PHP_VALUE "memory_limit = 128M\nmax_execution_time = 60";
    fastcgi_param SITE_ENVIRONMENT "production";
}
  

Wp admin config php (php: конфигурация wordpress (wp-admin/config.php))

Пояснение: PHP_VALUE позволяет передать несколько директив PHP, разделённых переводом строки. SITE_ENVIRONMENT - пользовательская переменная окружения.

Ошибка переменная не видна - возможно, передаётся после включения основного блока fastcgi_params, который сбрасывает ранее заданные параметры. Рекомендуется указывать fastcgi_param после include fastcgi_params;.

Как использовать php_value в конфигурации VirtualHost Apache?

При прямом доступе к конфигурации сервера (VPS, выделенный сервер) можно задать настройки для каждого домена внутри блока <VirtualHost>.


<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/example/public
    <FilesMatch \.php$>
        SetHandler "proxy:unix:/run/php/php8.1-fpm-example.sock|fcgi://localhost"
    </FilesMatch>
    php_admin_value memory_limit 512M
    php_admin_flag display_errors Off
    php_value upload_max_filesize 200M
</VirtualHost>
  

Для работы с php_admin_* требуется установка модуля mod_php или использование прокси‑обработчика. При использовании PHP-FPM директивы php_value в VirtualHost обычно игнорируются - настройки задаются в пуле.

Путаница: значения из VirtualHost не применяются, если сайт обрабатывается через PHP-FPM. Необходимо перенести их в конфигурацию пула.

- Php config connect (php: настройка подключения к базе данных в config)
- Define config php (php: определение констант через define в конфигурации)

Расширенные примеры конфигурации для доменов

Пример 1. Несколько независимых пулов PHP-FPM для разных доменов с разными пользователями.

Пример

# /etc/php/8.1/fpm/pool.d/site1.conf
[site1]
user = site1user
group = site1user
listen = /run/php/php8.1-fpm-site1.sock
pm = ondemand
pm.max_children = 5
pm.process_idle_timeout = 10s
php_admin_value[memory_limit] = 256M

# /etc/php/8.1/fpm/pool.d/site2.conf
[site2]
user = site2user
group = site2user
listen = /run/php/php8.1-fpm-site2.sock
pm = static
pm.max_children = 3
php_admin_value[memory_limit] = 512M
php_admin_value[max_input_vars] = 2000

Результат: каждый сайт изолирован, имеет свой рабочий процесс и лимиты. Проверить можно через phpinfo() - в секции PHP Variables будут отображаться значения, заданные в пуле.

memory_limit => 256M (для site1)
memory_limit => 512M (для site2)

Пример 2. Файл .user.ini с нестандартными настройками.

Пример

; /home/user/public_html/.user.ini
memory_limit = 64M
max_execution_time = 90
post_max_size = 50M
upload_max_filesize = 20M
error_reporting = E_ALL & ~E_DEPRECATED
date.timezone = "Europe/Moscow"
session.gc_maxlifetime = 1440

Результат: при обращении к скрипту в этом каталоге и его подкаталогах применяются указанные значения.

(Вывод phpinfo() показывает Local Value = 64M для memory_limit, 90 для max_execution_time и т.д.)

Пример 3. .htaccess с комбинацией php_flag и php_value для отладки.

Пример

# .htaccess
php_flag display_errors on
php_flag log_errors on
php_value error_log /home/user/logs/php_errors.log
php_value memory_limit 128M
php_value max_input_vars 3000

Результат: все ошибки выводятся на экран и записываются в указанный файл, увеличена память и количество входных переменных.

(При выполнении скрипта с ошибкой она отображается, а в файле /home/user/logs/php_errors.log появляется запись)

Пример 4. Настройка Nginx с передачей индивидуальных параметров через fastcgi_param.

Пример

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

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.1-fpm-example.sock;
        fastcgi_param PHP_VALUE "upload_max_filesize = 100M\npost_max_size = 110M\nmax_execution_time = 120";
        fastcgi_param PHP_ADMIN_VALUE "memory_limit = 512M";
    }
}

Результат: для этого домена PHP получает увеличенные лимиты на загрузку файлов и время выполнения, а также 512 МБ памяти.

(phpinfo() показывает upload_max_filesize = 100M, post_max_size = 110M, memory_limit = 512M)

Пример 5. Использование директивы php_admin_value в VirtualHost Apache с mod_php (не рекомендуется, но встречается).

Пример

<VirtualHost *:80>
    ServerName oldsite.local
    DocumentRoot /var/www/oldsite
    <Directory /var/www/oldsite>
        php_admin_value open_basedir /var/www/oldsite:/tmp
        php_admin_flag safe_mode off
        php_value allow_url_fopen 0
    </Directory>
</VirtualHost>

Результат: ограничение корневой директории для PHP, отключение удалённого открытия файлов.

(При попытке fopen() за пределами /var/www/oldsite или /tmp возникает ошибка)

PHP: настройка конфигурации для домена - comments

En
Config config php домен (php)