约 40 个字段 · 约束核对自 src/core/config.h

xs.json 字段参考

配置装载 fail-fast:任何字段非法都在启动时点名具体字段并退出。未列出的字段不会报错——它们进入 Custom 留给应用读取(见 ref-xsapi 的 xsConfigRoot)。

根级字段(2)

字段类型 / 默认约束与说明
engine.workersuint · 00–1024;0 = xrt 默认。热重载不可变,变更被拒绝
services数组 · 必填缺失或非数组:field 'services' expect array 启动失败

服务级字段(services[i],13)

字段类型 / 默认约束与说明
enabledbool · true服务开关
classstring · 必填白名单 http / ws / tcp / udp / custom / app,其余 fail-fast(app = http 节点前端化,见 app 节点)
namestring · 必填全局唯一(重复报 duplicate name);xsServerFind 的键
ipstring · 0.0.0.0监听地址;app 类默认 127.0.0.1(回环绑定不触发 Windows 防火墙弹窗)
portuint · —1–65535;非 custom 必填(missing port);0 = OS 自动分配,仅 app 类允许(其他类报 port 0 (auto) is only supported for class 'app'),实际端口经 XS_ServerInfo.PortBound 回读
tlsbool · false启用 TLS 端口;udp 上禁止(tls on udp)
port_tlsuint · 443与明文端口同 IP 冲突时拒绝启动
ip_tlsstring · 复用 ipTLS 监听地址
backloguint32 · —直通 xrt 监听配置;范围校验
recv_limitsize · —≤SIZE_MAX;udp 上 ≤65535(recv limit out of range)
path / devlang / devfilestring · —服务级脚本缺省,合成进 DefaultHost
dev_inc / dev_libstring · —脚本 include / 库搜索目录(分号分隔,相对 appPath)
其余字段任意进入 server->Custom(应用经 XS_CustomReadUInt 等自读)

app 节点(class: "app" 专属,window 9 字段)

class: "app" 不是第六种协议,而是 http 节点的前端化:内部完全走既有 http 装配路径(host_default / hosts / static / TLS / 热重载全部同义),只多一个 window 描述符与前端生命周期——启动显示加载窗 → 服务就绪自动打开 window.url → 关窗按 close 语义优雅停机。窗口是显示层、服务是本体:窗口线程任何失败只降级为日志,绝不让引擎装配与停机链走 fail 路径。

window 字段类型 / 默认约束与说明
titlestring · "xs app"窗口标题
width / heightuint · 1280 / 800初始尺寸(像素);取值范围 200–32767
min_width / min_heightuint · 0最小尺寸限制;0 = 不限制
urlstring · "/"就绪后打开的页面;相对路径用实际端口拼 http://<ip>:<PortBound>/…,允许绝对 URL
devtoolsbool · false启用 WebView2 开发者工具
closestring · "stop"stop = 关窗优雅停掉整个进程;hide = 隐藏窗口服务继续(再次双击经单实例检测唤起既有窗口;停服务走信号路径)
install_fallbackstring · "ask"Runtime 缺失时的兜底(取值见下表);任何失败一律落到 headless 继续
install_fallback 取值语义
"ask"弹窗问询是否安装 WebView2 Runtime(面向普通用户的缺省形态)
"silent"静默下载安装,无人值守场景
"headless"不尝试安装,直接降级为 headless 服务

port: 0 自动分配:仅 app 类允许(其他类 fail-fast);内核原子分配后回读实际端口(不做"探测→关闭→再绑定",避免 TOCTOU 竞态)。热重载按服务名粘滞(跨 generation 稳定,已开窗口无感知换端);跨重启稳定请配固定端口。完整平台 / 变体降级矩阵见 webview 参考页。

主机级字段(host_default / hosts[i],9)

字段类型 / 默认约束与说明
enabledbool · true主机开关
namestring · 必填server 内唯一、非空(重复 / 空均 fail-fast)
hoststring · —分号分隔域名;http/ws 的启用 vhost 必填非空
pathstring · —静态资源根;目录缺失 fail-fast
devlangstring · —static 纯静态 / c TCC 脚本 / 应用自定
devfilestring · —脚本入口;文件缺失编译失败
tls_ca / tls_cert / tls_keystring · —PEM 路径;host 级证书 → SNI 表数据源
dev_inc / dev_libstring · —host 级脚本搜索路径
其余字段任意进入 host->Custom(static.* 旋钮见下)

