Справочник по конфигурации

OxPHP полностью настраивается через переменные окружения. Никаких конфигурационных файлов вести не нужно, а у каждой настройки есть значение по умолчанию, поэтому развёртывание без какой-либо конфигурации работает сразу из коробки.

Булевы значения

Переменные, помеченные как булевы, принимают фиксированный канонический набор значений — без учёта регистра и с обрезкой пробелов:

  • истинные: on, true, 1, yes
  • ложные: off, false, 0, no

Любое непустое значение вне этого набора — например, опечатка вроде ture — приводит к немедленной ошибке при запуске с указанием имени переменной. Так ошибочная конфигурация отлавливается до того, как пойдёт трафик, а не приводит к молчаливому выставлению флага не в ту сторону.

Неустановленная переменная или пустое присваивание (FOO=) откатывается к задокументированному значению по умолчанию. Пустое значение намеренно трактуется как неустановленное: подстановка в Docker Compose / Kubernetes вида FOO=${FOO} даёт FOO=, когда переменной на хосте нет, и это не должно мешать серверу запускаться.

Сервер

Переменная По умолчанию Описание
LISTEN_ADDR 0.0.0.0:80 Адрес и порт основного HTTP-сервера
DOCUMENT_ROOT /var/www/html/public Корневой каталог для отдачи файлов и PHP-скриптов
ENTRY_FILE (не задано) Единственный канонический входной файл. Не задано = прямое отображение файлов. *.php = фронт-контроллер. Не-.php = статический фолбэк (SPA). При WORKER_MODE_ENABLED=true = bootstrap-скрипт воркера. Разрешается относительно DOCUMENT_ROOT (относительные пути и .. допускаются; абсолютные пути используются как есть). См. Маршрутизация
WORKER_MODE_ENABLED false Включает постоянный режим воркеров. Требует, чтобы ENTRY_FILE указывал на .php-скрипт. Булево — см. Булевы значения
MAX_CONNECTIONS 10000 Максимальное число одновременных TCP-соединений
TOKIO_WORKERS CPU / 2 (мин. 1) Потоки асинхронного ввода-вывода. 1 = однопоточный режим, N > 1 = фиксированное число потоков, не задано = автоматически (CPU / 2, мин. 1)

PHP-воркеры

Переменная По умолчанию Описание
EXECUTOR sapi Бэкенд-исполнитель PHP. sapi — исполнение PHP, stub — для бенчмаркинга без PHP
PHP_WORKERS CPU / 2 (мин. 1) Размер пула воркеров. N = фиксированный пул, MIN:MAX = динамическое масштабирование, 0 = автоматически
PHP_WORKERS_IDLE_SECONDS 30 Сколько секунд динамический воркер остаётся простаивающим, прежде чем будет выведен из пула (только в динамическом режиме)
QUEUE_CAPACITY Начальное число воркеров × 128 Максимальное число ожидающих запросов в очереди PHP. При заполнении возвращает 529. Для динамических пулов (MIN:MAX) начальное число воркеров = минимальное значение

Статические и динамические воркеры

Укажите в PHP_WORKERS одно число для фиксированного пула:

bash
PHP_WORKERS=8 # Fixed 8 workers PHP_WORKERS=0 # Auto-detect: CPU / 2 (min 1)

Укажите в PHP_WORKERS значение MIN:MAX для автоматического масштабирования:

bash
PHP_WORKERS=2:16 # Scale between 2 and 16 workers PHP_WORKERS=4:0 # 4 minimum, auto-detect maximum (CPU × 2) PHP_WORKERS=0:16 # auto-detect minimum (CPU / 4, min 1), 16 maximum

В динамическом режиме OxPHP увеличивает число воркеров, когда все они заняты, и уменьшает его, когда воркеры простаивают дольше PHP_WORKERS_IDLE_SECONDS.

Режим воркеров

Переменная По умолчанию Описание
WORKER_MAX_MEMORY_MIB 0 Максимальный объём памяти в MiB на один воркер до его пересоздания. 0 = без ограничения

