Nginx / SSI независимое кэширование фрагментов

Я пытаюсь настроить базовый рабочий пример Nginx + SSI:

Конфигурация Nginx (только соответствующие части, для краткости):

ssi on;
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:20m max_size=20m inactive=60m use_temp_path=off;

server {
listen 80;
server_name localhost;
location / {
proxy_cache  my_cache;
proxy_set_header  Host $host;
proxy_http_version  1.1;
proxy_buffering  on;
proxy_pass  http://127.0.0.1:81;
}
}

server {
listen 81;
root /path/to/root;
location ~ ^/.+\.php {
fastcgi_pass  127.0.0.1:9000;
}
}

ssi.php:

<?php
header('Cache-Control: public, s-maxage=5');
?>
Time: <?php echo time(); ?>
Fragment time: <!--# include virtual="/time.php" -->

time.php:

<?php
header('Cache-Control: no-cache');
echo time();

Включение работает хорошо:

Время: 1466710388
Время фрагмента: 1466710388

Теперь, секунду спустя, я ожидаю, что страница (ssi.php) все еще будет кэшироваться, но time.php фрагмент должен быть свежим:

Время: 1466710388
Время фрагмента: 1466710389

Однако он остается неизменным в течение 5 секунд, после чего страница ssi обновляется вместе с фрагментом:

Время: 1466710393
Время фрагмента: 1466710393

Я делал это раньше с ESI и Varnish, и ожидаю, что это будет работать так же с SSI. Я ошибаюсь, предполагая это? Я не могу найти ответ на этот вопрос в Интернете и экспериментировал с различными заголовками управления кэшем, но я вполне уверен, что это правильный способ сделать это. Что мне здесь не хватает?

4

Решение

В вашей конфигурации есть проблема: у вас включен SSI на обоих серверах, из-за

ssi on;

определяется на уровне http {}. Это приводит к расширению директив SSI на втором сервере {}. Ответ, кэшированный на первом сервере, не содержит никаких директив SSI (они уже развернуты), и, следовательно, он остается неизменным все время.

Если вы хотите, чтобы включенный фрагмент был свежим при каждом запросе, вы должны включить SSI только на первом сервере, например:

proxy_cache_path /path/to/cache keys_zone=my_cache:20m;

server {
listen 80;
server_name first.example.com;

location / {
proxy_pass  http://127.0.0.1:81;
proxy_cache my_cache;
ssi on;
}
}

server {
listen 81;
server_name second.example.com;

location ~ ^/.+\.php {
fastcgi_pass  127.0.0.1:9000;
}
}

Обратите внимание, что ssi on находится на первом сервере, вместе с proxy_cache my_cache, Таким образом, nginx будет кешировать ответы бэкэнда с директивами SSI и повторять обработку SSI при каждом запросе, при необходимости кеширование включается отдельно.

3

Другие решения

ты только one string для эквивалентного кэша или без кэша вам нужно создать тестовую страницу и загрузить процесс php для получения страницы генерации около 2 секунд. и вывод изображения и другого статического контента на страницу ….

постскриптум ваш результат не имеет значения, потому что вы запрашиваете скрипт на сервере и устанавливаете заголовок.

-2

По вопросам рекламы [email protected]