Re: Cache Revalidate

2013-11-27 Пенетрантность Maxim Dounin
Hello!

On Tue, Nov 26, 2013 at 09:07:51PM -0500, S.A.N wrote:

 Есть досадные мелочи, которые хотелось бы исправить, при включении
 fastcgi_cache_revalidate on, параметр HTTP_IF_MODIFIED_SINCE, всегда
 отправляется на сервер, даже если кеша нет,  бекенду будет отправлен
 параметр с пустым значением.
 
 По стандартам HTTP при отсутствии кеша, клиент не должен отправлять
 заголовок If-Modified-Since.
 Более правильно если Nginx так же как и браузеры, при отсутствии кеша не
 будет передавать в бекенд пустой хедер If-Modified-Since, т.е нет кеша нет
 хедера, сейчас приходится в конфиге писать 
 fastcgi_param HTTP_IF_MODIFIED_SINCE  $upstream_cache_last_modified
 if_not_empty;
 чтобы пустой хедер не приходил, как этого требует стандарт.

Да, это имеет смысл поправить. В proxy-то всё нормально, а вот в 
fastcgi/scgi/uwsgi из-за необходимости местами посылать пустые 
параметры - теперь уходит пустое значение в 
HTTP_IF_MODIFIED_SINCE.  Патч какой-то такой:

# HG changeset patch
# User Maxim Dounin mdou...@mdounin.ru
# Date 1385558623 -14400
#  Wed Nov 27 17:23:43 2013 +0400
# Node ID ca0cde10bf45b5a1d7c0574a1752dcde01b04061
# Parent  19afb15852d2b4c5354a24a2de25a33d5fa77364
Upstream: skip empty cache headers.

Notably this fixes HTTP_IF_MODIFIED_SINCE which was always sent with
cache enabled in fastcgi/scgi/uwsgi after 43ccaf8e8728.

diff --git a/src/http/modules/ngx_http_fastcgi_module.c 
b/src/http/modules/ngx_http_fastcgi_module.c
--- a/src/http/modules/ngx_http_fastcgi_module.c
+++ b/src/http/modules/ngx_http_fastcgi_module.c
@@ -2796,7 +2796,7 @@ ngx_http_fastcgi_merge_params(ngx_conf_t
 
 s-key = h-key;
 s-value = h-value;
-s-skip_empty = 0;
+s-skip_empty = 1;
 
 next:
 
diff --git a/src/http/modules/ngx_http_scgi_module.c 
b/src/http/modules/ngx_http_scgi_module.c
--- a/src/http/modules/ngx_http_scgi_module.c
+++ b/src/http/modules/ngx_http_scgi_module.c
@@ -1506,7 +1506,7 @@ ngx_http_scgi_merge_params(ngx_conf_t *c
 
 s-key = h-key;
 s-value = h-value;
-s-skip_empty = 0;
+s-skip_empty = 1;
 
 next:
 
diff --git a/src/http/modules/ngx_http_uwsgi_module.c 
b/src/http/modules/ngx_http_uwsgi_module.c
--- a/src/http/modules/ngx_http_uwsgi_module.c
+++ b/src/http/modules/ngx_http_uwsgi_module.c
@@ -1670,7 +1670,7 @@ ngx_http_uwsgi_merge_params(ngx_conf_t *
 
 s-key = h-key;
 s-value = h-value;
-s-skip_empty = 0;
+s-skip_empty = 1;
 
 next:
 

 Настроить subsecond ревалидацию в Nginx по стандартам HTTP тоже невозможно.
 Если бекенд отдает заголовок
 Cache-Control: max-age=0 и/или Expires: -1
 Nginx воспринимает их как указания не кешировать ответ, но по стандартам эти
 заголовки не запрещают кешировать они указывают клиенту что ответ сервера
 можно кешировать, но он сразу же устаревает и следущий запрос должен пройти
 ревалидацию, т.е клиент должен каждый запрос отправлять с хедерем
 If-Modified-Since.
 Мы нашли способ, как заставить Nginx кешировать такие ответы, отправить ему
 хедер
 X-Accel-Expires: @$time-1 
 Тогда Nginx ведет себя правильно, т.е. так же как браузеры, которым
 достаточно отправить Cache-Control: max-age=0
 Если, есть более красивое решения вместо X-Accel-Expires: @$time-1, хотелось
 бы его узнать. 

А use case какой?  С учётом характерных времён доступа по http - 
запрет кеширования даже на 1 секунду выглядит странно.

Вообще я склонен думать, что тот факт, что X-Accel-Expires в таком 
виде работает - это скорее баг.  Впрочем, можно его таким и 
оставить.

-- 
Maxim Dounin
http://nginx.org/en/donation.html

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Cache Revalidate

2013-11-27 Пенетрантность denis

27.11.2013 18:06, Maxim Dounin пишет:

Вообще я склонен думать, что тот факт, что X-Accel-Expires в таком
виде работает - это скорее баг.  Впрочем, можно его таким и
оставить.

...это скорее баг. Поправим в следующей версии.


___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Cache Revalidate

2013-11-27 Пенетрантность S.A.N
 А use case какой?  С учётом характерных времён доступа по http - 
 запрет кеширования даже на 1 секунду выглядит странно.

Есть смысл в кешировании с max-age=0, на страницах где недопустима задержка
даже в 1 сек, в отображении актуальных данных, по этому есть смысл кешить,
это нормальная практика, вот цифры.
Бекенд, генерит страницу за 0,8 сек, проведения ревалидации кеша на бекенде
и ответ с кодом 304 занимает по времени 0.01 сек, разница как видите
огромная.
Если средний rps не меньше хотя бы 10, тогда есть смысл в кешировании таких
страниц с постоянной ревалидацией.

Если нет других способов заставить Nginx, кешировать как этого требует HTTP
стандарты, тогда нужно оставить способ с X-Accel-Expires, даже если это баг
:)

Posted at Nginx Forum: 
http://forum.nginx.org/read.php?21,244991,245011#msg-245011

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Cache Revalidate

2013-11-27 Пенетрантность Maxim Dounin
Hello!

On Wed, Nov 27, 2013 at 01:22:46PM -0500, S.A.N wrote:

  А use case какой?  С учётом характерных времён доступа по http - 
  запрет кеширования даже на 1 секунду выглядит странно.
 
 Есть смысл в кешировании с max-age=0, на страницах где недопустима задержка
 даже в 1 сек, в отображении актуальных данных, по этому есть смысл кешить,
 это нормальная практика, вот цифры.
 Бекенд, генерит страницу за 0,8 сек, проведения ревалидации кеша на бекенде
 и ответ с кодом 304 занимает по времени 0.01 сек, разница как видите
 огромная.
 Если средний rps не меньше хотя бы 10, тогда есть смысл в кешировании таких
 страниц с постоянной ревалидацией.

Вот и я о том же - если страница генерится 0.8 секунд, то как 
может быть недопустимым кешировать её на 1 секунду?  Откуда 
взялось требование о недопустимости?

 Если нет других способов заставить Nginx, кешировать как этого требует HTTP
 стандарты, тогда нужно оставить способ с X-Accel-Expires, даже если это баг
 :)

У вас какие-то странные представления о http-стандартах.  Они 
вообще ничего не требуют кешировать.  Кеш - дело сугубо 
добровольное.  ;)

