Оригинал: Don’t Deploy Without This: The Essential php.ini Checklist
Перевод для канала Мы ж программист
Развертывать PHP-приложение без правильной настройки php.ini – все равно что управлять автомобилем, не проверив тормоза. Это может сработать, но вы сильно рискуете. Плохо настроенный файл php.ini может привести к уязвимостям в системе безопасности, проблемам с производительностью и неожиданным ошибкам в вашем приложении.
В этом руководстве мы рассмотрим основные параметры php.ini, которые необходимо настроить перед развертыванием PHP-приложения. Мы также объясним, почему каждый параметр имеет значение, и приведем примеры, где это необходимо.
Что такое php.ini?
Это конфигурационный файл для PHP. Он управляет различными настройками, такими как обработка ошибок, загрузка файлов, ограничение памяти и параметры безопасности. Каждый раз, когда PHP запускается, он считывает этот файл, чтобы определить, как он должен себя вести.
Вы можете найти файл php.ini, запустив:
php --ini
Эта команда покажет местонахождение вашего активного php.ini.
1. Сообщения об ошибках и логи
Почему это важно
Настройки сообщений об ошибках помогают отлавливать и регистрировать ошибки в приложении. В боевой среде вы не хотите показывать ошибки пользователям, а предпочитаете записывать их в журнал для отладки.
Рекомендованные настройки
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
display_errors = Off
display_startup_errors = Off
log_errors = On
error_log = /var/log/php_errors.log
Объяснение
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
– отчитываться обо всех ошибках, кроме устаревшихdisplay_errors = Off
– не показывать ошибки на экранеdisplay_startup_errors = Off
– не показывать ошибки, возникающие при старте PHPlog_errors = On
– сохранять ошибки в логеerror_log = /var/log/php_errors.log
– лог-файл, куда нужно сохранять ошибки
✅ Лучшая практика: Всегда сохранять ошибки в логе, но никогда не отображать их на проде.
2. Лимит памяти
Почему это важно
Низкий лимит памяти может привести к тому, что ваши PHP-скрипты будут падать с ошибкой «Allowed memory size exhausted» (доступный лимит исчерпан), а очень высокий лимит может вызвать проблемы с производительностью.
Рекомендованные настройки
memory_limit = 256M
Объяснение
- Значение
memory_limit
определяет максимальный объем памяти, который скрипт может использовать - Значение порядка
256M
(256 мегабайт) – обычно хороший баланс для большинства приложений
✅ Лучшая практика: Настройте это значение, исходя из требований вашего приложения. Типичное веб-приложение может нормально работать при 256M
, но для обработки больших файлов может потребоваться 512M
или более.
3. Максимальное время выполнения
Почему это важно
Большое время выполнения может сделать ваш сервер уязвимым для атак и снизить производительность, а очень короткое ограничение может привести к тому, что скрипты не успеют завершиться.
Рекомендованные настройки
max_execution_time = 30
Объяснение
- Это значение устанавливает максимальное время (в секундах), которое отводится скрипту на выполнение
30
секунд обычно достаточно для большинства скриптов
✅ Лучшая практика: Если вашему скрипту нужно больше времени (например, обработка больших файлов), вы можете увеличить значение, но придерживайтесь разумных значений, чтобы избежать проблем с производительностью.
4. Лимиты на загрузку файлов
Почему это важно
Если ваше приложение позволяет пользователям загружать файлы, вам необходимо контролировать максимальный размер файла и количество файлов, которые могут быть загружены одновременно.
Рекомендованные настройки
file_uploads = On
upload_max_filesize = 10M
post_max_size = 12M
max_file_uploads = 20
Объяснение
file_uploads = On
– разрешить загрузку файлов на сервер.upload_max_filesize = 10M
– ограничить размер каждого файла до 10MB.post_max_size = 12M
– ограничить общий объем данных, отправленных через POST (включая файлы), значением 12MB.max_file_uploads = 20
– ограничить общее количество файлов, загруженных за один запрос.
✅ Лучшая практика: Установите значения на основе требований вашего приложения.
5. Безопасность сессии
Почему это важно
Настройки сессии влияют на то, как пользовательские сессии хранятся и обрабатываются. Некорректные настройки могут привести к уязвимостям в системе безопасности.
Рекомендованные настройки
session.use_strict_mode = 1
session.cookie_secure = 1
session.cookie_httponly = 1
session.use_cookies = 1
session.use_only_cookies = 1
session.gc_maxlifetime = 1440
Объяснение
session.use_strict_mode = 1
– предотвращает атаки с фиксацией сессии.session.cookie_secure = 1
– разрешает отправлять куки только через HTTPS.session.cookie_httponly = 1
– запрещает доступ к кукам через JavaScript.session.use_cookies = 1
– разрешает сохранять сессии в куках.session.use_only_cookies = 1
– предотвращает перехват сессий путем отключения сессий на основе URL-адресов.session.gc_maxlifetime = 1440
– устанавливает максимальное время жизни сессии в секундах.
✅ Лучшая практика: Всегда включайте HTTPS-куки (session.cookie_secure
) на проде.
6. Настройки безопасности
Отключайте опасные функции
Некоторые функции PHP могут быть использованы злоумышленниками для выполнения вредоносных команд.
Рекомендованные настройки
disable_functions = exec,system,shell_exec,passthru,eval
Объяснение
- Отключает функции, которые допускают выполнение системных команд
✅ Лучшая практика: Если эти функции не нужны вашему приложению, отключите их.
7. Opcode-кэширование для производительности
Почему это важно
Включение opcode-кэширования повышает производительность, сохраняя скомпилированный PHP-код в памяти.
Рекомендованные настройки
opcache.enable = 1
opcache.memory_consumption = 128
opcache.max_accelerated_files = 4000
opcache.validate_timestamps = 1
Объяснение
opcache.enable = 1
– включает OPcache.opcache.memory_consumption = 128
– выделяет 128MB для кэша.opcache.max_accelerated_files = 4000
– кэширует до 4000 PHP-файлов.opcache.validate_timestamps = 1
– разрешает PHP проверять изменения в файлах и перезагружать кэш при необходимости.
✅ Лучшая практика: Всегда включайте OPcache на проде для лучшей производительности.
8. Установки таймзоны
Почему это важно
Установка верной таймзоны гарантирует, что все функции даты-времени работают корректно.
Рекомендованные настройки
date.timezone = "UTC"
Объяснение
date.timezone = "UTC"
– устанавливает таймзону в Coordinated Universal Time (UTC).
✅ Лучшая практика: Выберите таймзону, которая наилучшим образом отвечает требованиям вашего приложения.
9. Ограничение использования ресурсов
Почему это важно
Ограничение ресурсов не позволяет одному скрипту потреблять слишком много процессора, памяти или времени.
Рекомендованные настройки
max_input_time = 60
memory_limit = 256M
max_execution_time = 30
Объяснение
max_input_time = 60
– ограничивает время обработки скриптом входных данных.memory_limit = 256M
– предотвращает излишнее потребление памяти.max_execution_time = 30
– не дает срипту выполняться вечно.
✅ Лучшая практика: Установите разумные ограничения в зависимости от ресурсов вашего сервера.
Заключительные мысли
Перед публикацией вашего PHP-приложения убедитесь, что файл php.ini
корректно настроен. Правильные настройки улучшают безопасность, повышают производительность и стабильность.
📌 Итоговый чек-лист:
✅ Протоколирование ошибок включено, но не отображается.
✅ Ограничение памяти и время выполнения установлены правильно.
✅ Загрузка файлов настроена безопасно.
✅ Сессии защищены настройками HTTP-only и безопасности.
✅ Опасные функции отключены.
✅ Включен OPcache для повышения производительности.
✅ Установлена верная таймзона.
✅ Использование ресурсов ограничено.
Следуя этому чек-листу, вы избежите типичных ошибок и обеспечите беспроблемное развертывание вашего PHP-приложения..