Индивидуальные настройки 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. Необходимо перенести их в конфигурацию пула.
Расширенные примеры конфигурации для доменов
Пример 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 возникает ошибка)