Настройки PHP окружения для веб-проектов на сервере
Варианты конфигурации PHP для хостинга
Как обеспечить максимальную производительность PHP с помощью связки Nginx и PHP-FPM?
Наиболее эффективным речением для современных проектов является использование веб-сервера Nginx в связке с менеджером процессов PHP-FPM. Такая конфигурация позволяет разделить обработку статики и динамики, снизить потребление памяти и обеспечить гибкое управление пулами процессов.
Базовая настройка включает установку PHP-FPM, создание пула для конкретного сайта и настройку серверного блока Nginx.
# Пример конфигурации пула PHP-FPM (пул сайта example.com)
[example.com]
user = www-data
group = www-data
listen = /run/php/php8.1-fpm-example.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
настройка хостинга php (настройка хостинга для php)
# Серверный блок Nginx для example.com
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm-example.sock;
}
location ~ /\.ht {
deny all;
}
}Типичные ошибки и их решение:
- 502 Bad Gateway - чаще всего из-за неработающего сокета PHP-FPM. Проверить статус:
sudo systemctl status php8.1-fpm. Убедиться, что путь к сокету в Nginx совпадает с указанным в пуле. - 504 Gateway Timeout - превышение времени выполнения скрипта. Увеличить параметры
request_terminate_timeoutв пуле PHP-FPM иfastcgi_read_timeoutв Nginx.
Как настроить PHP на shared-хостинге через файлы .htaccess и user.ini?
На общих хостингах (cPanel, ISPmanager) прямой доступ к конфигурации веб-сервера и PHP-FPM отсутствует. Для изменения параметров PHP используются директивы в .htaccess (для Apache) или .user.ini (для PHP-FPM режима).
# .htaccess для увеличения лимитов PHP (если используется mod_php или CGI)
php_value upload_max_filesize 64M
php_value post_max_size 64M
php_value max_execution_time 120
php_value memory_limit 256M# .user.ini (работает в режиме PHP-FPM на shared хостинге)
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 120
memory_limit = 256MПроблемы shared-хостинга:
- Директивы
php_valueмогут быть запрещены провайдером (обычно в режиме CGI/FastCGI). В таком случае нужно использовать.user.iniили обращаться в поддержку. - Не все параметры можно менять (например,
disable_functionsобычно недоступны).
Как настроить PHP на виртуальном сервере с Apache?
Если выбрана связка Apache + PHP, варианты: mod_php (встраиваемый модуль) или FastCGI через mod_proxy_fcgi. Безопаснее и производительнее использовать PHP-FPM через mod_proxy_fcgi.
# Пример настройки виртуального хоста Apache для работы с PHP-FPM
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/example.com/public
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.1-fpm-example.sock|fcgi://localhost"
</FilesMatch>
</VirtualHost>Частая ошибка при Apache + PHP-FPM:
- 500 Internal Server Error - неверный путь к сокету или права доступа. Проверить, что пользователь Apache (обычно www-data) имеет доступ к сокету через
ls -la /run/php/.
Как оптимизировать PHP для высоконагруженных проектов?
Для сайтов с высокой нагрузкой требуется тюнинг OpCache, увеличение числа воркеров PHP-FPM и настройка кэширования на уровне приложения.
# Рекомендуемые параметры php.ini для OpCache
opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=20000
opcache.revalidate_freq=2
opcache.fast_shutdown=1Проблемы с OpCache:
- После обновления файлов кэш не очищается - либо установить
opcache.revalidate_freq=0, либо использовать функциюopcache_reset()в скрипте. - Недостаточно памяти под кэш - увеличить
opcache.memory_consumption.
Расширенные примеры настройки PHP
Полный конфиг пула PHP-FPM для продакшена
[www]
user = www-data
group = www-data
listen = 127.0.0.1:9000
; для unix сокета: listen = /run/php/php8.1-fpm.sock
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 100
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
; логирование
access.log = /var/log/php8.1-fpm.access.log
slowlog = /var/log/php8.1-fpm.slow.log
request_slowlog_timeout = 10s
; лимиты
request_terminate_timeout = 120s
; ограничения на выполнение
php_admin_value[memory_limit] = 256M
php_admin_value[max_execution_time] = 120
php_admin_value[upload_max_filesize] = 64MРезультат:
После применения пул будет обрабатывать до 100 одновременных запросов, медленные скрипты (>10 сек) будут залогированы.
Настройка Nginx для балансировки нескольких PHP-FPM пулов
upstream php_backend {
server unix:/run/php/php8.1-site1.sock weight=3;
server unix:/run/php/php8.1-site2.sock weight=1;
keepalive 32;
}
server {
listen 80;
server_name example.com;
root /var/www/example;
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass php_backend;
fastcgi_keep_conn on;
fastcgi_read_timeout 120;
}
}Результат:
Запросы к PHP на example.com распределяются между двумя пулами с весом 3:1. При отказе одного пула Nginx переключается на другой.
Оптимизация php.ini для CLI (консольные скрипты)
memory_limit = 1G
max_execution_time = 0
max_input_time = -1
display_errors = Stderr
error_reporting = E_ALL
; отключаем ограничения для длительных задач
disable_functions = exec,system,shell_exec,passthru,popen,proc_openРезультат:
CLI-скрипты могут использовать до 1 ГБ памяти и работать без ограничения по времени. Ошибки выводятся в stderr, опасные функции отключены.
Использование .user.ini для отдельных директорий
# В папке /admin/ создаём файл .user.ini:
memory_limit = 512M
max_execution_time = 300
; это повлияет только на скрипты внутри /admin/ и подпапокРезультат:
При запросе к /admin/index.php память будет 512M, для остальных страниц сайта останется стандартное значение.
Настройка PHP-FPM для работы через socket с разными владельцами
[site2]
user = deploy
group = deploy
listen = /run/php/php8.1-site2.sock
listen.owner = deploy
listen.group = deploy
listen.mode = 0666
; чтобы nginx мог обращаться от пользователя www-data, требуется mode 0666 или общая группаРезультат:
Сокет доступен для чтения/записи всем пользователям, что может быть небезопасно. Рекомендуется использовать общую группу (например, www-data) и mode 0660.