Nginx / SSI独立片段caching

我试图设置一个基本的工作Nginx + SSI的例子:

Nginx的configuration(只是相关的部分,为简洁起见):

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)仍然被caching,但time.php片段是新鲜的:

时间:1466710388。分段时间:1466710389

然而它在5秒内保持完全相同,之后ssi页面随着片段一起更新:

时间:1466710393。分段时间:1466710393

我之前用ESI和Varnish做过这个,期待它和SSI一样。 假设我错了吗? 我无法在网上find答案,并尝试了不同的caching控制标题,但我确信这是正确的方法。 我在这里错过了什么?

在你的配置中有一个问题:你在两台服务器上都启用了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处理,如果需要的话,缓存包括单独的。

你只是one string等价的one string缓存或不缓存你需要创建测试页面,并加载PHP进程得到生成页面约2秒。 并输出图像和其他静态内容ob页….

ps你的结果不相关,因为你的服务器请求脚本和设置标题。