2016-06-23 39 views
4

Я пытаюсь создать базовую рабочую 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 секунд, после чего страница ГНУ обновляется вместе с фрагментом:

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

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

ответ

2

Существует проблема в вашей конфигурации: вы включили 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 по каждому запросу, при необходимости кеширование будет включать в себя отдельно.

+0

Вы, сэр, потрясающие! Я отказался от этого, но перемещение директивы 'ssi on' сделало трюк.Огромное спасибо. –

-1

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^