限制、超时与常量
编译期常量
| 宏 | 值 | 在哪用 |
|---|
CFD_EDGE_DEFAULT / CFD_EDGE_DEFAULT_PORT | region1.v2.argotunnel.com / 7844 | cfd_tunnel_edge 默认值 |
CFD_EDGE_SNI | h2.cftunnel.com | 边缘 TLS 的 SNI 与证书校验名(常量,与 cfd_tunnel_edge 无关) |
CFD_CONNECT_TIMEOUT_MS | 5000 | TCP 连接超时默认值 |
CFD_HANDSHAKE_TIMEOUT_MS | 10000 | TLS 握手超时默认值 |
CFD_BQ_HWM_DEFAULT | 1 MiB | 单流背压高水位默认值 |
CFD_GLOBAL_BQ_DEFAULT | 64 MiB | 全局背压预算默认值 |
CFD_STALL_WINDOW_DEFAULT | 60000 ms | 停滞窗口默认值 |
CFD_STALL_RATIO_DEFAULT | 0 | 比例判据默认关闭 |
CFD_STALL_MIN_BQ_DEFAULT | 512 KiB | 停滞判据的最少积压 |
CFD_REJECT_RATIO_DEFAULT | 90 % | 拒新流阈值 |
CFD_RESP_HWM | 256 KiB | 响应方向待写字节高水位 |
CFD_HOUSEKEEPING_TICK | 1000 ms | 内务定时器周期(背压/超时采样) |
CFD_TUNNEL_READ_BUDGET | 64 | 单次事件循环里每条隧道最多处理的事件数(≤ 1 MiB / 事件) |
CFD_CFG_BODY_MAX | 4 MiB | 远程配置体上限 |
CFD_CFG_RESP_MAX | 4096 B | 远程配置应答缓冲 |
CFD_MATCH_PATH_MAX | 4096 B | 超长 path 不做规则匹配(按最后一条兜底 + WARN) |
CFD_REQ_MAX_HDRS / CFD_REQ_NAME_MAX | 192 / 64 B | 请求 trailer 条目数 / 单个 name 长度 |
CFD_JSON_MAX_DEPTH / CFD_JSON_MAX_NODES | 64 / 262144 | 模块自带 JSON 解析器的深度与节点上限 |
CFD_CREDS_TAG_MAX / CFD_CREDS_SECRET_MAX | 64 / 64 B | 凭据字段缓冲 |
每条虚拟连接的资源占用
| 资源 | 数量 | 说明 |
|---|
| 连接槽 | 1 个 | 来自 ngx_get_connection(),与真实客户端连接抢同一个 connections 数组 |
| fd | 2 个 | socketpair(AF_UNIX) 的两端:sv[0] 是 c->fd(身份载体,数据不走它),sv[1] 只作对端占位、随连接池 cleanup 关闭 |
| 连接池 | listener->pool_size | ngx_create_pool(target->ls->pool_size),合成请求头块与槽位表都在里面 |
| 槽位映射 | 指针数组 connection_n 项 | 按 c - ngx_cycle->connections 下标 O(1) 查表,随 connection_n 变化重建 |
所以并发注入的连接数同时受 worker_connections 与 RLIMIT_NOFILE 约束,而且每条要按 两个 fd 留余量(nginx 的 worker_rlimit_nofile 就是这么算的)。注入不存在「额外的 socket 连接」—— 这些 fd 不承载任何数据,只用来让 nginx 的连接生命周期保持原生。
超时与重连的默认值一览
| 项 | 默认 | 指令 |
|---|
| TCP 连接 | 5 s | cfd_tunnel_connect_timeout |
| TLS 握手 | 10 s | cfd_tunnel_handshake_timeout |
| 心跳 | 关闭 | cfd_tunnel_ping_interval(建议生产 15 s) |
| 心跳判死 | 15 s | cfd_tunnel_ping_timeout |
| 重连退避初值 / 上限 | 1 s / 60 s | cfd_tunnel_reconnect_delay / _max |
| 快速隧道 provisioning | 15 s | cfd_tunnel_quick_timeout |
| 远程配置下发 | 读完一个完整 JSON 值就应答 | — |
nginx 侧的门槛(不是模块的)
| 指令 | 默认 | 影响 |
|---|
client_max_body_size | 1m | 大的上传会被 nginx 自己回 413 |
client_body_timeout | 60s | 慢上传断连 |
proxy_read_timeout | 60s | WebSocket 空闲连接会被切 |
明确不支持(不是「还没配」)
| 能力 | 处置 |
|---|
stream {} 级裸 TCP | 不支持(模块在 HTTP 链上) |
| 裸 TCP 隧道流(ssh / rdp / smb / tcp / bastion) | 传输层 RST_STREAM(REFUSED_STREAM) |
远程配置里的 unix: / hello_world / 未知 scheme | 本地没写 inject_listen 时 502 |
| 远程 path 正则的完整子集 | 只支持字面量 / 两端 ^$ / .* / .+;其余整份拒绝 |
token 里的 e(区域) | 启动期报错,不猜地址 |
| tracing / OTel 生成 | 未实现 |
| punycode 主机名变体 | 未实现(用主人名写法) |
OTP / --allowed-mail(quick tunnel 保护) | 未实现 |