xs.json подробно · поля уровня сервиса
xs.json — единственный интерфейс сборки XServer. Глава разбирает каждое предустановленное поле services[i] — не только «как писать», но и «что произойдёт при ошибке».
Обзор
7.1 Введение
У конфигурационных систем две типовые болезни. Первая — расхлябанность: поле с опечаткой молча игнорируется и всплывает только в продакшне. Вторая — рассеяние: поведение размазано по конфигам, переменным окружения и командной строке. Ответ xs.json — fail-fast и единый источник: любое недопустимое предустановленное поле называется и отклоняется при старте, а любое непредустановленное поле без изменений уходит в Custom приложению — поле, которого хост не знает, никогда не проглатывается и никогда не получает угаданного смысла.
7.2 Пять классов протоколов (class)
| class | Семантика | Колбэки скрипта |
|---|---|---|
http | HTTP/1.1 + HTTPS (переключатель TLS) | RequestProc |
ws | WebSocket + WSS | WsOpen/Text/Binary/Ping/Pong/Close |
tcp | Голый поток / поток TLS | EventOpen/Data/Close |
udp | Дейтаграммы (без TLS) | EventDgram |
custom | Событийный собственный сервис | Определяет приложение (через вход Engine) |
Значения вне белого списка сразу fail-fast. Критерий выбора прост: что говорит браузер — http/ws; байтовые потоки — tcp; без соединений — udp; остальное делайте сами.
7.3 Поля эндпоинтов
{
"ip": "0.0.0.0", /* адрес прослушивания, по умолчанию все интерфейсы */
"port": 80, /* порт открытого текста, обязателен кроме custom */
"tls": true, /* включить TLS-порт; для udp запрещено */
"port_tls": 443, /* по умолчанию 443; конфликт с портом открытого текста на том же IP отклоняется */
"ip_tls": "0.0.0.0" /* по умолчанию совпадает с ip */
}
Что только что произошло: у сервиса максимум два эндпоинта (открытый текст + TLS). Правило конфликтов — проверка на старте: совпадение портов открытого текста и TLS на одном IP отклоняется сразу, никакого молчаливого «последний победил». Пути сертификатов — не уровень сервиса: они на уровне хоста (глава 8); уровень сервиса решает только «нужен ли TLS-порт».
7.4 Поля лимитов
| Поле | Назначение | Ограничение |
|---|---|---|
backlog | Очередь прослушивания (напрямую в xrt) | Проверка диапазона uint32 |
recv_limit | Предел одного чтения потока | ≤SIZE_MAX; на udp ≤65535 |
recv_limit — линия обороны памяти: потолок данных, втягиваемых за одно чтение. На tcp он формирует пик буфера соединения; на udp дейтаграммы по природе ≤64 КБ, поэтому потолок ужат до 65535. Запросные лимиты header/body — не предустановленные поля сервиса: это ручки Custom (глава 9), их читает http-драйвер.
7.5 Скриптовые умолчания уровня сервиса
Пять скриптовых полей можно указать на уровне сервиса как умолчания для всех хостов:
{
"class": "http",
"name": "my-site",
"port": 8080,
"path": "wwwroot", /* корень статики */
"devlang": "c", /* язык скрипта */
"devfile": "main.c", /* вход скрипта */
"dev_inc": "includes", /* доп. каталоги заголовков (через точку с запятой) */
"dev_lib": "librarys" /* доп. каталоги библиотек */
}
Если host_default не задан, эти пять полей синтезируют DefaultHost — именно поэтому минимальному приложению главы 4 host_default не понадобился. Одноимённые поля уровня хоста переопределяют по одному.
7.6 Контракт
- Валидация: белый список class, port 1–65535, взаимоисключение tls×udp, конфликты портов — всё называется и уходит в fail-fast при старте.
- Умолчания: скриптовые поля уровня сервиса — лишь источник умолчаний для уровня хоста, не вторая система конфигурации.
- Уникальность: name глобально уникален — это ключ xsServerFind в рантайме и описание цели reload.
Частые ошибки
- Симптом
- Старт падает; ошибка называет конфликт портов открытого текста и TLS.
- Причина
- port и port_tls совпадают на одном IP (или каждый сталкивается с другими сервисами).
{ "ip": "0.0.0.0", "port": 8080,
"tls": true, "port_tls": 8080 }{ "ip": "0.0.0.0", "port": 8080,
"tls": true, "port_tls": 8443 }- Симптом
- Старт падает: tls on udp.
- Причина
- UDP — дейтаграммный протокол; XServer не строит TLS поверх UDP — защищённый UDP-транспорт остаётся за приложением (например, соберите DTLS-подобную схему сами).
{ "class": "udp", "port": 9000,
"tls": true }{ "class": "udp", "port": 9000 }Упражнения
Напишите xs.json с четырьмя сервисами — http (8080), ws (8081), tcp (8082), udp (8083) — все работоспособны на варианте default (скрипты могут ничего не экспортировать).
По очереди создайте: port вне диапазона, port отсутствует, конфликт портов открытый текст/TLS, tls on udp — зафиксируйте каждое сообщение.
Включите TLS-порт у http-сервиса с сертификатом (подойдут тестовые сертификаты репозитория home), обратитесь curl'ом к обоим эндпоинтам и сравните поведение рукопожатия.
Итоги
| Тезис | Вывод |
|---|---|
| Пять классов | http / ws / tcp / udp / custom; белый список fail-fast |
| Эндпоинты | Два эндпоинта: открытый текст + TLS; конфликт на одном IP отклоняется |
| Лимиты | backlog напрямую в xrt; recv_limit на udp ≤65535 |
| Скриптовые умолчания | Пять полей сервиса синтезируют DefaultHost; уровень хоста переопределяет по одному |
| Шпаргалка | справочник полей ref-config |
- справочник xrt · net — низкоуровневая семантика опций слушателя backlog / REUSE_PORT
- справочник xrt · udp — размер дейтаграмм и связь с recv_limit