Конфігурація

Кожне налаштування — одна змінна середовища

Кожне налаштування — це змінна середовища (плюс один необовʼязковий файл, .oxphpdeny, для правил заборони шляхів), і кожна змінна має значення за замовчуванням, придатне для production. Розгорніть застосунок із порожнім середовищем, а потім перевизначте лише ті змінні, які для вас справді важливі.

Логічні значення
істинні on true 1 yes хибні off false 0 no

Будь-яке значення поза цим набором — наприклад, описка на кшталт «ture» — одразу спричиняє помилку під час запуску з назвою змінної. Порожнє значення рівнозначне незаданому: підстановки FOO=${FOO}, що дають FOO=, повертаються до значення за замовчуванням, а не зупиняють запуск.

Сервер і воркери

15 змінних
Змінна За замовчуванням Опис
0.0.0.0:80

Адреса й порт основного HTTP-сервера.

/var/www/html/public

Коренева тека для віддавання файлів і PHP-скриптів.

(не задано)

Єдиний канонічний вхідний скрипт. Не задано — пряме зіставлення файлів, *.php — фронт-контролер, не .php — SPA-fallback; у режимі воркерів — bootstrap воркера. Шлях відраховується від DOCUMENT_ROOT.

false

Увімкнути постійний режим воркерів. Потрібен ENTRY_FILE, що вказує на .php-скрипт.

10000

Максимум одночасних TCP-зʼєднань. Також верхня межа для типового QUEUE_MAX_WAITING (половина від нього); некоректне значення — помилка запуску. Тримайте його вищим за PHP_WORKERS + QUEUE_CAPACITY + QUEUE_MAX_WAITING.

CPU / 2 (min 1)

Потоки асинхронного введення-виведення. 1 — однопотоковий режим, N — фіксована кількість, не задано — автоматично. Ділить ядра з PHP_WORKERS — підняття до повної кількості ядер зазвичай знижує пропускну здатність. CPU — це кількість ядер, на яких процесу дозволено виконуватися (маска affinity, знижена до квоти cgroup), а не вага CPU чи ліміт, який платформа застосовує поза контейнером; що саме пораховано, показує рядок CPU count for default sizing під час запуску.

sapi

Бекенд виконання PHP: sapi — справжній PHP, stub — для бенчмарків без PHP.

CPU / 2 (min 1)

Розмір пулу воркерів. N — фіксований пул, MIN:MAX — динамічне масштабування, 0 — автоматично. Автоматичне визначення розміру рахує CPU так само, як TOKIO_WORKERS: на тарифі, ліміт CPU якого контейнер не бачить (cpu_source: host у журналі запуску), задайте обидві змінні явно.

30

Скільки секунд динамічний воркер простоює, перш ніж його буде виведено з пулу. Виведення чекає моменту, коли нічого не виконується, тож запити в процесі обробки ніколи не обриваються.

workers × 128

Максимум запитів в очікуванні в черзі PHP; запити, що надходять до заповненої черги, чекають до QUEUE_WAIT_TIMEOUT_MS. 0 — автоматично. Для пулів MIN:MAX початкова кількість воркерів дорівнює мінімуму.

1000

Верхня межа того, скільки запит може чекати на PHP-воркер до відповіді 529, — один дедлайн на очікування місця в черзі й у самій черзі. Під перевантаженням сервер сам його скорочує (до 1/64, мінімум 10 мс); чинне значення показує oxphp_admission_wait_budget_us. 0 — відхиляти, щойно черга заповнилася.

workers × 128, ≤ MAX_CONNECTIONS / 2

Максимум запитів, що чекають на місце в черзі; понад це — негайна 529. Кожен такий запит утримує зʼєднання та своє буферизоване тіло. 0 — автоматично.

64 MiB

Максимум байтів тіл запитів, які утримує множина очікування; запит, чиє тіло перевищило б його, отримує негайну 529, запити без тіла чекають далі. 0 — автоматично.

(не задано)