Установите WORKER_MODE_ENABLED=true и укажите в ENTRY_FILE bootstrap-скрипт воркера (например, ENTRY_FILE=worker.php или ENTRY_FILE=../worker.php). PHP-процессы тогда остаются живыми между запросами, сохраняя в памяти состояние инициализации (автозагрузчики, соединения с базой данных). Воркеры пересоздаются автоматически, когда превышают WORKER_MAX_MEMORY_MIB, или по требованию, когда приложение вызывает Worker::scheduleExit(). Параметр WORKER_MAX_REQUESTS из ранних выпусков объявлен устаревшим и игнорируется — не задавайте ни его, ни аналог, либо перейдите на Worker::scheduleExit().

Устаревшие: INDEX_FILE и WORKER_FILE

Устаревшие переменные INDEX_FILE и WORKER_FILE по-прежнему разбираются ради обратной совместимости. Если они заданы, при запуске выводится строка лога уровня WARN, и они отображаются на новую модель:

Устаревшая форма Современный эквивалент
INDEX_FILE=index.php ENTRY_FILE=index.php
INDEX_FILE=index.html ENTRY_FILE=index.html
WORKER_FILE=/path/worker.php WORKER_MODE_ENABLED=true ENTRY_FILE=/path/worker.php

Если заданы и старые, и новые переменные, приоритет за ENTRY_FILE / WORKER_MODE_ENABLED. Переходите на них, когда вам удобно; устаревшие формы будут удалены в одном из будущих выпусков.

SAPI / PHP

