Командная строка
Rapira — это один бинарник с единственной подкомандой:
rapira serve [OPTIONS] [SCRIPT]Именно serve поднимает сервер: запускает PHP, регистрирует встроенные расширения и начинает отвечать на запросы. Голая команда rapira без аргументов печатает справку и выходит, а rapira serve --help перечисляет те же опции, что и раздел ниже, прямо из бинарника. Какая у вас сборка, скажет rapira --version.
Файл конфигурации не обязателен: одной команды с путём к скрипту хватает на полноценный рабочий сервер, а файл нужен тогда, когда флагов перестаёт хватать.
Как накладываются настройки
Значение настройки складывается максимум из трёх слоёв, и заглядывают в них в таком порядке:
Флаги командной строки > файл конфигурации > встроенные значения по умолчанию.
Из командной строки задаются только четыре флага из таблицы ниже и аргумент SCRIPT; всё остальное приходит из файла или берётся по умолчанию.
Флаг всегда сильнее того же значения в rapira.toml, а rapira.toml всегда сильнее значения по умолчанию. Такой порядок позволяет держать постоянные настройки в файле и на один запуск перекрывать из командной строки ровно одно значение — другой порт на время проверки, больше воркеров на машине помощнее — ничего при этом не редактируя.
Всё, что вы не задали вовсе, доходит до значений по умолчанию из таблицы ниже. Настройки, которых нет среди флагов, — масштабирование пула, логирование, ограничения на запросы — приходят из файла, а полный список того, что вообще умеет файл конфигурации, собран в разделе Конфигурация.
Опции
| Опция | По умолчанию | Что делает |
|---|---|---|
--config <PATH> | нет | Загрузить настройки из rapira.toml. |
--listen <ADDR> | 127.0.0.1:8000 | Адрес прослушивания: host:port, :port (все интерфейсы) или unix:<path>. |
--processes <N> | по числу CPU | Сколько воркеров форкать. |
--classic | выключено | Выполнять скрипт заново на каждый запрос, а не держать его резидентным. |
SCRIPT | обязателен* | Входной PHP-скрипт. Перекрывает pool.entrypoint из файла конфигурации. |
* Обязателен, если в файле конфигурации не задан pool.entrypoint. Когда нет ни того, ни другого, serve сообщает об ошибке и не запускается.
--listen принимает три формы. 127.0.0.1:8000 (значение по умолчанию) занимает один интерфейс, петлевой, поэтому извне машины к серверу подключиться нельзя. :8080 — сокращение для 0.0.0.0:8080, то есть все интерфейсы IPv4; в контейнере обычно привязываются именно так, а для IPv6 пишите [::]:8080. unix:/run/rapira.sock вместо сетевого адреса поднимает Unix-сокет — вариант для обратного прокси на той же машине. Адреса IPv6 берутся в квадратные скобки: [::1]:8000. Голый порт адресом не считается и отвергается, потому что не говорит, занимать только петлевой интерфейс или все сразу: --listen 8080 — ошибка, пишите --listen :8080 или --listen 127.0.0.1:8080. В хостовой части должен стоять IP-литерал, имена хостов не разрешаются никогда, поэтому --listen localhost:8000 — тоже ошибка; пишите --listen 127.0.0.1:8000.
--processes по умолчанию равен числу логических процессоров. В статическом пуле, который включён по умолчанию, столько воркеров и форкается; если файл конфигурации переводит пул в режим dynamic или ondemand, то же число становится потолком, до которого эти режимы масштабируются. Чем на самом деле заняты воркеры и мастер-процесс, разбирает Модель процессов.
--classic выбирает режим, в котором работает приложение. Без него входной скрипт загружается один раз и остаётся резидентным — это режим SAPI Worker; с ним скрипт подключается заново на каждый запрос, ровно как под php-fpm, — это режим Classic. Если не уверены, какой из них подходит вашему приложению, все четыре режима описаны в разделе Режимы выполнения.
--classic — переключатель, который умеет только включать. Флага --no-classic не существует, поэтому classic = true в файле конфигурации из командной строки не отключить: уберите ключ из файла.
Разрешение пути к входному скрипту
Скрипт можно задать дважды — позиционным аргументом SCRIPT и ключом pool.entrypoint в файле конфигурации, — и если заданы оба, побеждает командная строка, а все остальные настройки из файла продолжают действовать. В любом случае Rapira разворачивает путь в абсолютный ещё до того, как сервер начнёт форкать процессы: рабочий каталог демона — совсем не тот каталог, куда вы разложили приложение.
У двух относительных форм разные точки отсчёта:
- Относительный
SCRIPTв командной строке считается от текущего каталога. - Относительный
pool.entrypointсчитается от каталога самого файла конфигурации: файл вместе с лежащим рядом приложением можно целиком перенести, скопировать или примонтировать куда угодно, и путь всё равно разрешится верно.
[pool]
entrypoint = "public/index.php"Если это лежит в /etc/rapira/rapira.toml, входным скриптом будет /etc/rapira/public/index.php — из какого каталога вы запустили команду, совершенно неважно.
Примеры
Типичные запуски:
rapira serve app/worker.php
rapira serve --classic public/index.php
rapira serve --listen :8080 --processes 8 app/worker.php
rapira serve --listen unix:/run/rapira.sock app/worker.php
rapira serve --config /etc/rapira/rapira.toml
rapira serve --config /etc/rapira/rapira.toml --listen 127.0.0.1:9000В первой команде нет --listen, поэтому сервер поднимается на адресе по умолчанию, и отправить ему запрос — ещё одна строка. Воркер-скрипт, который можно запустить этой командой, есть в разделе Быстрый старт.
curl http://127.0.0.1:8000/Остановка сервера
Первый SIGINT или SIGTERM — Ctrl-C в терминале или сигнал от системы инициализации — даёт доработать уже начатым запросам и аккуратно выключает расширения, а второй прекращает ожидание и завершает процесс принудительно. Сигналы принимает мастер-процесс, а полная их таблица, вместе с перезагрузкой, есть в разделе Модель процессов.