mirror of
https://github.com/ksyasuda/dotfiles.git
synced 2026-03-20 06:11:27 -07:00
133 lines
5.7 KiB
Markdown
133 lines
5.7 KiB
Markdown
# Cache Reserve Gotchas
|
|
|
|
## Common Errors
|
|
|
|
### "Assets Not Being Cached in Cache Reserve"
|
|
|
|
**Cause:** Asset is not cacheable, TTL < 10 hours, Content-Length header missing, or blocking headers present (Set-Cookie, Vary: *)
|
|
**Solution:** Ensure minimum TTL of 10+ hours (`Cache-Control: public, max-age=36000`), add Content-Length header, remove Set-Cookie header, and set `Vary: Accept-Encoding` (not *)
|
|
|
|
### "Range Requests Not Working" (Video Seeking Fails)
|
|
|
|
**Cause:** Cache Reserve does **NOT** support range requests (HTTP 206 Partial Content)
|
|
**Solution:** Range requests bypass Cache Reserve entirely. For video streaming with seeking:
|
|
- Use edge cache only (shorter TTLs)
|
|
- Consider R2 with direct access for range-heavy workloads
|
|
- Accept that seekable content won't benefit from Cache Reserve persistence
|
|
|
|
### "Origin Bandwidth Higher Than Expected"
|
|
|
|
**Cause:** Cache Reserve fetches **uncompressed** content from origin, even though it serves compressed to visitors
|
|
**Solution:**
|
|
- If origin charges by bandwidth, factor in uncompressed transfer costs
|
|
- Cache Reserve compresses for visitors automatically (saves visitor bandwidth)
|
|
- Compare: origin egress savings vs higher uncompressed fetch costs
|
|
|
|
### "Cloudflare Images Not Caching with Cache Reserve"
|
|
|
|
**Cause:** Cloudflare Images with `Vary: Accept` header (format negotiation) is incompatible with Cache Reserve
|
|
**Solution:**
|
|
- Cache Reserve silently skips images with Vary for format negotiation
|
|
- Original images (non-transformed) may still be eligible
|
|
- Use Cloudflare Images variants or edge cache for transformed images
|
|
|
|
### "High Class A Operations Costs"
|
|
|
|
**Cause:** Frequent cache misses, short TTLs, or frequent revalidation
|
|
**Solution:** Increase TTL for stable content (24+ hours), enable Tiered Cache to reduce direct Cache Reserve misses, or use stale-while-revalidate
|
|
|
|
### "Purge Not Working as Expected"
|
|
|
|
**Cause:** Purge by tag only triggers revalidation but doesn't remove from Cache Reserve storage
|
|
**Solution:** Use purge by URL for immediate removal, or disable Cache Reserve then clear all data for complete removal
|
|
|
|
### "O2O (Orange-to-Orange) Assets Not Caching"
|
|
|
|
**Cause:** Orange-to-Orange (proxied zone requesting another proxied zone on Cloudflare) bypasses Cache Reserve
|
|
**Solution:**
|
|
- **What is O2O**: Zone A (proxied) → Zone B (proxied), both on Cloudflare
|
|
- **Detection**: Check `cf-cache-status` for `BYPASS` and review request path
|
|
- **Workaround**: Use R2 or direct origin access instead of O2O proxy chains
|
|
|
|
### "Cache Reserve must be OFF before clearing data"
|
|
|
|
**Cause:** Attempting to clear Cache Reserve data while it's still enabled
|
|
**Solution:** Disable Cache Reserve first, wait briefly for propagation (5s), then clear data (can take up to 24 hours)
|
|
|
|
## Limits
|
|
|
|
| Limit | Value | Notes |
|
|
|-------|-------|-------|
|
|
| Minimum TTL | 10 hours (36000 seconds) | Assets with shorter TTL not eligible |
|
|
| Default retention | 30 days (2592000 seconds) | Configurable |
|
|
| Maximum file size | Same as R2 limits | No practical limit |
|
|
| Purge/clear time | Up to 24 hours | Complete propagation time |
|
|
| Plan requirement | Paid Cache Reserve or Smart Shield | Not available on free plans |
|
|
| Content-Length header | Required | Must be present for eligibility |
|
|
| Set-Cookie header | Blocks caching | Must not be present (or use private directive) |
|
|
| Vary header | Cannot be * | Can use Vary: Accept-Encoding |
|
|
| Image transformations | Variants not eligible | Original images only |
|
|
| Range requests | NOT supported | HTTP 206 bypasses Cache Reserve |
|
|
| Compression | Fetches uncompressed | Serves compressed to visitors |
|
|
| Worker control | Zone-level only | Cannot control per-request |
|
|
| O2O requests | Bypassed | Orange-to-Orange not eligible |
|
|
|
|
## Additional Resources
|
|
|
|
- **Official Docs**: https://developers.cloudflare.com/cache/advanced-configuration/cache-reserve/
|
|
- **API Reference**: https://developers.cloudflare.com/api/resources/cache/subresources/cache_reserve/
|
|
- **Cache Rules**: https://developers.cloudflare.com/cache/how-to/cache-rules/
|
|
- **Workers Cache API**: https://developers.cloudflare.com/workers/runtime-apis/cache/
|
|
- **R2 Documentation**: https://developers.cloudflare.com/r2/
|
|
- **Smart Shield**: https://developers.cloudflare.com/smart-shield/
|
|
- **Tiered Cache**: https://developers.cloudflare.com/cache/how-to/tiered-cache/
|
|
|
|
## Troubleshooting Flowchart
|
|
|
|
Asset not caching in Cache Reserve?
|
|
|
|
```
|
|
1. Is Cache Reserve enabled for zone?
|
|
→ No: Enable via Dashboard or API
|
|
→ Yes: Continue to step 2
|
|
|
|
2. Is Tiered Cache enabled?
|
|
→ No: Enable Tiered Cache (required!)
|
|
→ Yes: Continue to step 3
|
|
|
|
3. Does asset have TTL ≥ 10 hours?
|
|
→ No: Increase via Cache Rules (edge_ttl override)
|
|
→ Yes: Continue to step 4
|
|
|
|
4. Is Content-Length header present?
|
|
→ No: Fix origin to include Content-Length
|
|
→ Yes: Continue to step 5
|
|
|
|
5. Is Set-Cookie header present?
|
|
→ Yes: Remove Set-Cookie or scope appropriately
|
|
→ No: Continue to step 6
|
|
|
|
6. Is Vary header set to *?
|
|
→ Yes: Change to specific value (e.g., Accept-Encoding)
|
|
→ No: Continue to step 7
|
|
|
|
7. Is this a range request?
|
|
→ Yes: Range requests bypass Cache Reserve (not supported)
|
|
→ No: Continue to step 8
|
|
|
|
8. Is this an O2O (Orange-to-Orange) request?
|
|
→ Yes: O2O bypasses Cache Reserve
|
|
→ No: Continue to step 9
|
|
|
|
9. Check Logpush CacheReserveUsed field
|
|
→ Filter logs to see if assets ever hit Cache Reserve
|
|
→ Verify cf-cache-status header (should be HIT after first request)
|
|
```
|
|
|
|
## See Also
|
|
|
|
- [README](./README.md) - Overview and core concepts
|
|
- [Configuration](./configuration.md) - Setup and Cache Rules
|
|
- [API Reference](./api.md) - Purging and monitoring
|
|
- [Patterns](./patterns.md) - Best practices and optimization
|