#[serde(deny_unknown_fields)] is applied throughout. Durations use humantime format: "30s", "500ms", "2m", etc.
Top-level structure
node
Controls worker count, connection limits, and global I/O timeouts.
io_uring
Controls the io_uring ring parameters for each worker thread. All fields require a process restart to change.
If
arc_ring_sq_dropped_total or arc_ring_cq_overflow_total are non-zero, the ring is too small. Double uring_entries.listeners
An array of listener entries. Each entry binds one address.
Listener kinds:
socket options:
tls
Active only when listener kind is https or h3.
certificates entries:
The first certificate in the array is the default when no SNI matches.
tls.acme
Enables automatic certificate issuance and renewal from an ACME CA.
account_key:
challenge types:
Full ACME configuration example:
upstreams
An array of named backend groups. Routes reference upstreams by name.
discovery
Static endpoints:
lb — load balancing
Consistent hash key sources:
client_ip, header (with name), or cookie (with name).
health
Active health checks (proactive polling):
pool — connection pool
timeouts — upstream timeouts
tls — upstream TLS
Optional. When present, Arc opens TLS connections to the upstream endpoints.
See TLS & Certificates for full upstream TLS examples.
routes
An array of route rules. Routes are evaluated by specificity — exact matches win over wildcards; longer patterns win over shorter ones.
match
Path patterns:
Header predicates (
op field): exists, contains, regex, equals. All require name; value-based ops also require value or pattern.
action
Header mutations (
op field): add, set, remove.
Retry policy:
rate_limit
Key strategies:
client_ip, header (with name), or route (single shared limit).
mirror
split — traffic split
plugins
Global plugin registry. Routes reference plugins by name.
WASM plugin fields
Rhai script fields
Attaching plugins to a route
observability
Controls the metrics and admin server. See also logging below for access log configuration.
logging
Controls the structured NDJSON access log. logging is a top-level key, separate from observability.
logging.output:
logging.access:
observability.access_log.sample(default1.0) andlogging.access.sample(default0.01) are two separate fields.observability.access_log.sampleis an older knob;logging.access.sampleoverrides it. Uselogging.access.samplefor all new configuration.
logging.redact:
logging.writer:
control_plane
All
control_plane fields require a process restart to change.
See Gateway control plane API reference for endpoint documentation.

