Build1 distinct publisher3 min readPublished
The dangerous nginx bugs are the ones that emit no runtime signal at all, so the only artefact carrying the evidence is the config text itself. Stapling with no resolver in scope is the cleanest case of the class.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
Phase order is the mechanism under three of these findings, and it is invisible in the file. nginx does not walk a location block top to bottom when a request arrives. Directives belong to modules, modules are bound to phases, and the phase sequence is fixed. Moving `return` below `deny all` therefore changes nothing [15]. The author points at the older "if is evil" advice as the same root cause: directives from different modules run in an order that has nothing to do with the order you typed them [16].
The repair for the `/health` case is worth reading closely, because it is a phase trick and not a reordering. `try_files /nonexistent @health` pushes the canned response behind an internal redirect, and `try_files` runs in the content phase, after access has been evaluated, so a client outside the allow list collects its 403 before the redirect is considered [17]. The post pairs it with `open_file_cache max=10000 inactive=60s` and `open_file_cache_errors on`, because a bare `try_files` pays a filesystem lookup per candidate on every request, which gixy flags on its own [18].
On the stapling side the suggested lines are `resolver 127.0.0.1 valid=300s ipv6=off` and `resolver_timeout 5s`, aimed at a local resolver or a cloud provider's internal DNS [6]. That `valid=300s` is a five minute cache on the answer [19]. Pointing the same directive at 8.8.8.8 also works, and sends every internal lookup off your network in cleartext [7].
Verification does not come from nginx. `echo | openssl s_client -connect example.com:443 -servername example.com -status` prints `OCSP Response Status: successful` when stapling works, and `no response sent` when it does not [8]. The condition on reading that output: the first handshake after a reload usually goes out unstapled while nginx fetches in the background, so a single failing probe is a timing artefact until the second one agrees [9]. If the certificate came from Let's Encrypt, no resolver will move the result either way [10].
The general claim is the maintainer's, and it is the load-bearing one: static analysis is the only practical way to catch a failure that produces no signal at runtime, and a growing share of gixy-ng's checks exist for that category [2]. I think that is right, with a qualification. A linter only catches shapes somebody has already encoded. The inheritance rule is the good example of what makes this hard: access rules pass down from an outer context only when the inner context defines none of its own, so one `allow 172.16.0.1` inside a location silently discards the server's `allow` plus its `deny all` [13]. Seeing that requires holding two contexts in view at once, which is what a reviewer skims and a parser does not.
The post promises four of these [20]. The copy available to me works through three and breaks off mid-sentence as the author introduces the fourth as his favourite [21]. I would like to know what it is.
Ranked by verification strength, evidence, and original report placement.
The post states it covers four silent-failure misconfigurations worth knowing about.
The supplied text works through three examples and ends mid-sentence as the author introduces the fourth with "This one is my favourite".
A class of nginx misconfiguration produces valid config: nginx -t passes, the server starts and serves traffic, nothing unusual is logged, and the thing that was configured is quietly not happening.
OCSP stapling means nginx fetches the certificate's revocation status from the CA and attaches it to the handshake, so the client does not have to do its own lookup.
nginx does not use the system resolver for runtime lookups; it has its own resolver, and that resolver only exists if it is configured.
With ssl_stapling on and ssl_stapling_verify on but no resolver directive in scope, the hostname never resolves, the fetch never happens, stapling is silently skipped, the config test still passes, and clients go do their own OCSP lookups.
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 29, 2026
Follow any of these and your For You feed starts watching them — no settings page required.
build
SSE in Go breaks twice before your handler runs: an illegal header, then a 30-second timeout1 distinct publisher
security
Two Artifactory flaws poisoned metadata, not artifacts, and that was enough to break a shared cache1 distinct publisher
build
SSE is 30 lines on one pod. The second pod is where the engineering starts1 distinct publisher
build
The ICO fines what you cannot prove: Article 32 makes encryption and erasure an engineering liability1 distinct publisher
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Reproducible mechanics, one voice
Very little here asks for trust. The stapling failure arrives with the openssl handshake that proves it, and the access-control cases are six-line blocks anyone can paste into a test server and watch misbehave. What is thin is the sourcing around them: a single dev.to post from the person who maintains the scanner, with no upstream documentation, advisory or second practitioner cited. The one claim a reader cannot check locally — that Let's Encrypt stopped answering OCSP in August 2025 — is also the one deciding whether you add a resolver or delete the directive.
Ecosystem dates, no uptake
There is no uptake to score. The post offers no figure for how many deployed configs carry these patterns, and 'pip install gixy-ng' is a footer, not a usage number. What is datable sits outside the author's hands: the CA-side end of Let's Encrypt OCSP responses, which retires the stapling directive across a large slice of the web, and the open upstream ticket behind the quic_bpf reload defect. Both anchor the story in time; neither shows anyone acting on it.
Slight stretch, mostly delivered
A headline promising misconfigurations that fail silently is delivered narrowly and with fixes attached, which is rarer than it sounds. The one stretch is the assertion that static analysis is the only practical way to catch these failures, made by the person who maintains the analyzer — in a post that then hands you a runtime command catching the stapling case outright. Overstatement, but small and self-undercut.
Disclosed early, visible in the edit
The author's interest is stated in the third paragraph and again in the last line: he maintains gixy-ng and would like you to install it, and the post runs under a performance vendor's dev.to account. It is a soft sell — every fix is a config edit that needs no tool — but the choice of which four failures to feature is unmistakably the set his checks already cover, and the open_file_cache aside exists partly so the recommended fix does not trip a second gixy finding.
Middle, and for once that is fine
One author, one outlet, no corroboration — normally grounds for real caution. But config semantics are unusually forgiving of a lone source, because they either reproduce or they do not. So confidence sits high on the phase-ordering and inheritance mechanics, noticeably softer on the dated third-party facts and on any sense of how widespread these mistakes really are.