Skip to main content
Unknown fields cause a deserialization error because #[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:
DNS-based discovery:

lb — load balancing

Consistent hash key sources: client_ip, header (with name), or cookie (with name).

health

Active health checks (proactive polling):
Passive health checks (outlier ejection):

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

Plugin stages:

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 (default 1.0) and logging.access.sample (default 0.01) are two separate fields. observability.access_log.sample is an older knob; logging.access.sample overrides it. Use logging.access.sample for 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.

Complete example