Отвечу сам себе. Дело оказалось в строчке "fastcgi_cache_valid any 30d;" и в заголовке указано If-None-Match, но Nginx ничего не кеширует.
Если конфигурацию изменить на "fastcgi_cache_valid 200 301 202 404 30d;" то начинает работать, но некоторые страницы в кеш попадают не с первого запроса. В чем может быть причина?
Также обратил внимание, что Nginx принципиально не кеширует запросы HTTP/1.0. Может это так задумано?..