host_default 恒存在(未配置时由服务级脚本字段合成);hosts[] 数量不限,vhost 未命中时回落 default。

Custom 旋钮(server 级,应用自读)

字段类型 / 默认说明
header_limituint · —请求头上限(超限 431)
path_limituint · 2048路径长度上限(超限 414)
body_limituint · —请求体上限(超限 413)
idle_timeoutuint · —空闲超时毫秒(http/ws/tcp),到点服务端关闭
ws_message_limituint · —WS 消息上限,超限 close 1009
ws_protocolstring · —强制子协议;启动时校验合法性,类型错误 fail-fast

读取方式:配置进 server->Custom(xvalue),demo 用 XS_CustomReadUInt 严格非负解析。

静态层旋钮(host 级 Custom)

字段类型 / 默认约束与说明
static.headers对象 · —≤8 字段;禁 8 种保留头(含 Transfer-Encoding、Connection),违者 fail-fast
static.index数组 · index.html目录索引候选,逐个回落
static.error_pages对象 · —键必须 400–599(越界 fail-fast);值相对 path 的错误页路径
static.deny_dotfilesbool · true点开头文件恒拒(含穿越尝试)

路径解析规则

  • 所有文件路径按配置文件所在目录转绝对路径——配置目录自包含,可整体搬移
  • 不带参数运行时,XServer 在可执行文件所在目录找 xs.json;参数可显式指定
  • dev_inc 相对路径相对 appPath;注意第 6 章的"诱饵头"边界

acme 节(证书自动续签,需 xacme 扩展)

根级 acme 节启用内置 ACME 守护:每日定时检查,证书剩余寿命不足阈值时自动 DNS-01 续签并热替换(连接不断)。凭据全部走独立文件(不进 xs.json):账户私钥、DNS 凭据、EAB、信任锚。

字段类型 / 默认约束与说明
enabledbool · false总开关;false 时守护不启动
account_key_filestring · —账户私钥 PEM(ES256);空 = 各 CA 首用时自注册。同一把钥可在多个 CA 各自开户
emailstring · —ACME 账户联系邮箱
dns_key_filestring · 必填DNS-01 凭据 JSON:{"access_key_id":"…","access_key_secret":"…"}(当前支持 alidns)
renew_before_daysuint · 301–89;剩余寿命不足该天数即触发续签
check_timestring · —每日固定检查时刻 "HH:MM"(00:00–23:59);与 check_interval_hours 互斥
check_interval_hoursuint · 12间隔制(1–720);启动 5 分钟后首查,此后按间隔
certs[]数组 · 必填证书组:{name, domains[], out_dir}——一张证书组 = 一个 tls 目录,续签产物按 acme.sh 同构布局写入(cert.pem=叶 / ca.pem=中间链 / key.pem / fullchain.pem)

directories[](CA 回退链)

字段必填说明
name否展示名;空 = 取 URL 域名
url是ACME directory 地址;URL 去重 fail-fast
ca_file否该 CA 的信任锚 PEM;空 = 系统信任库
eab_kid_file / eab_hmac_file成对需 EAB 注册的 CA(如 litessl)填;只填一个 fail-fast

兼容:单字段 directory(+ 根级 ca_file)等价单元素链,与 directories 同现报错。运行语义:首个成功者胜出——按序逐 CA 尝试,某 CA 失败自动落下一个;本地证书充足时不联系任何 CA;到期续签从链首重试(主 CA 恢复自动回归)。守护线程自建网络引擎、配置启动时深拷贝(重启生效)。

续签判断的依据是 acme-store/ 内的证书(非 host tls 目录);强制重签 = 删 acme-store/certs/<主域名>/ 后重启(5 分钟后首查)。无 xacme 变体:配置存在时打提示忽略,守护恒空操作。