-- 
Maxim Dounin
http://nginx.org/en/donation.html

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

output_buffers по дефолту

2013-11-27 Пенетрантность Андрей Василишин

Здравствуйте!
Ни в документации
нив вики не нашел, по дефолту чему равно output_buffers, работает ли 
директива без aio и directio для линукс?


___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: output_buffers по дефолту

2013-11-27 Пенетрантность Maxim Dounin
Hello!

On Wed, Nov 27, 2013 at 08:43:24PM +0200, Андрей Василишин wrote:

 Здравствуйте!
 Ни в документации
 нив вики не нашел, по дефолту чему равно output_buffers, работает ли
 директива без aio и directio для линукс?

Default - 1 буфер размером 32k.  Директива работает всегда, когда 
нужно прочитать ответ с диска.

-- 
Maxim Dounin
http://nginx.org/en/donation.html

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Cache Revalidate

2013-11-27 Пенетрантность Maxim Dounin
Hello!

On Wed, Nov 27, 2013 at 02:30:01PM -0500, S.A.N wrote:

  Они 
  вообще ничего не требуют кешировать.  Кеш - дело сугубо 
  добровольное.  ;)
 
 max-age=0 не требует кешировать ответ, смысл в том что он не запрещает
 кешировать ответ, в Nginx max-age=0 запрещает кеширования, в этом и есть не
 соответвия Nginx с спецификацией HTTP.

Повторюсь: несоответствия тут нет, кеш - дело сугубо добровольное.  
В подавляющем большинстве случаев max-age=0 означает, что 
кешировать ответ смысла нет, и nginx не тратит лишних ресурсов на 
то, чтобы этим заниматься.

Жаль, что вы с таким упорством отказываетесь рассказать про ваш 
use case и о происхождении требования о недопустимости кеширования 
даже на 1 секунду.  Возможно, это позволило бы пересмотреть 
существующее поведение при max-age=0, благо в Cache-Control есть и 
другие способы запрета кеширования.

-- 
Maxim Dounin
http://nginx.org/en/donation.html

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Cache Revalidate

2013-11-27 Пенетрантность S.A.N
 use case и о происхождении требования о недопустимости кеширования 
 даже на 1 секунду.  Возможно, это позволило бы пересмотреть 
 существующее поведение при max-age=0, благо в Cache-Control есть и 
 другие способы запрета кеширования.

use case продиктован нашей бизнес логикой, мы кешируем все даже страницы для
залогиненых пользователей (персонал данные подтягиваются через ajax с
использованием клиентского кэширования браузера), в этом есть смысл, цифры я
уже писал, разница скорости в генерации страницы и в ревалидации отличается
в десятки раз, в пользу ревалидации.

Есть сайт с хорошей посещаемостью, залогиненые пользователи имеют
возможность общатся, создавать свой контент, редактировать, удалять, есть
так же платные сервисы.

