Configuration reference
Every setting the configuration file understands, what it accepts, and the value it takes when you leave it out.
An INI-style file of named sections. The configuration guide covers how the pieces fit together and is the better place to start; this page is the exhaustive list to come back to.
Every setting here can also be given as an environment variable, which is what makes a container image configurable without rewriting the file inside it. The name is the section and the key joined by an underscore and upper-cased — SSLB_SYSTEM_MAXCONNECTIONS, SSLB_THREAT_MODE.
[System]
Process-wide settings. One of these sections.
[Log]
Where records go and how much is written. Access logging is off globally and turned on per route with the enable-access-log annotation, or per listener in the file.
[Listener-name]
One section per bound socket, named after the hyphen — [Listener-https] is a listener called https. As many as you need.
listeners.conf
[Listener-http] ListenPort = 8080 Serverfarm = web RedirectToTLS = true [Listener-https] ListenPort = 8443 Protocol = tls CertificateFile = /etc/sslb3/tls/fullchain.pem PrivateKeyFile = /etc/sslb3/tls/privkey.pem Serverfarm = web Layer7Module = http [Listener-postgres] ListenPort = 15432 Serverfarm = postgres AllowSourceRange = 10.0.0.0/8
[Serverfarm]
The defaults every farm inherits. One of these sections, and every setting in it can be overridden per farm below.
[Serverfarm-name]
One per farm. Anything left out here falls back to [Serverfarm] above — that is the whole point of the split, so a farm section usually holds two or three lines rather than a copy of the defaults.
The Match* settings are the exception: they exist only here, because they are what distinguishes one farm from another. They are how routing happens natively in Rust rather than through a script.
farms.conf
[Serverfarm] Balancer = round-robin HealthCheck = true ConnectTimeout = 10 [Serverfarm-web] MatchHost = shop.example.com, www.shop.example.com Layer7Module = http [Serverfarm-api] MatchHost = shop.example.com MatchPath = /api/ Balancer = least-connections Layer7Module = http [Serverfarm-postgres] Balancer = least-connections HealthCheckType = tcp
Both farms above answer for the same host; the one with MatchPath is more specific, so /api/orders goes to the API farm and everything else to the web farm. Host and path are combined by AND.
[RealServer-name]
A backend. One section each, assigned to a farm by name.
backends.conf
[RealServer-web1] IPAddress = 10.0.1.11 Port = 8080 Serverfarm = web Weight = 2 [RealServer-web2] IPAddress = 10.0.1.12 Port = 8080 Serverfarm = web # Drained: configured, but taking no traffic. Only the weighted # balancer reads Weight, so this drains under Balancer = weighted # and is ignored under round-robin or least-connections. [RealServer-web3] IPAddress = 10.0.1.13 Port = 8080 Serverfarm = web Weight = 0
[HealthCheck]
How a probe is performed, when a farm has health checking on. Checks run on their own schedule rather than on the request path, so a request never waits for one.
health.conf
[HealthCheck] Type = http CheckURL = /healthz CheckPeriod = 10 ResponseTimeout = 3 FailTolerance = 3
[AdminAPI]
The configuration API. TLS-only and authenticated, always — it changes configuration, so there is no plaintext mode and no anonymous one. This is what the ingress controller talks to.
[Threat]
Intrusion detection and prevention. Every rate below is a count over Window seconds from a single source address, and every one of them is zero by default, meaning "do not watch this" — a rate that is abusive for one deployment is ordinary for the next, so there is no default I could pick that would be right for yours.
threat.conf
[Threat] # Count and report, refuse nobody. Where every rollout should start. Mode = detect Window = 10 BlockDuration = 300 # One request for /.env or /.git/config has no innocent reading, # so one is the threshold. ProbeRate = 1 # A browser does not send malformed HTTP. Low threshold, high confidence. MalformedRate = 5 # Path enumeration and credential stuffing. NotFoundRate = 40 DeniedRate = 20
[LUA]
The scripts, and the limits they run under. Every hook is optional and unset by default — Lua is available, not required, and a deployment that never names a script never loads one.
[Prometheus]
The metrics endpoint: its own listener, off until you turn it on. See metrics and the statistics page.
[Stats]
The live statistics page, off on the same terms and for the same reason.
observability.conf
[Prometheus] Enabled = true ListenPort = 9101 Path = /metrics [Stats] Enabled = true ListenPort = 9102 Path = / RefreshInterval = 2
Both bind every interface when enabled, because a scraper or a browser is on another machine by definition and a loopback default would start, log that it is listening, and never be reachable. Both are unauthenticated and describe your whole deployment, so put them somewhere deliberate.
[FastPath]
Whether the kernel may forward eligible layer 4 services instead of SSLB3 copying their bytes. How eligibility is decided is its own page.
fastpath.conf
[FastPath] # auto: hand over what can be handed over, and a service staying # behind is ordinary rather than a fault. Mode = auto Backend = auto # Set false only where the network can route replies back without it -- # DSR-style. Leaving it on is correct nearly everywhere. SourceNat = true
Kubernetes deployments set most of this through the Helm chart rather than by editing a file. The install page covers the values, and the annotation reference covers what an individual Ingress can override.