Межа памʼяті на воркер у MiB, після якої його перезапускають. 0 — без обмежень. Воркери також перезапускаються після трьох поспіль запитів, що завершилися збоєм, або на вимогу через Worker::scheduleExit().

true

Будувати $_SERVER і $_GET перед кожним скриптом. Хибне значення пропускає цю роботу; $_POST, $_FILES, $_COOKIE і php://input це не зачіпає.

Трафік і доставка

18 змінних
Змінна За замовчуванням Опис
5

Максимум секунд на отримання HTTP-заголовків після підключення (захист від Slowloris).

25

Максимум секунд на завершення поточних запитів під час плавної зупинки; після цього запити, що залишилися, скасовуються. Запит, що завис у блокувальному виклику, може утримувати процес і довше.

0 (off)

Максимум запитів з однієї IP-адреси за вікно. 0 — вимкнено; заповнена черга PHP відповідає 529.

60

Тривалість вікна обмеження частоти в секундах.

(не задано)

Шлях до PEM-сертифіката. Щоб увімкнути TLS, мають бути задані і TLS_CERT, і TLS_KEY.

(не задано)

Шлях до приватного ключа PEM.

1.2

Мінімальна версія TLS: 1.2 або 1.3. Перевіряється під час запуску, навіть коли TLS вимкнено.

PHP_WORKERS_MAX × 4 (min 32)

Максимум одночасно відкритих потоків на одне зʼєднання.

20

Максимум фреймів RST_STREAM у черзі, після якого зʼєднання закривається (захист від Rapid Reset).

65536

Максимальний сумарний обсяг декодованих заголовків на запит у байтах.

20

Інтервал між фреймами PING у секундах; 0 вимикає.

10

Скільки секунд чекати на відповідь на PING, перш ніж закрити зʼєднання.

30d

Cache-Control: max-age для статичних файлів. Приймає 30s, 5m, 2h, 30d, 1w, 1y, число секунд або off. Замінює STATIC_CACHE_TTL.

off

Повторна перевірка mtime для кешу в памʼяті — не частіше ніж раз на 3 с для кожного файлу. Замінює STATIC_CACHE.

br,zstd,gzip

Запропоновані кодування вмісту: br, zstd, gzip. off/none вимикає стиснення. Порядок ігнорується — кешовані статичні файли віддають перевагу Brotli, усе інше — zstd.

5

Якість Brotli 0–11; 0 прибирає Brotli. Замінює COMPRESSION_LEVEL (чиє значення 0 і досі вимикає всі кодування).

6

Рівень Zstandard 0–19; 0 прибирає zstd. Значення поза діапазоном зупиняють запуск.

6

Рівень gzip 0–9; 0 прибирає gzip. Значення поза діапазоном зупиняють запуск.

Безпека

5 змінних
Змінна За замовчуванням Опис
SAMEORIGIN

Захист від клікджекінгу: SAMEORIGIN, DENY або off. Встановлює X-Frame-Options + CSP frame-ancestors на кожній відповіді; заголовки, задані застосунком, завжди мають пріоритет. Некоректні значення повертаються до SAMEORIGIN із попередженням під час запуску.

(не задано)

Довірені проксі: розділений комами перелік, що поєднує CIDR, окремі IP-адреси та ключові слова private і cloudflare. Справжня IP-адреса клієнта береться з Forwarded / X-Forwarded-* за правилом «крайня права недовірена»; з cloudflare — з CF-Connecting-IP, коли запит пройшов через edge-вузол Cloudflare.

(не задано)