Переменная По умолчанию Описание
SUPERGLOBALS_ENABLED true Заполняет суперглобальные переменные PHP ($_GET, $_POST, $_COOKIE, $_FILES, $_SERVER, php://input) перед выполнением скрипта. Установите ложное значение, чтобы пропустить заполнение — тогда данные запроса доступны только через объектный API (oxphp_http_request()). Полезно для приложений, которые работают напрямую с объектным API и хотят избежать затрат на построение суперглобальных переменных на каждом запросе

Таймауты

Переменная По умолчанию Описание
HEADER_TIMEOUT_SECONDS 5 Максимальное число секунд на приём HTTP-заголовков после установки соединения (защита от Slowloris)
DRAIN_TIMEOUT_SECONDS 25 Максимальное число секунд ожидания завершения текущих соединений при корректном завершении работы

Время выполнения PHP ограничивается собственной ini-директивой PHP max_execution_time (и вызовом set_time_limit() во время выполнения), а не переменной окружения OxPHP.

Ограничение частоты запросов

Переменная По умолчанию Описание
RATE_LIMIT 0 (выкл.) Максимальное число запросов с одного IP за временное окно. 0 отключает ограничение частоты запросов
RATE_WINDOW_SECONDS 60 Длительность окна ограничения частоты запросов в секундах

Безопасность

Переменная По умолчанию Описание
FRAME_OPTIONS DENY Защита от кликджекинга. DENY полностью запрещает встраивание во фреймы, SAMEORIGIN разрешает встраивание в рамках того же источника, off отключает защиту (используйте, когда управляете встраиванием через собственный CSP). Устанавливает одновременно X-Frame-Options и Content-Security-Policy: frame-ancestors. Заголовки безопасности от сервера служат фолбэком: значения, заданные приложением (например, через PHP header()), имеют приоритет и никогда не перезаписываются. Пара заголовков управления фреймингом связана в обе стороны — заданный приложением X-Frame-Options подавляет серверный Content-Security-Policy: frame-ancestors (в современных браузерах CSP переопределяет X-Frame-Options), а CSP от приложения, содержащий директиву frame-ancestors, подавляет серверный X-Frame-Options. Учтите, что этот приоритет распространяется и на X-Content-Type-Options: заданное приложением значение сохраняется как есть, хотя единственно допустимое значение — nosniff; недопустимое значение отключает защиту
TRUSTED_PROXIES (не задано) Сети доверенных обратных прокси (CIDR через запятую или private). Если задано, OxPHP извлекает реальный IP клиента из заголовков Forwarded (RFC 7239) или X-Forwarded-For по алгоритму «крайний правый недоверенный». Также обрабатывает X-Forwarded-Proto и X-Forwarded-Host для $_SERVER['HTTPS'], REQUEST_SCHEME, SERVER_NAME и SERVER_PORT. Не задано = функция отключена
PHP_DENY_PATHS (не задано) Glob-шаблоны через запятую, чьи .php-файлы никогда не должны выполняться по прямому URI (например, /uploads/**,/cache/**,/admin/legacy.php). Шаблоны могут указывать на целые каталоги или отдельные файлы. Применяется в режимах прямого отображения — Traditional и SPA; в режимах Framework и Worker, которые никогда не выполняют произвольные .php-файлы напрямую, игнорируется с предупреждением при запуске. Также охватывает скрипты, доступные через разрешение индексного файла каталога (/uploads/uploads/index.php). Для прямых .php-URI сопоставление происходит до обращения к диску, поэтому запрещённые пути дают одинаковый ответ независимо от того, существует файл или нет (без «оракула существования»). Устаревшее имя PHP_DENY_DIRS принимается как устаревший псевдоним и вызывает WARN при запуске. См. Дени-лист исполнения PHP
PHP_DENY_FALLBACK 404 Что возвращать при совпадении с PHP_DENY_PATHS. Либо HTTP-статус 400599 (в паре с ERROR_PAGES_DIR для собственного HTML), либо URI-путь с ведущим / к PHP-скрипту-фолбэку внутри DOCUMENT_ROOT. Скрипт-фолбэк получает OXPHP_DENIED_PATH и OXPHP_DENIED_PATTERN в $_SERVER. Проверяется при запуске: скрипт должен существовать, канонизироваться внутри DOCUMENT_ROOT и сам не должен совпадать с PHP_DENY_PATHS (для предотвращения зацикливания)
SYMLINK_ALLOW_PATHS (не задано) Список абсолютных путей через запятую, под которыми символическим ссылкам разрешено выходить за пределы DOCUMENT_ROOT. Каждый элемент должен уже существовать на диске; относительные и несуществующие пути прерывают запуск. Не задано = выход по символическим ссылкам запрещён. См. Разрешённые пути для симлинков

Специальное значение private разворачивается во все частные сети RFC-1918, loopback- и link-local-адреса (IPv4 и IPv6): 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 127.0.0.0/8, 169.254.0.0/16, ::1/128, fc00::/7, fe80::/10.

TLS

Переменная По умолчанию Описание
TLS_CERT (не задано) Путь к TLS-сертификату в кодировке PEM. Для включения TLS должны быть заданы и TLS_CERT, и TLS_KEY
TLS_KEY (не задано) Путь к закрытому TLS-ключу в кодировке PEM
TLS_MIN_VERSION 1.2 Минимальная принимаемая версия протокола TLS: 1.2 или 1.3. Проверяется при запуске (и командой oxphp config --check) даже когда TLS не включён — любое другое значение, включая последовательности байтов вне UTF-8, приводит к жёсткой ошибке при запуске. Пустое значение трактуется как неустановленное

HTTP/2

Переменная По умолчанию Описание
H2_MAX_CONCURRENT_STREAMS PHP_WORKERS_MAX × 4 (мин. 32) Максимальное число одновременно открытых потоков на одно HTTP/2-соединение
H2_MAX_PENDING_RESET 20 Максимальное число кадров RST_STREAM в очереди до закрытия соединения (защита от Rapid Reset)
H2_MAX_HEADER_LIST_BYTES 65536 Максимальный суммарный размер декодированных заголовков на один запрос в байтах
H2_KEEPALIVE_INTERVAL_SECS 20 Число секунд между HTTP/2-кадрами PING; 0 отключает
H2_KEEPALIVE_TIMEOUT_SECS 10 Число секунд ожидания ответа на PING до закрытия соединения

Статические файлы

Переменная По умолчанию Описание
STATIC_MAX_AGE 30d Cache-Control: max-age для статических файлов. Принимает: 30s, 5m, 2h, 30d, 1w, 1y, число секунд без суффикса (3600) или off для отключения заголовка. Заменяет устаревшую STATIC_CACHE_TTL.
STATIC_REVALIDATE off Булево — см. Булевы значения. Установите истинное значение, чтобы включить ревалидацию по mtime для кэша содержимого в памяти: время изменения файла перепроверяется не чаще одного раза в 3 секунды на файл (а не на запрос), а устаревшие записи вытесняются автоматически, так что изменения становятся видны в течение 3 секунд. Заменяет устаревшую STATIC_CACHE (где off имело обратный смысл).
COMPRESSION_LEVEL 4 Качество сжатия Brotli (0–11). 0 отключает сжатие

Логирование

Переменная По умолчанию Описание
LOG_LEVEL info Уровень детализации логов: trace, debug, info, warn, error
ACCESS_LOG (не задано) Журнал доступа по каждому запросу: all = каждый запрос, error = только 4xx/5xx, не задано = выключено
Note

ACCESS_LOG принимает all или error. Оставьте её неустановленной, чтобы полностью отключить журнал доступа.

Наблюдаемость

Переменная По умолчанию Описание
INTERNAL_ADDR (не задано) Адрес внутреннего сервера (/health, /metrics, /config). Если не задано, внутренний сервер не запускается. Значение только с портом (:9090 или 9090) привязывается к 127.0.0.1; чтобы открыть его наружу, укажите явный 0.0.0.0:9090
INTERNAL_ALLOW_IPS (не задано) Список разрешений в формате CIDR/IP через запятую для внутреннего сервера. Узел вне списка получает 403 на /metrics, /config и путях плагинов; проверки работоспособности (/health, /healthz, /readyz, /startupz и их длинные формы) остаются доступны. Не задано/пусто = разрешены все. Loopback не подразумевается неявно — укажите 127.0.0.1/32, чтобы сохранить доступ с localhost. Некорректный список прерывает запуск
ERROR_PAGES_DIR (не задано) Каталог с пользовательскими страницами ошибок с именами {status}.html (например, 404.html, 503.html)
MAX_QUERY_BODY 524288 Максимальный размер тела запроса в байтах для внутренних query-эндпоинтов (512 KiB)
TRACE_CONTEXT false Булево — см. Булевы значения. Если истинно, включает распространение W3C Trace Context: читает заголовки traceparent/tracestate и передаёт их в PHP через $_SERVER

OpenTelemetry

Переменная По умолчанию Описание
OTEL_ENABLED false Включает экспорт спанов OpenTelemetry. Автоматически устанавливает TRACE_CONTEXT=true. Булево — см. Булевы значения
OTEL_EXPORTER_OTLP_PROTOCOL grpc Протокол экспорта: grpc или http/protobuf
OTEL_EXPORTER_OTLP_ENDPOINT http://localhost:4317 (gRPC) или http://localhost:4318 (HTTP) Эндпоинт OTLP-коллектора
OTEL_EXPORTER_OTLP_TIMEOUT 10000 Таймаут экспорта в миллисекундах
OTEL_EXPORTER_OTLP_HEADERS (не задано) Заголовки аутентификации: key=value,key2=value2
OTEL_SERVICE_NAME oxphp Имя сервиса в экспортируемых спанах
OTEL_SERVICE_VERSION (не задано) Атрибут версии сервиса
OTEL_RESOURCE_ATTRIBUTES (не задано) Дополнительные атрибуты ресурса: env=prod,region=us-east-1
OTEL_TRACES_SAMPLER parentbased_traceidratio Стратегия сэмплирования: always_on, always_off, traceidratio, parentbased_always_on, parentbased_always_off, parentbased_traceidratio
OTEL_TRACES_SAMPLER_ARG 1.0 Доля сэмплирования (0.0–1.0) для семплеров на основе отношения
Note

Недопустимые или выходящие за диапазон значения OTEL_TRACES_SAMPLER_ARG ограничиваются интервалом [0.0, 1.0] и логируются на уровне warn. Неизвестные значения OTEL_TRACES_SAMPLER откатываются к parentbased_traceidratio и логируются.

APM

Переменная По умолчанию Описание
OTEL_APM_ENABLED false Включает APM: автоматическую инструментацию, захват ошибок и PHP-SDK трассировки. Требует OTEL_ENABLED=true. Булево — см. Булевы значения
OTEL_APM_SLOW_QUERY_MS 100 Порог медленного запроса в миллисекундах. Запросы к базе данных, превышающие его, получают атрибут спана oxphp.db.slow=true
OTEL_APM_DB_CAPTURE_PARAMS_ENABLED false Записывает связанные параметры в атрибут спана db.params. Отключите в продакшене, если параметры могут содержать чувствительные данные. Булево — см. Булевы значения
OTEL_APM_STACKTRACE_MAX_BYTES 8192 Максимальный размер атрибута exception.stacktrace в байтах. При превышении предела стектрейс обрезается с конца с маркером …(truncated). 0 отключает обрезку
OTEL_APM_MESSAGE_MAX_BYTES 4096 Максимальный размер атрибута exception.message в байтах (значение по умолчанию совпадает с ограничением New Relic на значение одного атрибута). При превышении предела сообщение обрезается с конца с маркером …(truncated). 0 отключает обрезку

Когда APM включён, OxPHP автоматически перехватывает 33 внутренние функции PHP (PDO, mysqli, cURL, Redis, Memcached, файловый ввод-вывод), чтобы создавать дочерние спаны. PHP-функции oxphp_apm_*() регистрируются независимо от того, включён ли APM — когда он выключен, они являются безопасными no-op-заглушками.

Асинхронные воркеры

Переменная По умолчанию Описание
ASYNC_WORKERS 0 (отключено) Число выделенных потоков асинхронных воркеров. При 0 асинхронные функции (oxphp_async и т. д.) регистрируются, но при вызове выбрасывают OxPHP\Async\AsyncException. Установите положительное значение, чтобы включить фоновое выполнение задач
ASYNC_QUEUE_CAPACITY ASYNC_WORKERS × 64 Максимальное число ожидающих задач в асинхронной очереди. 0 = автоматически (воркеры × 64)
ASYNC_MAX_FIBERS 256 Ограничение на число одновременных файберов асинхронных задач на один воркер. Глобальный для процесса лимит выполняющихся (в очереди + запущенных) равен ASYNC_MAX_FIBERS × ASYNC_WORKERS; диспетчеризация сверх него немедленно отклоняется с OxPHP\Async\AsyncException, чтобы композиция с fan-out не могла привести к взаимоблокировке

Пул асинхронных воркеров обрабатывает фоновые задачи типа «запустил и забыл», диспетчеризуемые из PHP. Он отделён от пула PHP-воркеров и не требуется для обработки обычных запросов.

Некорректное значение любой из этих трёх переменных (например, ASYNC_WORKERS=8x) приводит к ошибке при запуске — откат к значению по умолчанию молча отключил бы или неправильно настроил пул. Строго пустое значение трактуется как неустановленное.

Разделяемое состояние

Внутрипроцессные примитивы конкурентности (OxPHP\Shared\Counter, Map, Channel, Mutex, Once, Pool, Atomic, Flag, Registry). Обзор API см. в разделе Разделяемое состояние.

Переменная По умолчанию Описание
SHARED_ENABLED true Булево — см. Булевы значения. Главный переключатель всей подсистемы OxPHP\Shared\*
SHARED_MAX_ENTRIES 100000 Глобальное ограничение на суммарное число всех записей Shared. Вставка сверх него завершается с CapacityException
SHARED_MAX_BYTES 1073741824 (1 GiB) Глобальное ограничение на оценочный объём памяти по всем записям Shared
SHARED_SOFT_LIMIT_RATIO 0.7 Начинает сбрасывать наименее приоритетную работу, когда использование пересекает эту долю от SHARED_MAX_BYTES / SHARED_MAX_ENTRIES
SHARED_METRICS_ENABLED true Булево. Включает/выключает экспозицию метрик oxphp_shared_* в Prometheus
SHARED_INTROSPECTION_ENABLED true Булево. Включает/выключает API интроспекции /__ox_shared/* на внутреннем сервере
SHARED_INTROSPECTION_PREVIEW_ENABLED true Булево. Включает/выключает предпросмотр значений в ответах интроспекции (отключите, когда предпросмотр может раскрыть чувствительные данные)
SHARED_CYCLE_DETECT_DEPTH 16 Глубина BFS при проверке на циклы. Увеличьте для глубоких допустимых графов
SHARED_CYCLE_DETECT_EDGES 10000 Число рёбер, обходимых при проверке на циклы. Увеличьте для плотных допустимых графов
SHARED_MAX_VALUE_SIZE 1048576 (1 MiB) Ограничение размера одного значения. Вставка большего значения завершается сразу с ошибкой
SHARED_MAX_CHANNEL_BYTES 67108864 (64 MiB) Ограничение суммарного объёма данных на один канал
SHARED_POISON_STRICT false Булево. Если истинно, паника внутри замыкания Mutex/Once навсегда «отравляет» примитив вместо попытки восстановления по мере возможности
SHARED_LOCK_DIAGNOSTICS off Диагностика конкуренции за блокировки: off, count или trace
SHARED_LOCK_POLL_INTERVAL_MS 100 Интервал опроса, используемый сэмплером диагностики блокировок
SHARED_PREVIEW_STRING_LIMIT 256 Обрезка каждой строки в предпросмотре /entry?id=…
SHARED_PREVIEW_ARRAY_LIMIT 20 Число записей, выбираемых в предпросмотре /entry?id=…

Профилирование

Сэмплирующий профилировщик, который выдаёт трассы xhprof / speedscope. Форматы вывода и интеграцию с просмотрщиками см. в разделе Профилирование.

Переменная По умолчанию Описание
PROFILER_ENABLED false Булево — см. Булевы значения. Главный переключатель. Все остальные переменные PROFILER_* всё равно разбираются при запуске, поэтому опечатки всплывают сразу
PROFILER_SAMPLE_RATE 0.0 Вероятность (0.0–1.0) того, что запрос будет засэмплирован. Значения вне диапазона ограничиваются границами
PROFILER_INTERNAL false Булево. Если истинно, запросы к внутреннему серверу (/health, /metrics, эндпоинты плагинов) также подпадают под сэмплирование
PROFILER_AUTH_TOKEN (не задано) Необязательный bearer-токен. Если задан, PHP-функции oxphp_profiler_* требуют, чтобы запросы несли этот токен для включения профилирования по требованию
PROFILER_MAX_SPANS 50000 Ограничение числа спанов профиля на один запрос. Профили, превышающие лимит, обрезаются
PROFILER_MAX_DEPTH 256 Максимальная глубина стека вызовов, захватываемая на один сэмпл. Жёстко ограничена значением 65535
PROFILER_OUTPUT_DIR /tmp/oxphp-profiles Каталог для файлов профилей на диске
PROFILER_OUTPUT_FORMATS xhprof,speedscope Список форматов вывода через запятую для записи на диск
PROFILER_DISK_MAX_PER_SEC 10 Ограничение частоты записи файлов профилей на диск в секунду
PROFILER_RETENTION_COUNT 100 Максимальное число файлов профилей, хранимых в PROFILER_OUTPUT_DIR. Более старые файлы удаляются
PROFILER_EXPORT_URL (не задано) Удалённый эндпоинт, на который отправляются профили методом POST. Если задан, запись на диск всё равно происходит, если только PROFILER_OUTPUT_FORMATS не пуст
PROFILER_EXPORT_FORMAT xhprof Формат передачи для отправок на PROFILER_EXPORT_URL
PROFILER_EXPORT_AUTH_TOKEN (не задано) Необязательный bearer-токен, отправляемый с каждым запросом экспорта
PROFILER_EXPORT_XHGUI (автоопределение) Булево. Принудительно включает XHGui-совместимую обёртку для экспортируемого тела. Не задано = автоопределение, когда путь PROFILER_EXPORT_URL оканчивается на /run/import (подсказки в хосте/строке запроса не учитываются)
PROFILER_EXPORT_BUGGREGATOR (автоопределение) Булево. Принудительно включает конверт Buggregator. Не задано = автоопределение, когда путь PROFILER_EXPORT_URL оканчивается на /api/profiler/store. Конверт всегда выдаёт xhprof, поэтому PROFILER_EXPORT_FORMAT для него игнорируется (не-xhprof значение вызывает предупреждение, не фатально). Взаимоисключающ с PROFILER_EXPORT_XHGUI — включение обоих приводит к ошибке при запуске
PROFILER_EXPORT_APP_NAME (не задано) Buggregator app_name для группировки по проектам
PROFILER_EXPORT_TAGS (не задано) Buggregator tags в виде key=value,key2=value2; некорректный токен, пустой ключ или дублирующийся ключ приводит к ошибке при запуске

Примеры конфигураций

Разработка

bash
LISTEN_ADDR=127.0.0.1:8080 DOCUMENT_ROOT=./public LOG_LEVEL=debug ACCESS_LOG=all PHP_WORKERS=1 INTERNAL_ADDR=127.0.0.1:9090

Продакшен (Framework)

bash
LISTEN_ADDR=0.0.0.0:80 DOCUMENT_ROOT=/var/www/html/public ENTRY_FILE=index.php PHP_WORKERS=8 QUEUE_CAPACITY=1024 LOG_LEVEL=warn ACCESS_LOG=error MAX_CONNECTIONS=10000 INTERNAL_ADDR=127.0.0.1:9090 RATE_LIMIT=100 RATE_WINDOW_SECONDS=60 TRUSTED_PROXIES=private HEADER_TIMEOUT_SECONDS=5 DRAIN_TIMEOUT_SECONDS=25 COMPRESSION_LEVEL=4 STATIC_MAX_AGE=30d

Продакшен (режим воркеров)

bash
LISTEN_ADDR=0.0.0.0:80 DOCUMENT_ROOT=/var/www/html/public WORKER_MODE_ENABLED=true ENTRY_FILE=../worker.php PHP_WORKERS=8 WORKER_MAX_MEMORY_MIB=128 QUEUE_CAPACITY=1024 LOG_LEVEL=warn ACCESS_LOG=error INTERNAL_ADDR=127.0.0.1:9090

TLS

bash
LISTEN_ADDR=0.0.0.0:443 TLS_CERT=/etc/ssl/oxphp/cert.pem TLS_KEY=/etc/ssl/oxphp/key.pem DOCUMENT_ROOT=/var/www/html/public ENTRY_FILE=index.php

Проверка активной конфигурации

Когда внутренний сервер запущен, обратитесь к эндпоинту /config, чтобы увидеть итоговую конфигурацию:

bash
curl -s http://localhost:9090/config | jq .
json
{ "listen_addr": "0.0.0.0:80", "document_root": "/var/www/html/public", "entry_file": "/var/www/html/public/index.php", "log_level": "warn", "executor_type": "sapi", "php_workers": "8", "tokio_workers": 4, "queue_capacity": 1024, "max_connections": 10000, "drain_timeout_seconds": 30, "header_timeout_seconds": 5, "rate_limit": 100, "rate_window_seconds": 60, "tls_enabled": true, "compression_level": 4, "access_log": "all", "max_query_body": 524288, "worker_mode_enabled": false, "worker_max_memory_mib": 0, "static_max_age": 2592000, "static_revalidate": false, "async_workers": 0, "async_queue_capacity": 0, "async_max_fibers": 256, "async_in_flight_cap": 0, "trace_context": true, "superglobals_enabled": true, "trusted_proxies": false, "plugins": { "otel": { "enabled": true, "protocol": "grpc", "service_name": "oxphp" }, "apm": { "enabled": true, "slow_query_ms": 100, "db_capture_params": false, "hooks_registered": 33 } } }
Note

Отдаваемый ответ /config вычищает несколько ключей, которые несёт внутреннее представление Config: пути к TLS-сертификату и ключу никогда не выводятся (tls_enabled показывает, активен ли TLS), а internal_addr и error_pages_dir удаляются — это топология развёртывания и пути в файловой системе, которые помогают злоумышленнику и не нужны сборщикам метрик.

См. также