Заметили очень неприятный баг, в результате которого, клиенты получали пустую страницу.
Конфиг кеширования:
fastcgi_cache_path cache levels=1:2 keys_zone=cache:256m inactive=1d;
fastcgi_cache cache;
fastcgi_cache_lock on;
fastcgi_cache_revalidate on;
fastcgi_cache_methods GET HEAD;
fastcgi_cache_valid 200 301 302 0s;
fastcgi_cache_key "$host$uri$is_args$args";
fastcgi_cache_use_stale error updating http_503;
Воспроизводится баг следующим образом, бекенд при ревалидации отвечает статусом 304 и в соответсвии с HTTP спецификации, повторно высылает хедеры:
Last-Modified и Cache-Control: max-age=1.
В данном статусе бекенд отдает только хедеры без body.
Nginx реагирует на хедер Cache-Control, в котором значения max-age больше нуля и сохраняет данный ответ в свой файл кеша, при условии что файла в кеше Nginx ещё или уже нет, в нашем случаи это было по причине устаревания кеша по директиве inactive,
На последующие запросы по этому uri, если бекенд отвечает статусом 304, Nginx клиенту отдает результат из своего кеш файла, в котором нет body, если в браузере есть свой локал кеш, тогда все ок, но если это запрос от клиента у которого нет в локал кеше браузера данной страницы, он увидит пустую страницу и в этом заключается баг.
Пока что временно, мы перестали отдавать хедер Cache-Control в статусе 304, но это не правильно и некоторые браузеры, перестают отправлять хедер If-Modified-Since.