fastcgi cache background update ssi подзапросов

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

fastcgi cache background update ssi подзапросов

rnburn
Приветствую!

Директива fastcgi_cache_background_update странно ведёт себя при ssi
подзапросах.
Есть сервис со сложной бизнес логикой, главная страница загружается 1 сек,
стек nginx + php-fpm. В ходе оптимизации скорости загрузки было решено
вынести генерацию самого долгого куска страницы в отдельный ssi подзапрос и
кешировать его на 1 час. Кешированием управляет fastcgi сервер на php с
помощью заголовка Cache-Control.

С кеширование проблем нет, nginx успешно кеширует подзапросы /ssi_dev/ и
складывает их на диск. Проблемы начинаются когда кеш протухает.

Текущее поведение nginx
- если есть элемент в кеше, то он успешно отдается(HIT)
- если есть элемент в кеше, но он устарел, то клиенту отдаётся устаревшая
версия(STALE) и делается подзапрос на прогрев кеша(EXPIRED)

Проблема заключается в том, что подзапрос на прогрев кеша выполняется в
блокирующем режиме. То есть основной запрос ждёт выполнения подзапроса.
Указанная выше проблема не наблюдается, если в кеш класть всю страницу,
поведение nginx соответствует документации. Клиенту отдаётся старая версия
контента и делается неблокирующий подзапрос на обновление.

Конфиг nginx

location / {
    try_files $uri /index_dev.php$is_args$args;
}

location ~ /ssi_dev/ {
    access_log /var/log/nginx/access-dev.log ssi;
    fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;

        ssi               on;
        ssi_silent_errors off;
           
        add_header              X-Cache         $upstream_cache_status;
        add_header              X-Cache-Control $upstream_http_cache_control;
        add_header              X-Expires       $upstream_http_expires;

        fastcgi_cache_methods   GET HEAD;
        fastcgi_cache           MY_CACHE;

        fastcgi_cache_min_uses  1;
        fastcgi_cache_lock      on;
        fastcgi_cache_use_stale error timeout invalid_header updating http_500
http_503;
        fastcgi_cache_background_update on;

        fastcgi_hide_header     Cache-Control;
        fastcgi_hide_header     Expires;
   
    fastcgi_param REQUEST_URI     $uri$is_args$args;
    fastcgi_param SCRIPT_FILENAME $document_root/index_dev.php;
    fastcgi_cache_key $scheme$request_method$host$uri$is_args$args;
   
    internal;
}

location ~ ^/(index_dev|config)\.php(/|$) {
    access_log /var/log/nginx/access-dev.log main;
    fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;

        ssi               on;
        ssi_silent_errors off;
           
        add_header              X-Cache         $upstream_cache_status;
        add_header              X-Cache-Control $upstream_http_cache_control;
        add_header              X-Expires       $upstream_http_expires;

        fastcgi_cache_methods   GET HEAD;
        fastcgi_cache           MY_CACHE;

        fastcgi_cache_min_uses  1;
        fastcgi_cache_lock      on;
        fastcgi_cache_use_stale error timeout invalid_header updating http_500
http_503;
        fastcgi_cache_background_update on;

        fastcgi_hide_header     Cache-Control;
        fastcgi_hide_header     Expires;

    fastcgi_param REQUEST_URI     $request_uri;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_cache_key $scheme$request_method$host$request_uri$is_args$args;
}


Вопрос
Возможно ли обновлять устаревшие элементы кеша при ssi подзапросах в НЕ
блокирующем режиме?

Posted at Nginx Forum: https://forum.nginx.org/read.php?2,274136,274136#msg-274136

_______________________________________________
nginx mailing list
[hidden email]
http://mailman.nginx.org/mailman/listinfo/nginx
Reply | Threaded
Open this post in threaded view
|

Re: fastcgi cache background update ssi подзапросов

Roman Arutyunyan
Добрый день,

On Wed, May 10, 2017 at 12:04:39PM -0400, metalfm1 wrote:

