FastCGI缓存总是一个MISS

Jor*_*ing 6 nginx cache fastcgi php-fpm

所以,我已经像这样设置了 FastCGI 缓存:

location ~ \.php(/.*)?$ {
    fastcgi_cache RWI;
    fastcgi_cache_valid 200 60m;

    set $nocache 0;
    if ($request_method = POST)
    {
        set $nocache 1;
    }

    if ($http_cookie ~ (rwi_userid*|rwi_password*)) {
        set $nocache 1;
    }

    if ($request_uri ~* "/(vb/admincp/)") {
        set $nocache 1;
    }

    fastcgi_no_cache $nocache;
    fastcgi_cache_bypass $nocache;

    fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_pass "unix:/var/www/vhosts/system/{domain}/php-fpm.sock";
    include /etc/nginx/fastcgi.conf;
}
Run Code Online (Sandbox Code Playgroud)

server{}块的顶部,我有:

fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=RWI:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
add_header X-Cache $upstream_cache_status;
Run Code Online (Sandbox Code Playgroud)

问题是我的 PHP 脚本 (vBulletin) 总是发送 Pragma & Cache-Control private。当上述规则不适用时,有没有办法忽略这些标头并强制 FastCGI 使用缓存?我有点迷失在这种缓存的可能性中。

Xav*_*cas 10

当 Nginx 用作反向代理以遵守 HTTP 中间缓存规范时,它会解释一堆标头。这意味着以下标头(如果出现在您的应用回复中)将更改缓存行为,如下所述:

  • “X-Accel-Expires”标头字段以秒为单位设置响应的缓存时间。零值禁用响应缓存。如果该值以 @ 前缀开头,则它会设置自 Epoch 以来的绝对时间(以秒为单位),直到可以缓存响应为止。

  • 如果头部不包含“X-Accel-Expires”字段,可以在头部字段“Expires”或“Cache-Control”中设置缓存参数。

  • 如果标头包含“Set-Cookie”字段,则不会缓存此类响应。

  • 如果标头包含具有特殊值“*”的“Vary”字段,则不会缓存此类响应(1.7.7)。如果标头包含具有另一个值的“Vary”字段,则将考虑到相应的请求标头字段(1.7.7)来缓存此类响应。

但是,fastcgi_ignore_headers如果您想关闭它,nginx 会附带该指令。所以你要找的是:fastcgi_ignore_headers Cache-Control Pragma;