<div dir="ltr">Один php скрипт занимается раздачей статистики с сайта в двух видах. 
Кешируется по сути один файл на секунду (так надо).  При этом есть два 
типа запросов, и кеш настроен их различать. Для первого типа всегда 
отдается бекендом с заголовком header("X-Accel-Expires: 0"); а для 
второго header("X-Accel-Expires: 1"); Все работает. Запросы первого типа
 не кешируются вообще, запросы второго типа кешируются на секунду. В 
кеше 1 файл как раз второго типа.<br><div><br>
А теперь вопрос - почему кеш nginx может создавать задержки. Т.е. вот 
идут запросы нормально, время ответа 150мс, и тут вдруг внезапно 
задержка - от 2с до 20с, бывало. При этом другие запросы к серверу идут 
как обычно по расписанию (раз в 2 секунды). Более того, зависший запрос 
может так и висеть, когда следующие за ним уже отправились и 
выполнились. Бывало выполнялось по 10 следующих запросов за те 20 секунд
 зависания. И естественно данные приходили в развисшем запросе 
устаревшие. Не могу понять почему такое может быть ...<br><br>
Параметры кеширования nginx <br><pre><code><span>proxy_cache_path</span> /tmp/site levels= keys_zone=pagecache:<span>1m</span> max_size=<span>1m</span>;
<span>proxy_cache</span>             pagecache;
<span>proxy_cache_valid</span>       <span>200</span> <span>1s</span>;
<span>proxy_cache_lock</span> <span>on</span>;
<span>proxy_cache_lock_timeout</span> <span>100s</span>;
<span>proxy_cache_use_stale</span>  updating;
<span>proxy_ignore_headers</span> Expires Cache-Control;
<span>if</span> (<span>$arg_callback</span>) {
  <span>set</span> <span>$callback</span> callback;
}
<span>proxy_cache_key</span> <span>$scheme</span><span>$proxy_host</span><span>$uri</span><span>$arg_widget</span><span>$arg_layer</span><span>$callback</span>;
<span>proxy_pass_header</span> <span>"X-Accel-Expires"</span>;
<span>sub_filter</span> <span>'callback'</span> <span>$arg_callback</span>;</code></pre><br><br>
Контроль и замена callback - это для jQuery ajax'а фикс, можете не 
обращать внимания. Стоит cache_lock + proxy_cache_use_stale  updating, 
т.е. при ожидании обновления кеша должны отдаваться старые данные. Все 
так и происходит во задержек проблем на сервере, проблема явно не тут. 
Тем более что последующие за зависшим вопросы проходят нормально, а 
зависший все еще  висит, явно не ожидание обновления кеша.<br><br>
Сам ответ на бекенде генерируется в пределах 30мс, проверял по mircotime() php.<br><br></div><div>Запросы, которые не попадают в location с кешированием, тоже иногдла заредживаются, но на пару секунд максимум. Число worker стоит auto, сервер мощный и не перегружен.<br></div><div><br>
В кеше 1 файл, не думаю что проблема в задержка HDD. Т.е. прям реально в
 папке /tmp/site всего 1 файл с кешем. Плюс к тому зависают не только 
вопросы из кешируемой группы, но и запросы из некешируемой тоже. Хотя 
они всегда должны сразу уходить на бекенд и возвращаться с ответом.  </div></div>