Re: Некорректный ответ при использовании fastcgi cache background update on

Gena Makhomed gmm на csdoc.com
Пн Апр 9 18:42:53 UTC 2018


On 09.04.2018 21:08, Maxim Dounin wrote:

>> 2018/04/09 18:21:23 [debug] 29576#29576: *3395329 http file cache exists: 0 e:1
>> 2018/04/09 18:21:23 [debug] 29576#29576: *3395329 cache file: "/var/www/site/cache/pages/49/1d/2756424aaf76d1f24c982e863d611d49"
>> 2018/04/09 18:21:23 [debug] 29576#29576: *3395329 add cleanup: 00005594C08CB288
>> 2018/04/09 18:21:23 [debug] 29576#29576: *3395329 http file cache fd: 52
>> 2018/04/09 18:21:23 [debug] 29576#29576: *3395329 read: 52, 00005594C08CB308, 475, 0
> 
> [...]
> 
>> 2018/04/09 18:21:23 [debug] 29576#29576: *3395329 http fastcgi record length: 74
>> 2018/04/09 18:21:23 [debug] 29576#29576: *3395329 http fastcgi parser: 0
>> 2018/04/09 18:21:23 [debug] 29576#29576: *3395329 http fastcgi header: "Content-Type: text/html; charset=UTF-8"
>> 2018/04/09 18:21:23 [debug] 29576#29576: *3395329 http fastcgi parser: 0
>> 2018/04/09 18:21:23 [debug] 29576#29576: *3395329 http fastcgi header: "Status: 200"
>> 2018/04/09 18:21:23 [debug] 29576#29576: *3395329 http fastcgi parser: 0
>> 2018/04/09 18:21:23 [debug] 29576#29576: *3395329 http fastcgi header: "Content-Length: 0"
>> 2018/04/09 18:21:23 [debug] 29576#29576: *3395329 http fastcgi parser: 1
>> 2018/04/09 18:21:23 [debug] 29576#29576: *3395329 http fastcgi header done
>> 2018/04/09 18:21:23 [debug] 29576#29576: *3395329 http file cache send: /var/www/site/cache/pages/49/1d/2756424aaf76d1f24c982e863d611d49
>> 2018/04/09 18:21:23 [debug] 29576#29576: *3395329 HTTP/1.1 200
> 
> [...]
> 
> Судя по приведённому debug log'у, в кэше лежит валидный ответ
> бэкенда с "Status: 200" и "Content-Length: 0", который и отдаётся
> клиенту.
> 
> Очевидно, что ответ этот nginx не сам придумал, а получил от
> бэкенда.  Почему бэкенд прислал именно такой ответ - надо смотреть
> в debug log'е в тот момент, когда это произошло.

С бэкендом все нормально. Это глюк на стороне nginx.

Такой глюк происходит в том случае, когда из интернета на сайт
отправляется запрос HEAD - есть очень много роботов, которые сначала
отправляют HEAD запрос, и потом только делают нормальный GET запрос.

Причина в том, что в документации для директивы fastcgi_cache_key
указано некорректное с точки зрения протокола HTTP значение
localhost:9000$request_uri - так оно нормально работать не будет.

Даже если добавить туда $scheme и $host, например, так:
fastcgi_cache_key "$scheme://$host$request_uri";
- этот глюк с пустыми ответами все равно останется.

Пока что существует только один workaround:
добавить $request_method в fastcgi_cache_key
Например, вот так:

fastcgi_cache_key "$request_method $scheme://$host$request_uri";

Подозреваю что сейчас в интернете есть очень много сайтов, которые
используют модуль fastcgi, на которых включено кеширование в nginx
и значение директивы fastcgi_cache_key скопировано из документации.

Идеальным вариантом решения проблемы было бы добавление директивы
fastcgi_cache_convert_head со значением "on" по умолчанию,
по аналогии с имеющейся директивой proxy_cache_convert_head.

-- 
Best regards,
  Gena



Подробная информация о списке рассылки nginx-ru