Joomla、Nginx 和 FastCGI 缓存

Joomla、Nginx 和 FastCGI 缓存

我正在将我托管的一些 Joomla 网站从 LAMP 堆栈移至 LEMP 堆栈。我按照指南启动并运行了 FastCGI Cache,并且使用文档根目录中的单个 time.php 文件,我可以看到缓存正在运行。

但是,当我从同一个 Web 服务器加载我的 Joomla 网站时,缓存并没有发挥作用。

如果我使用 CURL 分析访问 Joomla 网站主页时的标头,我可以看到以下内容:

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
X-Cache: MISS

最后一个 X-Cache 条目是我作为指南的一部分添加的自定义标头,仅用于指示是否正在使用缓存。但是,其他两个条目必须由 Joomla 在某个时候生成,这似乎与缓存未被使用有关。(当我使用 CURL 处理我之前提到的 time.php 文件时,这两行会丢失,因为它不是 Joomla 网站的一部分。)

我知道这里可能发生了一些 Joomla 特有的事情,所以我会询问如何在 Joomla 论坛上改变 Joomla 的行为。

我对 SE 的问题略有不同:Cache-Control 和 Pragma 条目是否负责阻止我的网站使用 FastCGI 缓存,我是否可以向 nginx conf 文件添加任何内容来删除这些条目?

答案1

两个问题,两个答案:

Cache-Control 和 Pragma 条目是否负责阻止我的网站使用 FastCGI 缓存?

是的,他们是。

实际上它是“Cache-Control”标头。在 HTTP 1.0 的美好时代,“Pragma”标头从未被设计为 HTTP 响应标头(应该只是 HTTP 请求标头)。

我可以向 Nginx conf 文件添加任何内容来删除这些条目吗?

是的,你可以——但也许你不应该。

缓存私人内容可能会导致灾难,因为您可能会向 CMS 管理面板显示每个未知访问者。您必须检查 CMS 是否为每个访问者创建一个新会话,或者这是否仅适用于后端用户。如果 CMS 为每个访问者创建一个会话,我建议不要缓存。如果不是这种情况,但 CMS 提供了这些“不可缓存”标头,您可以使用 Nginx 覆盖此行为。

依我拙见,您不应该在 Web 服务器中覆盖程序员在 CMS 代码中所做的操作。但我们生活在一个不完美的世界。很少有优秀的 CMS 程序员知道他们在 Cache-Control 标头方面做了什么。

我在此描述的覆盖会忽略 CMS 的 Cache-Control 标头(只要没有会话 cookie)。因此,可以缓存公共页面。但是,如果客户端打开后端的登录页面,将启动一个会话并设置一个会话 cookie。由于会话 cookie,此客户端的所有后续请求都将在不使用缓存数据的情况下得到响应。

如何覆盖:

1)您必须识别会话 cookie 的名称(例如 PHPSESSID)。

2) 调整您的 Nginx 配置。请参阅下面的示例:

# deliver static files or handle URL by CMS
location / {
    try_files               $uri @php;
}

# execute directly addressed PHP files
location ~ \.php$ {
    try_files               /467e1r1afrptaubui2oum6r95ssy9zbe.htm @php;
}

# common php handler
location @php {
    try_files               $uri /index.php?url=$uri&$query_string;

    include                 fastcgi_params;

    fastcgi_pass            unix:/run/php/php7.2-fpm.sock;
    fastcgi_index           index.php;
    fastcgi_param           SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    fastcgi_param           SCRIPT_NAME      $fastcgi_script_name;

    # caching
    fastcgi_cache           phpfpm;
    fastcgi_cache_key       "$request_method $scheme://$host$request_uri";
    fastcgi_cache_use_stale updating error timeout invalid_header http_500;
    # overwrite: cache web pages and permanent redirects for one hour
    fastcgi_cache_valid     200 301 3600s;

    # pass header Set-Cookie and Cookie
    fastcgi_pass_header     Set-Cookie;
    fastcgi_pass_header     Cookie;
    # ignore header Cache-Control, Expires and Vary
    fastcgi_ignore_headers  Cache-Control Expires Vary;
    # hide headers Expires, Pragma, Vary
    fastcgi_hide_header     Expires;
    fastcgi_hide_header     Pragma;
    fastcgi_hide_header     Vary;

    # do not cache if cookie PHPSESSID exists
    fastcgi_no_cache        $cookie_PHPSESSID;
    fastcgi_cache_bypass    $cookie_PHPSESSID;
}

3)测试您的设置。

相关内容