Varnish's defaults get you a blisteringly fast cache in an afternoon, then hand you a set of cliff-edges that most teams only discover during an incident.
The defaults work. Until a backend slows down and, because a worker thread is held for the whole request including the fetch, every thread ends up blocked on the origin, the queue fills, and sess_dropped climbs while the CPU sits idle — Varnish looks down, but it is really just full of threads waiting on your backend. Until transient storage — unbounded by default and invisible in the SMA counters — swells under a pass storm and the OOM killer takes the whole process with no warning. Until a popular object expires and hundreds of concurrent misses stampede a backend sized only for the cached load. Until a deploy adds a Set-Cookie to every response and the hit ratio quietly bleeds out. Until the child process panics, the management process restarts it, the cache empties, and — if nobody is watching MGT.child_panic — you never notice it happened.
These guides are written for engineers who already run Varnish, not for people deciding whether to. The goal is the mental model of how the cache actually behaves under load, the failure patterns that keep recurring, the monitoring story that catches them before they page anyone, and the runbooks you wish someone had handed you before your last 503.