> Приветствую!
>
> Директива fastcgi_cache_background_update странно ведёт себя при ssi
> подзапросах.
> Есть сервис со сложной бизнес логикой, главная страница загружается 1 сек,
> стек nginx + php-fpm. В ходе оптимизации скорости загрузки было решено
> вынести генерацию самого долгого куска страницы в отдельный ssi подзапрос и
> кешировать его на 1 час. Кешированием управляет fastcgi сервер на php с
> помощью заголовка Cache-Control.
>
> С кеширование проблем нет, nginx успешно кеширует подзапросы /ssi_dev/ и
> складывает их на диск. Проблемы начинаются когда кеш протухает.
>
> Текущее поведение nginx
> - если есть элемент в кеше, то он успешно отдается(HIT)
> - если есть элемент в кеше, но он устарел, то клиенту отдаётся устаревшая
> версия(STALE) и делается подзапрос на прогрев кеша(EXPIRED)
>
> Проблема заключается в том, что подзапрос на прогрев кеша выполняется в
> блокирующем режиме. То есть основной запрос ждёт выполнения подзапроса.
> Указанная выше проблема не наблюдается, если в кеш класть всю страницу,
> поведение nginx соответствует документации. Клиенту отдаётся старая версия
> контента и делается неблокирующий подзапрос на обновление.

На текущий момент background update реализован так, что он блокирует основной
запрос, если запущен в подзапросе.  Это как раз ваш случай.
В таск https://trac.nginx.org/nginx/ticket/1249 я аттачил патч, который должен
это вылечить.

[..]

--
Roman Arutyunyan
_______________________________________________
nginx mailing list
[hidden email]
http://mailman.nginx.org/mailman/listinfo/nginx
Reply | Threaded
Open this post in threaded view
|

Re: fastcgi cache background update ssi подзапросов

nginx mailing list
https://mailman.nginx.org/mailman/listinfo/nginx-ru
---
B. R.

2017-05-10 19:18 GMT+02:00 Roman Arutyunyan <[hidden email]>:
Добрый день,

On Wed, May 10, 2017 at 12:04:39PM -0400, metalfm1 wrote:
> Приветствую!
>
> Директива fastcgi_cache_background_update странно ведёт себя при ssi
> подзапросах.
> Есть сервис со сложной бизнес логикой, главная страница загружается 1 сек,
> стек nginx + php-fpm. В ходе оптимизации скорости загрузки было решено
> вынести генерацию самого долгого куска страницы в отдельный ssi подзапрос и
> кешировать его на 1 час. Кешированием управляет fastcgi сервер на php с
> помощью заголовка Cache-Control.
>
> С кеширование проблем нет, nginx успешно кеширует подзапросы /ssi_dev/ и
> складывает их на диск. Проблемы начинаются когда кеш протухает.
>
> Текущее поведение nginx
> - если есть элемент в кеше, то он успешно отдается(HIT)
> - если есть элемент в кеше, но он устарел, то клиенту отдаётся устаревшая
> версия(STALE) и делается подзапрос на прогрев кеша(EXPIRED)
>
> Проблема заключается в том, что подзапрос на прогрев кеша выполняется в
> блокирующем режиме. То есть основной запрос ждёт выполнения подзапроса.
> Указанная выше проблема не наблюдается, если в кеш класть всю страницу,
> поведение nginx соответствует документации. Клиенту отдаётся старая версия
> контента и делается неблокирующий подзапрос на обновление.

На текущий момент background update реализован так, что он блокирует основной
запрос, если запущен в подзапросе.  Это как раз ваш случай.
В таск https://trac.nginx.org/nginx/ticket/1249 я аттачил патч, который должен
это вылечить.

[..]

--
Roman Arutyunyan
_______________________________________________
nginx mailing list
[hidden email]
http://mailman.nginx.org/mailman/listinfo/nginx


_______________________________________________
nginx mailing list
[hidden email]
http://mailman.nginx.org/mailman/listinfo/nginx