Features
Everything Ferron ships with: automatic TLS, modern HTTP, reverse proxying, and observability that makes production debugging fast.
Foundation
One binary, production-grade defaults
Ferron is written in Rust and ships as a single binary with safe defaults, so there is less to install, less to tune, and less that can go wrong.
Memory-safe by construction
The entire server is written in Rust, so whole classes of memory-safety bugs that plague C-based servers simply do not exist. No buffer overflows, no use-after-free.
- No significant C dependencies in the hot path
- Safe concurrency without data races
Single static binary
One file to deploy and upgrade. No interpreter, no runtime to install, no dependency sprawl on your servers.
- Systemd, Docker, and bare-metal friendly
- Replace-the-binary upgrades
Async runtime, tuned by default
A multithreaded async runtime drives predictable performance under load with no tuning knobs required. On Linux, io_uring accelerates large static files and high-concurrency proxying, with automatic fallback.
- Predictable under high concurrency
- Optional io_uring with epoll fallback
Runs where you run
Prebuilt packages and images cover the platforms production actually uses, from servers to Raspberry Pis and mainframes.
- Linux, Windows, macOS, FreeBSD, Docker
- x86-64, ARM64, ARMv7, RISC-V, s390x, PowerPC
Configuration
Configuration is a feature
A compact, readable config file replaces sprawling server blocks. Validate it before you deploy, reuse pieces across hosts, and reload without dropping connections.
Readable config files
Host blocks with plain directives say what they mean. A reverse proxy with automatic TLS is two lines, not twenty.
- Compact block syntax (.conf)
- JSON config for automation
Reuse, don't repeat
Snippets, includes, and named matchers let you define a pattern once and share it across every host you serve.
- Snippets and file includes
- Reusable conditional matchers
Validate before you deploy
Catch mistakes on your machine, not in production. Validation checks syntax and structure; doctor adds best-practice warnings.
- ferron validate for syntax and structure
- ferron doctor for best practices
Reload without downtime
Apply new configuration without dropping connections, via a signal or the admin API. The API also exposes status and runtime endpoints for health checks and inspection.
- SIGHUP and POST /reload
- GET /status and /runtime endpoints
Automatic TLS
TLS you never think about
Public hosts get certificates issued and renewed automatically. Private infrastructure gets its own CA. Either way, secure defaults apply without extra configuration.
Automatic certificates
ACME issuance and renewal happen on their own for public hosts, with any RFC 8555-compliant CA. HTTP-to-HTTPS redirects are on by default.
- Let's Encrypt and any ACME CA
- HTTP-01, TLS-ALPN-01, and DNS-01 challenges
- Automatic renewal before expiry
On-demand issuance
Serve domains you don't know ahead of time. Certificates are issued lazily on first connection, so SaaS-style custom domains scale without pre-provisioning.
- Lazy first-connection issuance
- Scales to thousands of domains
Bring your own trust
Not everything faces the public internet. Use your own certificates or run an internal CA for private services and development.
- Manual certificates and keys
- Local CA for internal networks
- mTLS client authentication
Hardened transport
Modern protocol versions and safe cipher defaults, plus the details that keep TLS fast and trustworthy over time.
- TLS 1.2 and 1.3 with safe defaults
- Automatic OCSP stapling with caching
- Session ticket key rotation
HTTP server
Serve, proxy, and run apps
One server for static sites, reverse-proxied backends, and PHP or CGI apps, with routing, caching, and compression built in rather than bolted on.
Modern protocols by default
HTTP/1.1, HTTP/2, and HTTP/3 are all enabled out of the box. Clients negotiate the best transport they support with nothing to configure.
- HTTP/1.1, HTTP/2, H2C, HTTP/3
- Production-ready QUIC throughput
Static file serving
Point a host at a directory and you're done: index files, directory listings, and precompressed sidecars for faster downloads.
- Index files and directory listings
- Precompressed zstd, Brotli, and gzip sidecars
Reverse proxy and load balancing
Forward to one backend or balance across many, with pluggable strategies, health-aware routing, and retries that can't cascade into storms.
- random, round-robin, least-conn, p2c-ewma
- Circuit breaking and active health checks
- Retry budgets against cascading failures
- DNS SRV and multi-IP upstream discovery
PHP, CGI, and forward proxy
Host classic apps directly: PHP via FastCGI, legacy CGI and SCGI workloads, or act as a forward proxy for controlled egress.
- PHP-FPM via FastCGI
- CGI and SCGI support
- Forward proxy mode
Routing and rewriting
Match requests on path, method, headers, IP, or expressions, then rewrite, redirect, map variables, or split traffic for canary deploys.
- Composable conditional matchers
- Rewrites, redirects, and variables
- Canary traffic splitting
Compression and caching
Shrink responses on the fly and serve repeat requests from cache, including an LSCache-compatible edge cache that accelerates WordPress.
- gzip, Brotli, deflate, and zstd
- File and edge caching
- LSCache-compatible WordPress acceleration
Access control and abuse defense
Layered defenses at the edge: authentication, rate limits, automatic bans for misbehaving clients, security headers, and mTLS.
- Basic auth and forwarded auth
- Rate limiting and automatic abuse bans
- Security headers and mTLS
Observability
Built for production debugging
When something breaks at 3 AM, Ferron shows you exactly what happened to any request: correlated across logs, traces, and metrics instead of scattered across tools.
Trace IDs on every request
Every request carries a trace ID through logs and upstreams, following the W3C Trace Context standard. Find one ID, find the whole story.
- W3C traceparent and baggage propagation
- Trace ID echoed in responses and logs
Correlated structured logs
Access and application logs in JSON or text, linked by trace ID so a single grep reconstructs the full request path across services.
- JSON and text formats
- Per-host access logs
- Single-grep debugging
OTLP-native tracing
Export spans and logs over OpenTelemetry Protocol to Jaeger, Tempo, or your collector of choice: no sidecars or agents required.
- OTLP export built in
- Works with any OTLP collector
Prometheus metrics and dashboards
A scrape endpoint exposes server and proxy health in Prometheus format, with ready-made Grafana dashboards for traffic, backends, and TLS.
- Prometheus scrape endpoint
- Ready-made Grafana dashboards
- StatsD output also available
Operations
Friendly to operators and automation
A helpful CLI, machine-readable config, and a local admin API make Ferron easy to run by hand and easy to run at scale.
A CLI that helps
Run, validate, convert, and daemonize from one binary, with debug logging one flag away when you need to see what the server sees.
- run, validate, adapt, daemon
- --verbose debug logging
Config as data
Adapt the human-friendly config to JSON for auditing, diffing, and generation by your existing tooling. The admin API serves the live config too.
- ferron adapt to JSON
- Live config via admin API
Runtime inspection
Ask the running server how it's doing: uptime, connections, request counts, reload history, and per-backend proxy health.
- Status and runtime endpoints
- Proxy upstream health visibility
Automation-ready
Reloads over HTTP, health endpoints for supervisors and load balancers, and file-plus-memory certificate storage that survives restarts.
- HTTP-triggered reloads
- Supervisor-friendly health checks
Not sure which path fits?
Compare configuration patterns in the docs, then try Ferron in minutes.