Fluxheim 1.6.32 #107
eldryoth
announced in
Announcements
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
Fluxheim 1.6.32 Release Notes
Fluxheim 1.6.32 continues the final native-runtime cutover work after the
cache/PHP adapter slice.
This checkpoint focuses on native runtime dispatch, native load-balancer state
sharing, and the first native WebSocket upgrade tunnel path. Rich proxy cache
remains an explicit compatibility gate until its native adapter proves full
lookup/fill/stale behavior in a later
1.6.xstop.Highlights
metrics.token_filebearer-token source for the native metrics service. The token file path is
resolved with the normal safe-path rules and rejected when it is empty,
unsafe, or below a group/world-writable parent.
stores it in zeroizing memory, redacts it from debug output, and enforces it
with constant-time comparison for
GET/HEAD /metrics. It also exposes aFluxheim-native background service factory that binds the native HTTP/1
metrics listener under the native supervisor.
failures and unexpected accept-loop failures now log at error level and exit
instead of leaving a silent metrics blind spot after native cutover.
the file, matching the Unix
O_NOFOLLOWhardening as closely as the portablefilesystem API allows.
and network ACLs for access control until the final native runtime owns that
listener, but Fluxheim now validates the native metrics token source at
startup so bad token configuration fails before the cutover.
records whether the final native
MetricsHttplistener must enforce bearerauth, making token enforcement a diffable cutover contract instead of an
implicit root-runtime detail.
task factories beside their Pingora compatibility services. The compatibility
runtime validates those native factories at startup whenever stream or UDP
services are enabled, so final native service registration exercises the same
route parsing and listener task construction before the cutover.
retaining the Pingora compatibility wrapper. This lets the final native
runtime spawn the existing Fluxheim-owned discovery/health refresh loop
directly instead of routing it through Pingora's service adapter.
service handoff internally and dispatches through
FluxBackgroundTask,keeping the compatibility path and final native supervisor path on the same
task boundary.
LoadBalancerRefreshbackground-taskinventory only for load-balanced pools that actually need a background loop:
active health checks, file discovery, HTTP discovery, or DNS refresh. Static
ordered/weighted pools with
load_balance.health_check.enabled = falsestaynative-ready without a detached refresh task.
fluxheim-server/load-balancerfeature, so non-load-balancer builds do notadvertise native supervisor work they cannot construct.
before supervisor startup, matching the existing duplicate listener binding
guard and preventing ambiguous task ownership in the final native runner.
listener expansion, so a final native runner cannot accidentally register two
owners for the same service role.
factory when the server plan reports the proxy surface as native-ready. This
proves exact/wildcard host routing, default-vhost selection, trusted-proxy
source parsing, and route proxy construction can be assembled as one native
router before the production runner switches away from Pingora.
that explicitly disable active load-balancer health checks, matching the
native proxy's current static-upstream capability while still rejecting
advanced load-balancer policies.
until the final native load-balancer bridge shares health/discovery state
with the actual native upstream selector. This avoids a false native-ready
signal where a compatibility refresh task would run but native traffic would
not consume its state.
blocker-free config does not target
NativeRuntime, if the launch plan is notready, or if a launch-plan error is emitted.fluxheim-config-tester --runtime-cutovernow labels the compatibilityadapter row as
native-runtime-compat-adapter, so blocker-free reports donot look like they will still start through Pingora when
native-runtime-target-adapteris alreadyNativeRuntime.as native-ready, matching the native request-header policy implementation
instead of keeping that supported configuration behind the compatibility
adapter.
header overlays as native-ready. Runtime coverage proves a disabled route
overlay suppresses inherited request-header mutations before proxying.
that binds proxy HTTP listeners from the native launch plan, builds the native
host router once, serves requests through
serve_native_http1_listener, andshuts down through the native background supervisor. HTTPS and downstream
PROXY protocol listeners still fail closed at this boundary until their
native listener handling lands.
plan when
tls.alpn = "http1". The runtime builds the downstream Rustlsserver config through
fluxheim-tls, preserving certificate resolver andclient-auth policy; HTTP/2 ALPN and downstream PROXY protocol remain
fail-closed until their native listener dispatch is added.
v1 and v2 from the native launch plan. The parsed source address is carried
through access policy, rate-limit identity, and generated forwarding headers,
while untrusted direct peers still fail closed before request parsing.
server plan is blocker-free and targets
NativeRuntime. The dispatcherstarts the native HTTP proxy runtime plus native admin, metrics, stream, UDP,
and load-balancer refresh tasks under
NativeBackgroundSupervisorinstead ofthe Pingora server loop.
root native runtime, so ACME renewal and the local certificate-reload control
task can reload downstream certificates without the Pingora listener adapter.
OpenSSL listener path for OpenSSL-only/FIPS builds when
tls.alpn = "http1".It builds its downstream acceptor through
fluxheim-tls, preserves theconfigured certificate and client-auth policy, and keeps HTTP/2 ALPN
fail-closed until the native HTTP/2 listener dispatch is enabled. The native
OpenSSL listener also preserves configured TLS policy and client-auth
settings, installs SNI certificate selection through OpenSSL's callback API,
and exposes the certificate store to the root native runtime so ACME renewal
and local certificate reloads no longer require the Pingora listener adapter.
dispatch as a standalone blocker once the TLS ALPN route can enter the
native multi-stream H2 adapter. Remaining native proxy blockers are tied to
HTTP/1 proxy/cache feature parity rather than the H2 listener handoff itself.
h2ALPN connections intothe native multi-stream HTTP/2 route adapter, while
http/1.1and no-ALPNconnections continue through the native HTTP/1 route path when the configured
TLS ALPN policy permits HTTP/1. Live rustls and OpenSSL runtime tests prove
tls.alpn = "http1-and-http2"negotiates HTTP/2 and reaches an ordinarynative proxy upstream on both supported TLS backends.
HTTP/2 blocker at the final rich-proxy parity release instead of the earlier
preview milestone, keeping
fluxheim-config-tester --runtime-cutoveroutputconsistent with the current Pingora-exit plan.
streams on one connection instead of dropping every stream after the first
probe response. Tests cover same-connection multi-stream responses and the
native TLS runtime now routes selected downstream H2 traffic into that stack.
into the existing native HTTP/1 route handler pipeline and converts native
responses back to H2 without collapsing duplicate response headers such as
Set-Cookie. Native requests now carry request trailers, and tests prove H2request trailers reach the native route handler and H2 upstream request
builder; connection takeover remains fail-closed because HTTP/2 upgrade
semantics are separate from HTTP/1 tunnels.
through
fluxheim-php-fpm, not the root crate. Managed routes create theprivate php-fpm config, validate the php-fpm binary path against symlink and
insecure-parent traversal, start php-fpm on a private Unix socket, keep the
process owner alive for the native route lifetime, and retain the bounded
watchdog/restart behavior used by the legacy runtime.
fluxheim-php-fpminstead of carrying a second supervisor implementation.This keeps the Pingora compatibility route stable while removing duplicate
process lifecycle code from the root crate.
UpstreamLoadBalancerstate with the native load-balancer refresh service.Static advanced pool policy, active health, dynamic file/HTTP/DNS discovery,
persistence, passive health, backup/drain/disabled state, priority groups,
locality preference, per-upstream in-flight caps, aliases/tags, and runtime
weight handling are selected through the same native load-balancer state the
background service updates.
upstream transport policy onto selected discovery authorities. This preserves
the configured TLS, HTTP version, timeout, socket, PROXY-protocol, and
forwarding-header policy without accepting per-request transport changes from
discovery data.
for operators migrating cache-stateful upstream pools that need nginx-style
request-to-backend mapping. The new selections are
nginx-consistent-source-hash(nginx-consistent-hash/ketamaaliases),nginx-consistent-uri-hash,nginx-consistent-header-hash, andnginx-consistent-cookie-hash; they build a static CRC32 continuum from theconfigured
proxy.upstreamspool and intentionally reject dynamic discoverypools and runtime backend-set mutations in this release.
before building the ring, and logs if CRC32 point collisions reduce the
continuum. The release documentation now calls out that Ketama remains
unsalted for nginx/Pingora compatibility and is therefore not the right mode
for attacker-controlled hash keys.
bytes read after the request head. This prevents early WebSocket frames sent
in the same TCP packet as the upgrade request from being lost when a handler
takes ownership of the downstream stream.
requests on forced HTTP/1 static upstream routes. The native adapter writes a
canonical upstream
Connection: Upgrade/Upgrade: websocketrequest,validates the upstream
101 Switching Protocolsresponse with the sharedHTTP/1 parser, forwards prebuffered bytes in both directions, and runs the
bidirectional tunnel under the configured upstream read timeout.
headers named by the downstream
Connectionfield, before forwarding theupgrade upstream. The downstream
101 Switching Protocolsresponse is nowemitted as a canonical WebSocket handshake response instead of forwarding
arbitrary upstream
101headers such asSet-CookieorServer.pools. The proxy performs one normal load-balancer selection at upgrade time,
then pins the tunnel to that selected upstream for the lifetime of the
connection; HTTP/2 WebSocket upstream mode remains fail-closed because it
does not use the HTTP/1 hop-by-hop upgrade mechanism.
under the
php-fpmfeature. It maps native HTTP/1 requests into the FastCGIparameter set using Fluxheim's existing PHP path-safety helpers:
SCRIPT_NAME/PATH_INFO, deny prefixes, splitPATH_INFO, UTF-8DOCUMENT_ROOT/SCRIPT_FILENAME, request headers, protected custom params,TLS scheme, and restored client address are all covered before the live
FastCGI execution path is enabled.
native response plan. It uses the shared PHP response parser, strips
hop-by-hop headers, configured hidden headers, PHP internal offload headers,
and Fluxheim-owned
Content-Length, preserves HEAD response length without abody, and marks configured intercepted status codes before the live response
writer is enabled.
script resolver for the upcoming live PHP-FPM adapter. It reuses the same
canonical web-root/symlink-safe resolver as static serving while applying PHP
SCRIPT_NAME, front-controller, deny-prefix, directory-index redirect, anddecline-existing-static decisions.
Zeroizing<Vec<u8>>instead of cloning sensitive request bytes into a plainheap vector for the duration of the FastCGI exchange.
metrics.token_envis parsed but rejected. Rust 2024 treats processenvironment mutation as unsafe, Fluxheim forbids unsafe code in the root
crate, and leaving bearer tokens in
/proc/self/environis not acceptablefor the native metrics listener. Use
metrics.token_fileinstead.backends with a set, preserving existing
max_iterationsbehavior whileavoiding quadratic duplicate checks on large weighted rings.
PROXY-protocol disabled even when the public HTTP/HTTPS listeners enable
trusted downstream PROXY protocol. The server-plan tests continue to assert
that only public HTTP/HTTPS listeners inherit that trust boundary.
upcoming live execution path. It enforces
php.max_request_body_bytes, keepssmall bodies in memory, and uses Fluxheim's existing private PHP spool-file
creator/cleanup path when
php.request_body_spool_threshold_bytesandphp.request_body_spool_dirrequire a spooled body.uses Fluxheim-owned endpoint selection, pooled or one-shot Unix/TCP
connections, bounded connect/request timeouts, configured response-size
limits, retryable error/status handling, STDERR failure-pattern handling, and
the staged native response planner.
action for external php-fpm endpoints. The route action resolves scripts
through the native static resolver, enforces PHP in-flight/request-body
limits, builds the shared FastCGI parameter plan, executes the staged
FastCGI wrapper, and returns parsed native PHP responses.
intercepted statuses by rendering the configured static error page through
the native static-file responder.
parity blockers rather than hidden launch blockers: proxy cache still needs
native lookup/fill/stale/purge behavior before cache-enabled proxy routes
can leave the compatibility path.
responses instead of connection-level failures. Oversized request bodies,
request-body timeouts, header-count rejection, oversized URIs, and handler
timeouts return the matching 4xx/5xx response on that stream while allowing
sibling streams on the same connection to continue.
route adapter so request-body copies do not lose the zero-on-drop behavior
used by native H2.
branching on token length before the constant-time comparison. Metrics bearer
auth now uses
metrics.token_file;metrics.token_envis rejected to avoidlocal process-environment exposure.
behavior: unexpected listener exit logs an error and terminates the process
instead of leaving a live process that silently stopped accepting traffic.
Tests
metrics.token_envrejection.authenticated scrape acceptance, unauthenticated rejection, and debug
redaction.
over an actual local TCP scrape request and that the background service task
binds and stops under the native supervisor, not only through the in-memory
handler.
observes readiness after the initial discovery update, checks the
LoadBalancerRefreshtask kind, and shuts it down through the Fluxheimsupervisor path.
native
LoadBalancerRefreshtask metadata.schedule the
LoadBalancerRefreshtask in the native runtime launch TSV,while static health-disabled pools do not.
LoadBalancerHealthChecks/LoadBalancerRefreshinventory.closed before task supervision begins.
listener registration begins.
cover metrics bearer-token service policy.
full native host-router factory, not only the individual proxy candidate.
with
load_balance.health_check.enabled = false, plus rejection coverage forcustom disabled-health-check policies that would otherwise be silently
ignored by the native static proxy.
multi-upstream pools remain on the compatibility path until native
load-balancer refresh state is wired into the native request path.
scripts/validate-native-runtime-cutover.shso release validationproves the representative native runtime config is not only blocker-free but
also selects the native target adapter and a ready launch plan.
an ephemeral address, proxies a real request to a local upstream through the
native host router, and shuts the listener down through
NativeBackgroundSupervisor.certificate, binds a planned HTTPS listener, completes a real TLS handshake,
proxies a request to a local upstream, and shuts the native listener down
through the supervisor.
certificate, binds a planned HTTPS listener under the OpenSSL-only server
feature, completes a real OpenSSL TLS handshake, proxies a request to a local
upstream, and shuts the native listener down through the supervisor.
v2 listeners, proving the native listener parses the PROXY header and forwards
the restored client IP to the upstream as
X-Real-IP.runtime target and that certificate background tasks are rejected unless a
native reloader is available.
production binary serves the admin TCP listener and Unix ops socket under the
native runtime dispatcher.
service state, including active-health/static advanced policy and dynamic DNS
discovery construction.
selectors, including alias parsing, header-hash requirements, dynamic
discovery rejection for static-ring selections, native selection
construction, and runtime backend-set mutation rejection.
for nginx-compatible static-ring selections.
one stream returns
413without aborting a sibling stream on the sameconnection.
request headers are stripped and arbitrary upstream
101response headersare not forwarded downstream.
a downstream request through a nginx-compatible Ketama URI-hash upstream pool.
proxy.websocket = trueisnative-ready at root, vhost, and route scope when the upstream mode is forced
HTTP/1, plus rejection coverage for WebSocket with HTTP/2 upstream mode.
perform a real downstream
101 Switching Protocolsupgrade through a localupstream listener and prove bytes sent immediately after the downstream
request head are preserved and tunneled.
proxy.load_balancepool can select an upstream once and tunnel WebSocketbytes through that pinned backend.
prebuffered downstream bytes when taking ownership of a parsed HTTP/1
connection.
core CGI parameter mapping, duplicate request-header joining, protected
custom-param rejection, denied script-prefix rejection, and unsafe
PATH_INFOrejection.hop-by-hop/configured/internal header stripping, HEAD content-length
preservation, and intercepted status classification.
resolve explicit PHP scripts, use the front controller for missing paths,
decline existing non-PHP static files when configured, and reject denied
script prefixes.
memory bodies, configured body-limit rejection, spool-file creation, and
cleanup on request-body drop.
including fail-closed rejection when no PHP-FPM endpoint is configured.
roots and fail closed with
502 Bad Gatewaywhen a configured externalphp-fpm endpoint is unavailable.
responder, proving the native route sends FastCGI records, parses PHP stdout,
strips configured PHP response headers, and returns the parsed HTTP response.
Checksums And Signatures
0cabc801b65693830ce51aabaa07b43cff1253bc61788956b0e7bc36085e42a3ccd028d04f242e6cc6dfcd9951b9e084bf3c67cc fluxheim-1.6.32.tar.gzf73369e33edef4aed39ba5ef715c5241e12db6c5685a6837d8e9204a7658f9f5 fluxheim-1.6.32.zip346a4258bc151cc021159ec5f2c138c5fa599305c7f74917abaa2a77bd3fbaf3 fluxheim-1.6.32-full-x86_64-linux.tar.gzdcd1c27cc907bbb1795afbd67e1a82d6d0b009629d10ca307a8b4c6e46fc4140 fluxheim-1.6.32-cache-x86_64-linux.tar.gz036055e3c9acc7faefb92b2e2660c935cd9702d66a198f4f621d51b91d555f07 fluxheim-1.6.32-proxy-x86_64-linux.tar.gzfd349b5ecc69e1d3f7d85c168e1815a1c16f6ed6489c3ee05759d337ed682791 fluxheim-1.6.32-php-x86_64-linux.tar.gz3f2aeb426eacb420108095acea7335fb73600842a4b3b236e8c3784a12315ccd fluxheim-1.6.32-load-balancer-x86_64-linux.tar.gz2ee2d52949fd76353b895cbec7af41f03adea60e5938e030e6ca7df15931b4c7 fluxheim-1.6.32-config-tester-x86_64-linux.tar.gzeec7554d4f7408090ef0c3604294c144fcf3cbb3e9245d2191b331825d6a8c2f fluxheim-1.6.32-full-aarch64-linux.tar.gz4ffaebf6754831df09b5451065ad75ec4f0733a889ad652d7d3c48d67e8bbbd4 fluxheim-1.6.32-cache-aarch64-linux.tar.gz33ef80443ec187b1eb4215fe4f176b58a757cc65eeac9df74625740f08e1329b fluxheim-1.6.32-proxy-aarch64-linux.tar.gz88bd7d8d701544d5b43830176df1b25676c7dd405e22fda34e6704435788eeb2 fluxheim-1.6.32-php-aarch64-linux.tar.gzbf916680a39cebf38cfc1b18e63c44c32b668173730972413970ed56a1d146e5 fluxheim-1.6.32-load-balancer-aarch64-linux.tar.gzf2e684b53424761fba9262bab141ba1787858cb9d3b4d2467d9075eb1fd221c4 fluxheim-1.6.32-config-tester-aarch64-linux.tar.gza68f6c3949dddf4c879c3c20ceeba68ee9686b711f0251e1e9f68972983136fd fluxheim-1.6.32-dev-aarch64-macos.tar.gze3ede817802cede66a658787a31026757b49991ae4a9a96a21a858b99df15e40 fluxheim.spdx.json40398e9f0b7d8f49121d4025a0d89a46f46f04bf7e45d58268c04c1c5cb96e16 fluxheim.cyclonedx.json7b21639f49e2e8a3e4afb3b787a81de262b5227dc0bf2909aa6f75f6041c0b56x86_648b15b04722f56613cfb317bddbd2d134e74a8f179d17a18bfb92f2f84ddd5325aarch640866cf6d7422e6e1f9c90c22231dd1bfe5ae89e4d0c9427e8083ba19b2ece439macosghcr.io/valkyoth/fluxheim@sha256:12ce6bc65648929281b71b9f19c2ac241b81b637a6e1fe5b67009ab45c1ca62eghcr.io/valkyoth/fluxheim@sha256:286c27d78edb76d19e548a1b13862efb58009ef2568b8bee13210a45abbabf92ghcr.io/valkyoth/fluxheim@sha256:3d26131457132dd066fb56cc32511966f1ac3bfa3b1882ce788c3d025b5cc327ghcr.io/valkyoth/fluxheim@sha256:c1e793c14d5c9fc2a8908a01559b66fd596691fa7d2380fde57e656d77044c2eghcr.io/valkyoth/fluxheim@sha256:12c2b1676241e2a3a1110883e902145419ca3d3c3378b0cc34d7d7bae412c63dghcr.io/valkyoth/fluxheim@sha256:61ca40591f13930a5be530b0d4f5c1d66b5e10da8649cb99c303ddebb0419aa3ghcr.io/valkyoth/fluxheim@sha256:40db05985ec31d3edfe056f1a013dc01f020709e23eb2bcf7e7b0add3428db30ghcr.io/valkyoth/fluxheim@sha256:83bdb2dbd549d07fd4feb708d2d0f5d69f980769fd4096267d383971f2fa6669ghcr.io/valkyoth/fluxheim@sha256:252b23e8d43e3ff78cb6da9c6e7ee4700090c15d709d25d894e5db685346a725ghcr.io/valkyoth/fluxheim@sha256:030f7a25d5c567715f58a652e37ad167c7c3a53fb2f388cc4f7ec4a156875a78ghcr.io/valkyoth/fluxheim@sha256:79855239a556f9f257ed6aa1e1d59f2743bc6cf246c0254aefbff96c66ec7a9fghcr.io/valkyoth/fluxheim@sha256:1f0332c03244396f669f366da4840c3e68ca1731596a3f965b0380e4731e2aeaghcr.io/valkyoth/fluxheim@sha256:7cd237a64854188431a9726e4d9758dfe055c09d6df2f8c411998a08411f38ffghcr.io/valkyoth/fluxheim@sha256:e1cf4bbef2c099692083328091376060b442084624fb1ca011ca88991c67df97ghcr.io/valkyoth/fluxheim@sha256:01124f94aeb520a33e60c83c5ebe1dccb117c4425ae8ae4a8172da1e41a08465ghcr.io/valkyoth/fluxheim@sha256:b21f72f1c78ba87301f088dffbbd8976a2e2dacdac84a27a2c3a05e577a6de12ghcr.io/valkyoth/fluxheim@sha256:7ddd7678a7bcf812a3d5e3737550cb461375a6e31ac97bfdbe8bf37b0103f8f6ghcr.io/valkyoth/fluxheim@sha256:6a2fd227b95d9b53218627fbaa64e6a09f90848dbde21b9103f8be3e5daa1ac7ghcr.io/valkyoth/fluxheim@sha256:38a0424821474515dca31dbd55f80fead545d7e308219fee7ddd69390014deafghcr.io/valkyoth/fluxheim@sha256:7ff0475700b460b2a0f84db6349fcd6947f4cfbb94a6f39b66fa44f141ead580Good "git" signature for 1921261+eldryoth@users.noreply.github.com with ED25519 key SHA256:EoLRQ5k4J5pYz3UMFmkrV798gYFNkToGS2xEPvebqB4This discussion was created from the release Fluxheim 1.6.32.
Beta Was this translation helpful? Give feedback.
All reactions