Ответ
Настройка сервера для PHP-приложений — многоуровневый процесс, от глобальных параметров до настроек конкретного приложения. Вот как я это делаю:
1. Уровень операционной системы и PHP-FPM.
- Настройка пулов PHP-FPM (
www.conf) для управления процессами, памятью и доступами под разные приложения или среды (dev/prod).; /etc/php/8.1/fpm/pool.d/www.conf pm = dynamic pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 35 php_admin_value[memory_limit] = 256M
2. Уровень веб-сервера (Nginx/Apache).
- Конфигурация виртуальных хостов, маршрутизация запросов к PHP-FPM через
fastcgi_pass. - Настройка кэширования (headers), gzip, обработки статических файлов, ограничений (
client_max_body_size).
3. Уровень PHP runtime (php.ini).
- Установка глобальных лимитов (
max_execution_time,memory_limit). - Включение/выключение модулей (
opcache,xdebug). - Настройка путей (
include_path) и параметров безопасности (disable_functions,allow_url_fopen).
4. Уровень приложения (.user.ini или ini_set()).
- Локальные переопределения для конкретного проекта, которые можно хранить в репозитории.
; .user.ini в корне проекта upload_max_filesize = 10M post_max_size = 12M display_errors = Off
5. Уровень среды выполнения (Docker/контейнеризация).
- Создание Docker-образов с предустановленными и настроенными расширениями (pdo, redis, gd).
- Использование переменных окружения для динамической конфигурации в разных средах (dev, staging, prod).
Ключевой принцип: Чем выше уровень (OS), тем больше влияние на безопасность и производительность. Настройки уровня приложения — самые гибкие, но их переопределение на более высоких уровнях часто необходимо для production-сред.
Ответ 18+ 🔞
Ну слушай, история с настройкой сервера под PHP — это вообще ёперный театр, целая многослойная бутербродина. Если подходить с умом, то всё разложить надо по полочкам, от глобального до самого мелкого. Вот как я обычно это делаю, чтобы потом не орать «какого хуя оно не работает».
1. Основа основ — операционка и PHP-FPM.
Тут мы в корень лезем, в настройки пулов (www.conf). Это чтобы процессы, память и доступы под разные приложения (ну там dev или prod) не смешивались в одну кучу, как мартышлюшки в клетке. Настраиваешь, сколько детей-процессов порождать, сколько держать про запас.
; /etc/php/8.1/fpm/pool.d/www.conf
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
php_admin_value[memory_limit] = 256M
Главное — не наставить max_children овердохуища, а то сервак сдохнет, не попрощавшись. Подозрение ебать чувствую, когда вижу лимиты под тысячу.
2. Слой веб-сервера (Nginx или Apache).
Тут уже виртуальные хосты, маршрутизация запросов к PHP-FPM через fastcgi_pass. Настраиваешь кэширование заголовков, gzip-сжатие, чтобы статика летала, и обязательно ограничение на размер загружаемого файла (client_max_body_size), а то какой-нибудь умник зальёт тебе гигабайтный дамп и убьёт всё нахуй. Без этого — доверия ебать ноль.
3. Глобальный PHP (php.ini).
Это уже настройки рантайма. Выставляешь общие лимиты на выполнение скриптов и память. Включаешь или вырубаешь модули вроде opcache (без него в продакшене — просто пидарас шерстяной) или xdebug (его только для дебага, иначе производительность накроется медным тазом). И безопасность — отключаешь опасные функции, типа shell_exec, чтобы тебе не впендюрили какую-нибудь гадость.
4. Уровень самого приложения (.user.ini или ini_set()).
Вот это уже гибко, можно в репозитории хранить. Допустим, для конкретного проекта нужно увеличить лимит загрузки файлов или ошибки в проде не показывать.
; .user.ini в корне проекта
upload_max_filesize = 10M
post_max_size = 12M
display_errors = Off
Удобно, потому что каждый разработчик может свои настройки локально иметь, но в проде это всё равно перебивается настройками уровня ОС. Волнение ебать, когда кто-то пытается через .user.ini в проде memory_limit на 2Гб поставить, а на уровне FPM стоит 256Мб. Ни хуя себе, сюрприз!
5. Среда выполнения (Docker и всё такое). Сейчас модно, да. Собираешь образ с уже впиленными и настроенными расширениями (pdo, redis, gd). А конфигурацию через переменные окружения прокидываешь, чтобы между стендами (dev, staging, prod) одним движением переключаться. Красота, но если накосячить в базовом образе — потом все контейнеры будут кривыми, как хуй с винтом.
А главный принцип-то какой? Чем уровень выше (ближе к операционке), тем он сильнее и важнее для безопасности и производительности. Настройки приложения — это хорошо, но они как просьба ребёнка: если папа (то есть системный администратор) на уровне FPM сказал «нет», то хоть умри, ничего не изменится. Иначе получится пиздопроебибна, когда каждый проект тянет одеяло на себя, а сервер просто ложится и плачет.