GeoIP routing plus proxy_cache is a solid combo, but the ops footgun is usually the cache key, not the map. If proxy_cache_key still includes $scheme$host$request_uri while GeoIP only changes upstream choice, you can serve region-A HTML from a region-B origin hit and never notice until currency or legal blocks differ. Key on the same variables you branch on (or a normalized $geo_region), keep proxy_cache_valid short for HTML, and bypass cache on Set-Cookie / Authorization so logged-in paths do not poison the zone.
After deploy, hit the same URI from two synthetic GeoIP CIDRs and confirm both X-Cache status and upstream address diverge as expected. Also watch inactive= eviction: a cold region after quiet hours looks like a GeoIP miss when it is really an empty cache slab. Log $upstream_addr and $upstream_cache_status together for a week before trusting the map in production.