<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>