Caching & CDN Errors
Cache stampedes, stale content, Varnish and CloudFront failures.
Understanding Caching errors
Cache problems are rarely reported as cache problems. They arrive as a traffic spike that takes down the origin (a stampede after a mass eviction), users seeing old content after a deploy, or an inexplicable 403 from the CDN. The unifying diagnostic is to look at the cache status header on a real response before theorising about anything else.
How to debug Caching errors
- Read the cache status header on a live request:
curl -sI https://example.com | grep -i -E 'cache|age|x-cache|cf-cache-status'. HIT, MISS and BYPASS each point at a different root cause. - Check the
Ageheader against your intended TTL. AnAgelarger thanmax-agemeans something is serving stale content deliberately (stale-while-revalidate), often the desired behaviour, occasionally the bug. - For stampedes, add request coalescing or a short randomised TTL jitter rather than a longer TTL. Identical expiry times across many keys are what create the thundering herd.
- Use content-hashed filenames for static assets and
no-cachefor HTML. Almost every "users see the old version" incident traces back to a long TTL on an HTML document. - For CDN 403s, distinguish a CDN-generated response from an origin one by checking whether CDN-specific headers are present. An origin 403 has a completely different fix.
Tools worth reaching for
curl -sIvarnishlogCDN edge logsCache-Control validators
All 20 Caching errors
- Browser serving stale cache after deploymentUsers see old content after a deployment because their browsers cached the previous version. Cache-busting is not…
- Cache stampede / thundering herdMultiple processes simultaneously attempt to rebuild the same expired cache entry, overwhelming the backend database…
- CDN: High cache miss ratioThe CDN is not caching responses effectively. Most requests are hitting the origin server, defeating the purpose of…
- Cloudflare: cf-cache-status: DYNAMIC NewDYNAMIC means Cloudflare never considered the response for caching, which is different from a MISS. By default…
- CloudFront: 403 Access DeniedCloudFront cannot access the S3 origin, usually because the bucket policy or Origin Access Control (OAC) is…
- CloudFront: 502 ERROR The request could not be satisfied (origin SSL failure) NewCloudFront connected to the origin over HTTPS but the TLS negotiation failed, so it returned a 502 instead. The…
- CloudFront: 504 ERROR The request could not be satisfied (origin timeout) NewCloudFront reached for your origin and either could not open a connection or got no response in time, so the viewer…
- Django: CacheKeyWarning: Cache key will cause errors if used with memcached NewMemcached keys must be under 250 bytes and contain no spaces or control characters. Django warns about this on every…
- Memcached: SERVER_ERROR object too large for cache NewThe item exceeded the maximum item size, one megabyte by default, so it was refused rather than stored. Because most…
- Memcached: SERVER_ERROR out of memoryMemcached cannot allocate memory for new items. The memory limit has been reached and no items are eligible for…
- Next.js: Failed to set Next.js data cache, items over 2MB can not be cached NewThe App Router stores fetch() responses in its data cache, and refuses any single response over 2MB. The page still…
- nginx: [emerg] "proxy_cache" zone "my_cache" is unknown Newproxy_cache refers to a shared memory zone that only exists once a proxy_cache_path line declares it with keys_zone=…
- Nginx: proxy_cache never stores anything (X-Cache-Status: MISS) NewNginx honours the upstream response headers, so a Set-Cookie, a Cache-Control of private or no-store, or an unset…
- Redis: BUSY Redis is busy running a script NewRedis runs Lua scripts and functions atomically on its single main thread, so while one runs nothing else is served…
- Redis: LOADING Redis is loading the dataset in memory NewThe server is replaying its RDB or AOF file after a restart and refuses commands until it finishes. On a large dataset…
- Redis: MISCONF Redis is configured to save RDB snapshots but is unable to persist NewA background save failed, usually because the disk is full, the dump directory is not writable, or the fork ran out of…
- Redis: MOVED 3999 10.0.0.12:6379 NewThe node you asked does not own the hash slot for that key and is telling you which node does. A cluster-aware client…
- Redis: NOSCRIPT No matching script. Please use EVAL. NewEVALSHA runs a script the server has already cached by hash, and that cache is not persisted. A restart, a failover to…
- Spring: java.lang.IllegalArgumentException: Cannot find cache named 'users' NewA @Cacheable, @CachePut or @CacheEvict annotation names a cache that the CacheManager does not know and will not…
- Varnish: 503 Backend fetch failedVarnish cannot fetch content from the origin server. The backend may be down, too slow, or returning errors.
Other categories
- AI 35Rate limits, context windows, GPU memory and model-serving failures.
- Ansible 18Unreachable hosts, become passwords, undefined variables and Jinja2 failures.
- API 20Auth headers, payload limits, versioning, idempotency and webhook signatures.
- Apple 20Command line tools, dyld, Homebrew permissions, notarisation and Keychain.
- Auth 20OIDC, SAML, Auth0, Okta, Keycloak, passkeys and MFA failures.
- BigData 17Spark, Kafka, Airflow, Snowflake, Flink and Databricks failures.
- C# 18NuGet restore, null references, EF Core migrations, async deadlocks and Blazor…
- C++ 20Segfaults, linker errors, memory corruption and template deduction failures.
- CI/CD 18GitHub Actions, GitLab CI, Jenkins, CircleCI: permissions, runners and…
- Client 21CORS, mixed content, module resolution, memory limits and framework runtime…
- Cloud 25IAM permissions, quotas, service limits and credential failures.
- Dart 20Null safety, pub version solving and build toolchain problems.
- Database 41Connections, deadlocks, constraints, replication and memory limits.
- DNS 20NXDOMAIN, SERVFAIL, timeouts, propagation and delegation problems.
- Docker 27Daemon connectivity, disk space, image pulls, ports and architecture mismatches.
- Elixir 18GenServer timeouts, supervision failures and Mix compilation problems.
- Email 20Delivery failures, relay denial, authentication, SPF, DKIM and DMARC.
- Frontend 23Hydration mismatches, bundler resolution, layout shift and font loading.
- Git 20Merge conflicts, rejected pushes, detached HEAD, LFS and repository corruption.
- Go 19Nil map assignment, concurrent map access, context cancellation and deadlocks.
- GraphQL 19Validation, depth limits, N+1 queries and fragment problems.
- gRPC 17Status codes, deadlines, message limits, TLS and HTTP/2 transport failures.
- HTTP 494xx client errors, 5xx server errors, redirects, headers and protocol problems.
- ICMP 23Destination unreachable, time exceeded, fragmentation needed and redirects.
- Ingress 20404 default backend, missing TLS secrets, IngressClass and path matching.
- Java 19Class loading, dependency resolution, connection pools and JVM version…
- JavaScript 42npm resolution, async pitfalls, hydration, memory limits and runtime type…
- Kubernetes 34CrashLoopBackOff, ImagePullBackOff, OOMKilled, RBAC, scheduling and storage.
- Logging 18Log4j, Logback, Fluentd, Logstash and CloudWatch ingestion problems.
- MessageQueue 20Kafka, RabbitMQ, SQS, NATS and Celery: lag, rebalancing and poison messages.
- Mobile 20Gradle, CocoaPods, Xcode signing, Metro bundler and toolchain mismatches.
- Monitoring 18Prometheus scrapes, Grafana data sources, OpenTelemetry exporters and agent…
- Network 35Refused connections, timeouts, resets, MTU problems and port exhaustion.
- Performance 19GC pauses, thread pool starvation and event loop blocking.
- PHP 20Memory limits, execution timeouts, autoloading, Composer and PDO connections.
- Proxy 20nginx, Envoy, HAProxy, Traefik, Caddy and Cloudflare upstream failures.
- Python 35Imports, virtual environments, encoding, concurrency and dependency conflicts.
- Regex 17Catastrophic backtracking, back references, escaping and engine differences.
- Ruby 20Bundler, migrations, native extensions, encoding and asset compilation.
- Rust 19Borrow checker, ownership moves, trait bounds and lifetime mismatches.
- Scala 17Dependency resolution, binary compatibility and type inference failures.
- Security 25JWT validation, CSRF, OAuth grants, SELinux, SSH host keys and CSP.
- Serverless 20Lambda timeouts, package size limits, VPC networking and cold starts.
- Shell 19Command not found, permissions, quoting, expansion and Makefile syntax.
- Storage 19S3 permissions, NFS mounts, quotas, signed URLs and volume attachment.
- Svelte 20Store subscriptions, load functions and server/client boundaries.
- System 26Disk space, systemd units, file descriptors, OOM killer and scheduled jobs.
- Terraform 18State locks, provider auth, drift, dependency cycles and plan-time unknowns.
- Testing 18Jest, pytest, JUnit, Cypress and Playwright: fixtures, snapshots and timeouts.
- TLS 24Untrusted authorities, expiry, hostname mismatch, chains and cipher negotiation.
- TypeScript 19Assignability, missing declarations, strict null checks and generic constraints.
- Virtualization 20VirtualBox, VMware, Hyper-V, WSL, KVM and hypervisor conflicts.
- Web3 17Gas estimation, nonce management and reverted transactions.
- WebAssembly 17Compile errors, memory bounds and host binding mismatches.
- WebServer 20nginx, Apache, IIS and Caddy: binding, permissions, rewrites and TLS.
- Windows 20Installer failures, missing runtimes, update errors and permission problems.