proxy_cache + conditional GET

leonid pauzner lpauzner на mail.ru
Сб Фев 20 17:01:09 MSK 2010


Наблюдаю следующую картину:

без proxy-cache:
browser (If-Modified-Since) -> nginx (If-Modified-Since) -> upstream
browser <- (304 Not Modified)  nginx <- (304 Not Modified)  upstream

с proxy-cache:
browser (If-Modified-Since) -> nginx () -> upstream
browser <- (304 Not Modified)  nginx <- (200 OK) upstream


т.е. при наличии proxy-cache апстрим лишается возможности отдавать 304 код, поскольку заголовки If-Modified-Since и If-None-Match к нему не доходят. Даже когда proxy_cache_min_uses > 1

В случае когда апстрим умеет дешево отдавать 304 и при значительном количестве редкоизменяемых страниц - кеш заметно увеличивает нагрузку на апстрим. В то же время совсем отказываться от кеша не хотелось бы, так как он хорошо прикрывает пиковые нагрузки. Типичные запросы с If-Modified-Since приходят от роботов поисковиков и прочих агрегаторов.

Не планируется ли доработать реализацию кеша, чтобы
1) пока не достигнут предел proxy_cache_min_uses - не фильтровать заголовки поскольку страница заведомо в кеш не попадет; и/или
2) когда в кеше уже есть файл и он устарел, то посылать апстриму conditional запрос используя время модификации/ETag документа из кеша, и в случае ответа апстрима 304 - просто обновить время действия документа в кеше. Это также неплохо сочетается с http://www.lexa.ru/nginx-ru/msg30677.html

И, чтобы два раза не вставать, поясните пожалуйста, как рассчитывать размер кей-зоны, и что произойдет если он окажется недостаточен (будет просто больше обращений к диску?), а также отдельно в случае proxy_cache_min_uses > 1 (отдельные счетчики не будут инкрементированны?)


Собственно вот фрагмент кода в ngx_http_proxy_module.c который приоткрывает верхушку айсберга:

#if (NGX_HTTP_CACHE)

static ngx_keyval_t  ngx_http_proxy_cache_headers[] = {
    { ngx_string("Host"), ngx_string("$proxy_host") },
    { ngx_string("Connection"), ngx_string("close") },
    { ngx_string("Keep-Alive"), ngx_string("") },
    { ngx_string("Expect"), ngx_string("") },
    { ngx_string("If-Modified-Since"), ngx_string("") },
    { ngx_string("If-Unmodified-Since"), ngx_string("") },
    { ngx_string("If-None-Match"), ngx_string("") },
    { ngx_string("If-Match"), ngx_string("") },
    { ngx_string("Range"), ngx_string("") },
    { ngx_string("If-Range"), ngx_string("") },
    { ngx_null_string, ngx_null_string }
};

и далее

    h = conf->upstream.cache ? ngx_http_proxy_cache_headers:
                               ngx_http_proxy_headers;




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