Today, we’re releasing Ferron 3.0.0-beta.2, the second beta release of Ferron 3.
This release focuses on four major areas:
- Better production troubleshooting and observability
- More resilient reverse proxying and load balancing
- Stronger security defaults
- Numerous reliability fixes discovered through real-world testing
While beta.1 established the foundations of Ferron 3, beta.2 significantly expands its operational capabilities and moves the project closer to a production-ready stable release.
Breaking changes first
Before diving into what’s new, a quick heads-up: beta.2 includes several breaking configuration changes. If you’re upgrading from beta.1, review these before updating your configuration:
- Incoming trace context discarded by default - Ferron no longer trusts incoming
traceparent,tracestate, orbaggageheaders unlesstrust_request trueis explicitly set in thetraceblock. Previously, incoming trace context was always parsed and used as the parent span. To restore the old behavior, addtrust_request trueto yourhttp { trace { ... } }block. - Rate limit windows - syntax updated to enforce standard duration strings (e.g.,
10s,5m,1h). Bare numeric values are no longer accepted. - OTLP verification -
no_verifyhas been renamed tono_verificationand now operates strictly as a configuration flag. - OTLP defaults - OTLP sink now uses
log_style moderndefault, which may break existing configurations with custom OTLP log formats. - Proxy configuration - syntax for passive/active health checks, load balancing algorithms, and connection retries has been unified into a cleaner, more consistent format.
Debug production without guessing
One of the primary goals of Ferron 3 is to make production troubleshooting easier.
During development and observability testing, we repeatedly found that the hardest production problems are rarely caused by a lack of logs or metrics. They are caused by the inability to connect the dots between them.
Beta.2 introduces major improvements to observability and signal correlation:
- Request and access logs now automatically include request span context when exported through OTLP.
- HTTP tracing has been unified into a single
ferron.requestroot span with nested child spans. - Trace IDs can now be injected into HTTP responses using the new
http-traceidmodule. - Trace IDs are also included in console and file logs, making it possible to filter logs using simple tools such as
grep. - Structured OpenTelemetry-friendly log events are now available through the new
log_style modernmode. - Baggage promotion allows selected W3C Baggage values to become telemetry attributes across logs, traces, and metrics.
- OTLP exporters now emit their own diagnostic logs when export failures occur.
The result is a significantly easier troubleshooting workflow: find a trace ID, jump to the corresponding trace, inspect related logs, and correlate behavior with metrics without manually stitching together unrelated systems.
A stronger reverse proxy
Ferron’s reverse proxy gained some of its biggest upgrades so far.
Circuit breakers
Beta.2 introduces native circuit breakers with rolling failure windows, temporary backend ejection, and half-open recovery states.
Instead of continuously sending traffic to unhealthy backends, Ferron can now automatically isolate failing instances and gradually reintroduce them once they recover.
Adaptive load balancing
A new p2c_ewma load balancing algorithm combines Power-of-Two-Choices routing with latency-aware EWMA scoring.
Rather than distributing requests blindly, Ferron can favor faster and healthier backends while still maintaining balanced traffic distribution.
Sticky sessions
Session affinity is now available using:
- Cookies
- Headers
- Client IPs
- Consistent hashing
Ferron uses a Ketama-style hash ring for deterministic backend selection, helping applications that require stable routing behavior.
Outbound mTLS
Reverse proxy upstreams can now present client certificates when connecting to HTTPS backends.
This enables secure service-to-service communication in environments where mutual TLS is required.
Security-first defaults
Several changes in beta.2 tighten Ferron’s security posture.
The most notable change is the new default behavior for distributed tracing (see the breaking changes section above).
Additional security improvements include:
- DNS rebinding protections for forward proxy mode
- Log injection protections for text logs
- Automatic removal of sensitive headers from access logs
- Stricter URL canonicalization that rejects null-byte paths
- Fixes for authentication bypass scenarios
- Improved handling of proxy access controls
Native abuse protection
Beta.2 introduces a new module:
http-abusebanThis provides lightweight, native Fail2ban-style protection directly inside Ferron.
The module can temporarily ban clients based on repeated rate-limit violations or authentication failures, helping mitigate brute-force attacks without relying on external tooling.
Observability expands beyond traces
Observability coverage has expanded substantially throughout the platform.
Ferron now exposes:
- Circuit breaker state metrics
- Retry metrics
- Connection pool metrics
- Backend exclusion metrics
- Health check metrics
- Connect latency metrics
- Time-to-first-byte metrics
- Certificate expiration metrics
- CGI, FastCGI, and SCGI metrics
- Additional edge-case request outcome metrics
A significant amount of work also went into reducing cardinality risks and improving telemetry quality.
New baggage promotion controls include cardinality limits, and Prometheus label sanitization has been strengthened to prevent accidental metric explosion.
Better operational tooling
Configuration management received several improvements.
A new command:
ferron doctorchecks configurations for best-practice violations and operational risks.
Validation has also become more comprehensive:
- Unused directives are detected
- Unused subdirectives are detected
- Cleaner diagnostics are produced
- Successful validation now explicitly reports when no issues are found
For containerized deployments, Ferron’s Docker images now provide a cleaner split configuration layout and improved defaults for logging and observability.
Performance and reliability fixes
Some of the most valuable work in beta.2 happened behind the scenes.
During heavy testing, benchmarking, and chaos engineering exercises, numerous issues were identified and fixed, including:
- Cache thundering herd scenarios
- Connection pool limit enforcement issues
- HTTP timeout handling bugs
- TLS certificate resolution edge cases
- OCSP stapling edge cases
- Rate-limiting race conditions
- Configuration reload loops
- Various HTTP protocol handling issues
- Windows networking bugs
- Stale cache edge cases
Ferron also benefits from fixes delivered through its underlying networking and HTTP libraries, including corrections for protocol-level issues and denial-of-service vulnerabilities.
More TLS and DNS automation
Automatic TLS capabilities continue to expand.
Highlights include:
- Support for 58 additional DNS providers for ACME DNS-01 challenges
- New
tls-httpprovider for obtaining certificates from remote HTTP endpoints - Improved OCSP validation and caching
- Better certificate-related diagnostics
- Improved Docker defaults for ACME storage
Looking toward stable
Ferron 3 remains in beta, but beta.2 represents a substantial step forward.
The release improves the areas that matter most in production:
- Reliability
- Troubleshooting
- Security
- Observability
- Reverse proxy functionality
Many of these improvements were driven by extensive testing, real-world deployment experiments, observability validation, and performance investigations conducted throughout the beta cycle.
As always, feedback, bug reports, and testing results are welcome.
Thank you to everyone following the project and helping shape Ferron 3.
Full changelog
The complete changelog for Ferron 3.0.0-beta.2 is available in the release notes.
Try it
- Documentation: https://ferron.sh/docs/v3
- GitHub repo: https://github.com/ferronweb/ferron/tree/develop-3.x
Install Ferron 3 using the installer:
sudo bash -c "$(curl -fsSL https://get.ferron.sh/v3)"