Skip to content

Командная строка

Rapira — это один бинарник с единственной подкомандой:

bash
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 считается от каталога самого файла конфигурации: файл вместе с лежащим рядом приложением можно целиком перенести, скопировать или примонтировать куда угодно, и путь всё равно разрешится верно.
toml
[pool]
entrypoint = "public/index.php"

Если это лежит в /etc/rapira/rapira.toml, входным скриптом будет /etc/rapira/public/index.php — из какого каталога вы запустили команду, совершенно неважно.

Примеры

Типичные запуски:

bash
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, поэтому сервер поднимается на адресе по умолчанию, и отправить ему запрос — ещё одна строка. Воркер-скрипт, который можно запустить этой командой, есть в разделе Быстрый старт.

bash
curl http://127.0.0.1:8000/

Остановка сервера

Первый SIGINT или SIGTERMCtrl-C в терминале или сигнал от системы инициализации — даёт доработать уже начатым запросам и аккуратно выключает расширения, а второй прекращает ожидание и завершает процесс принудительно. Сигналы принимает мастер-процесс, а полная их таблица, вместе с перезагрузкой, есть в разделе Модель процессов.