Настройки 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.

Настройка хостинга для PHP - comments

En
настройка хостинга php (php)