Glob-шаблони, .php-файли за якими ніколи не виконуються через прямий URI (/uploads/**). Зіставлення відбувається до звернення до диска — без оракула існування файлу.

404

Відповідь у разі збігу з PHP_DENY_PATHS або з правилом заборони .oxphpdeny: HTTP-статус 400–599 або резервний PHP-скрипт із префіксом / всередині DOCUMENT_ROOT. У режимі воркерів правила заборони .oxphpdeny приймають лише код статусу.

(не задано)

Абсолютні шляхи, під якими символьні посилання можуть виходити за межі DOCUMENT_ROOT. Не задано — вихід заборонено.

Логи, трасування та профілі

39 змінних
Змінна За замовчуванням Опис
info

Докладність власної діагностики сервера: trace, debug, info, warn, error. Не фільтрує журнал доступу; розриви зʼєднань клієнтами логуються на рівні debug.

(не задано)

Журнал доступу для кожного запиту: all — усі запити, error — лише 4xx/5xx, не задано — вимкнено.

(не задано)

Внутрішній сервер (/health, /metrics, /config). Значення лише з портом привʼязуються до 127.0.0.1; не задано — не запускається.

(не задано)

Список дозволених CIDR для внутрішнього сервера; стороннім — 403, проби здоровʼя лишаються доступними. Loopback не дозволено неявно.

(не задано)

Тека з власними сторінками помилок {status}.html.

524288

Максимальний розмір тіла для внутрішніх ендпоінтів запитів у байтах (512 KiB).

false

Поширення W3C Trace Context: зчитує traceparent/tracestate і передає їх у PHP через $_SERVER.

false

Увімкнути експорт спанів OpenTelemetry. Передбачає TRACE_CONTEXT=true.

grpc

Протокол експорту: grpc або http/protobuf.

localhost:4317 / 4318

Ендпоінт OTLP-колектора. З http/protobuf це базовий URL: спани надсилаються на /v1/traces під ним.

10000

Тайм-аут експорту в мілісекундах. Через gRPC він також обмежує підключення до колектора, включно з рукостисканням TLS, а на Linux визначає, як швидко закривається зʼєднання, що перестало приймати дані.

(не задано)

Заголовки автентифікації: key=value,key2=value2.

oxphp

Назва сервісу в експортованих спанах.

(не задано)

Атрибут версії сервісу.

(не задано)

Додаткові атрибути ресурсу: env=prod,region=us-east-1.

parentbased_traceidratio

Стратегія семплювання: always_on, always_off, traceidratio та варіанти parentbased_*.

1.0

Частка семплювання 0.0–1.0 для семплерів на основі частки; значення поза діапазоном обрізаються до меж.

false

APM: автоінструментування 34 PHP-функцій (PDO, mysqli, cURL, Redis…), перехоплення помилок, SDK трасування. Потребує OTEL_ENABLED. Коли вимкнено, oxphp_apm_trace() однаково виконує свій колбек.

100

Поріг повільного запиту в мс; повільніші запити до БД отримують oxphp.db.slow=true.

false

Записувати параметри привʼязки в спани db.params. Вони записуються як є (без маскування), тож у трасування можуть потрапити персональні дані — вмикайте лише там, де це прийнятно.

8192

Обмеження атрибута exception.stacktrace; обрізається з кінця. 0 — без обрізання.

4096

Обмеження атрибута exception.message (ліміт New Relic на один атрибут); обрізається з кінця. 0 — без обрізання.

false

Головний перемикач. Інші змінні PROFILER_* однаково розбираються, тож помилки в них виявляються під час запуску.

0.0

Імовірність 0.0–1.0, що запит потрапить у вибірку.

false

Також семплювати запити до внутрішнього сервера.

(не задано)

Секрет, який мають містити явні тригери (заголовок X-OxPHP-Profile, кука OXPROF, параметр запиту __oxprof), і bearer-токен для /__profiler/*. Не задано — без токена. Семплювання та функції OxPHP\Profile\* його ніколи не перевіряють.

50000

Обмеження кількості спанів на запит; довші профілі обрізаються.

0 (no cap)

Максимальна глибина вкладеності записаних викликів; час глибших викликів додається до виклику на межі. Обмежується значенням 32.

/tmp/oxphp-profiles

Тека для профілів на диску.

xhprof,speedscope

Формати, що записуються на диск: xhprof, speedscope, pprof, flamegraph.

10

Обмеження кількості файлів профілів, записаних за секунду.

100

Максимум збережених файлів профілів; старіші видаляються.

(не задано)

Віддалений ендпоінт, куди профілі надсилаються через POST.

xhprof

Формат передавання для експорту.

(не задано)

Bearer-токен, що надсилається з кожним експортом.

(auto-detect)

Обгортка, сумісна з XHGui; не задано — автовизначення за URL.

(auto-detect)

Конверт Buggregator (завжди xhprof); не задано — автовизначення за URL. Взаємовиключний із PROFILER_EXPORT_XHGUI.

(не задано)

app_name для Buggregator, щоб групувати за проєктами.

(не задано)

Теги Buggregator: key=value,key2=value2. Некоректні токени — помилка запуску.

Асинхронність і спільний стан

18 змінних
Змінна За замовчуванням Опис
off

Опційні заміни блокувальних вбудованих функцій, що призупиняють файбер. Категорії: sleep (нативні sleep/usleep), streams (блокувальні читання tcp:// і stream_select), net (встановлення зʼєднань, рукостискання й читання TLS, записи, що чекають на місце в буфері, читання unix:// / udp:// / udg:// — потребує streams, лише Linux). 1/true/all — усі категорії. Встановлений набір видно як runtime_hooks у /config.

0 (off)

Виділені потоки асинхронних воркерів. 0 — функції зареєстровано, але під час виклику вони кидають AsyncException.

ASYNC_WORKERS × 64

Максимум завдань в очікуванні в асинхронній черзі. 0 — автоматично.

256

Обмеження кількості одночасних файберів завдань на воркер; загальна межа одночасних завдань = файбери × воркери.

true

Головний перемикач усієї підсистеми OxPHP\Shared\*. Вимкнено — її класи взагалі не реєструються; перевіряйте через class_exists().

100000

Загальне обмеження кількості живих обʼєктів Shared (ключі Map не враховуються); створення обʼєкта понад нього кидає CapacityException.

1 GiB

Загальне обмеження оціненої памʼяті всіх обʼєктів Shared, перевіряється лише під час створення обʼєкта.

true

Вмикає й вимикає експонування метрик Prometheus oxphp_shared_*.

true

Вмикає й вимикає API інтроспекції /__ox_shared/*.

true

Попередній перегляд значень у відповідях інтроспекції; вимкніть, якщо він може розкрити дані.

16

Глибина BFS для перевірки циклів; збільште для глибоких графів.

10000

Кількість ребер, що обходяться під час перевірки циклів; збільште для щільних графів.

1 MiB

Обмеження розміру одного значення; більші вставки одразу завершуються помилкою.

64 MiB

Обмеження сумарного обсягу даних на канал.

warn

Детектор взаємоблокувань для Shared\Mutex: off, warn (логувати й рахувати цикли) або strict (розривати їх через DeadlockException). У debug-збірках типово strict.

100

Як часто детектор взаємоблокувань сканує, у мс.

256

Обрізання кожного рядка в попередньому перегляді, у байтах, по межі символу.

20

Кількість елементів у вибірці для попереднього перегляду /entry.

Пресети

Приклади конфігурацій

Відправні точки просто з документації — скопіюйте одну й підлаштуйте під себе.

# докладні логи під час розробки
LOG_LEVEL=debug
# записувати всі запити, не лише помилки
ACCESS_LOG=all
# один воркер — зручно для налагодження
PHP_WORKERS=1
# локальні /health, /metrics, /config
INTERNAL_ADDR=127.0.0.1:9090
# перечитувати статику без перезапуску
STATIC_REVALIDATE=on
Переглянути чинну конфігурацію

Коли внутрішній сервер запущено, /config повертає підсумкову конфігурацію у форматі JSON. Шляхи до TLS, INTERNAL_ADDR та ERROR_PAGES_DIR у відповіді приховано.

curl -s http://localhost:9090/config | jq .

Нульова конфігурація — теж конфігурація

Кожне значення за замовчуванням вище дібране так, щоб порожнє середовище просто працювало.