Наши клиенты не хотят и не должны ждать, даже если это одна секунда, ну
например, клиент написал комментарий на сайте, POST ушел на сервер, если у
нас кеширования на 1 секунду, мы клиенту не можем сразуже показать новую
страницу, должны сделать задержку на 1 сек потом обновить его страницу или
как на Хабре все комментарии видны с задержкой и люди это терпят.

Конечно мы тоже можем так сделать, но зачем, если скорость ревалидации нам
позволяет убрать необходимость в задержках и клиент будет доволен  и
работать все будет стабильно, главное это сделать совсем не сложно.

Сейчас мы это делаем на уровне кеше браузера, с применением ETag, но если
Nginx сделает возможность в постоянной ревалидации по ETag, тогда этот
алгоритм кеширования который проверен и отлично работает на клиенском кеше
браузера мы сможем перенести на кеш Nginx, что во многом увеличит повторное
использования кеша, особенно для незалогиненых юзеров.

Нам не интересно делать задержки в кеше, представте если бы Facebook делал
задержки в отображении, даже если бы на этом форуме были задержки в
отображении написанных постов, все бы конечно смерились но это совсем не
круто.

Есть другой вариант обычно так и делают, не кешируют страницы которые
критичны к задержкам и часто обновляются, но это тоже не круто, такие
запросы будут нагружать бекенд, время отклика будет падать, очередь запросов
к FastCGI будет расти, так до таймаутов осталось не долго.

В общем, мы знаем как можно обойтись без постоянной ревалидации, но так же
мы знаем как все будет круто, если реализовать постоянную ревалидацию.

Почему бы и нет?

Posted at Nginx Forum: 
http://forum.nginx.org/read.php?21,244991,245024#msg-245024

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Cache Revalidate

2013-11-27 Пенетрантность S.A.N
Уточнения, там где контент совсем статичный мы кешируем его на долго без
ревалидации.
Постоянная ревалидация нам нужна только на динамичном контенте, все
написанное выше имеет отношения только к динамичному контенту.

Posted at Nginx Forum: 
http://forum.nginx.org/read.php?21,244991,245025#msg-245025

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Cache Revalidate

2013-11-27 Пенетрантность Alexander Moskalenko
А что вам мешает организовать кеш в мемкеше или другом подобном хранилище?
Мы у себя так сделали, кеш (на nginx) выключили вообще за ненадобностью.


2013/11/27 S.A.N nginx-fo...@nginx.us

  use case и о происхождении требования о недопустимости кеширования
  даже на 1 секунду.  Возможно, это позволило бы пересмотреть
  существующее поведение при max-age=0, благо в Cache-Control есть и
  другие способы запрета кеширования.

 use case продиктован нашей бизнес логикой, мы кешируем все даже страницы
 для
 залогиненых пользователей (персонал данные подтягиваются через ajax с
 использованием клиентского кэширования браузера), в этом есть смысл, цифры
 я
 уже писал, разница скорости в генерации страницы и в ревалидации отличается
 в десятки раз, в пользу ревалидации.

 Есть сайт с хорошей посещаемостью, залогиненые пользователи имеют
 возможность общатся, создавать свой контент, редактировать, удалять, есть
 так же платные сервисы.

 Наши клиенты не хотят и не должны ждать, даже если это одна секунда, ну
 например, клиент написал комментарий на сайте, POST ушел на сервер, если у
 нас кеширования на 1 секунду, мы клиенту не можем сразуже показать новую
 страницу, должны сделать задержку на 1 сек потом обновить его страницу или
 как на Хабре все комментарии видны с задержкой и люди это терпят.

 Конечно мы тоже можем так сделать, но зачем, если скорость ревалидации нам
 позволяет убрать необходимость в задержках и клиент будет доволен  и
 работать все будет стабильно, главное это сделать совсем не сложно.

 Сейчас мы это делаем на уровне кеше браузера, с применением ETag, но если
 Nginx сделает возможность в постоянной ревалидации по ETag, тогда этот
 алгоритм кеширования который проверен и отлично работает на клиенском кеше
 браузера мы сможем перенести на кеш Nginx, что во многом увеличит повторное
 использования кеша, особенно для незалогиненых юзеров.

 Нам не интересно делать задержки в кеше, представте если бы Facebook делал
 задержки в отображении, даже если бы на этом форуме были задержки в
 отображении написанных постов, все бы конечно смерились но это совсем не
 круто.

 Есть другой вариант обычно так и делают, не кешируют страницы которые
 критичны к задержкам и часто обновляются, но это тоже не круто, такие
 запросы будут нагружать бекенд, время отклика будет падать, очередь
 запросов
 к FastCGI будет расти, так до таймаутов осталось не долго.

 В общем, мы знаем как можно обойтись без постоянной ревалидации, но так же
 мы знаем как все будет круто, если реализовать постоянную ревалидацию.

 Почему бы и нет?

 Posted at Nginx Forum:
 http://forum.nginx.org/read.php?21,244991,245024#msg-245024

 ___
 nginx-ru mailing list
 nginx-ru@nginx.org
 http://mailman.nginx.org/mailman/listinfo/nginx-ru

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru