Cache collisions from a missing Vary header
Users report occasional garbled pages that never reproduce. A capture shows the same URL sometimes returning gzip and sometimes plain text, while the cache keys only on the URL.
HTTP cache keys are method plus URL unless the response carries Vary. Content negotiation on Accept-Encoding or Accept-Language must be declared:
Vary: Accept-Encoding
nginx adds it with gzip_vary on;. Without it, a CDN can hand a compressed body to a client that cannot decode it, or the reverse.
The same trap exists on multilingual sites missing Vary: Accept-Language. Check with curl -I and look for the header.