AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 945573
Accepted
Rob Methven
Rob Methven
Asked: 2018-12-17 10:38:40 +0800 CST2018-12-17 10:38:40 +0800 CST 2018-12-17 10:38:40 +0800 CST

Joomla、Nginx 和 FastCGI 缓存

  • 772

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

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

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

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 文件中来删除这些条目的吗?

nginx
  • 1 1 个回答
  • 917 Views

1 个回答

  • Voted
  1. Best Answer
    Jens Bradler
    2018-12-19T11:15:44+08:002018-12-19T11:15:44+08:00

    两个问题,两个答案:

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

    对,他们是。

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

    有什么我可以添加到 Nginx conf 文件中来删除这些条目的吗?

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

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

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

    只要没有会话 cookie,我在这里描述的覆盖就会忽略 CMS 的 Cache-Control 标头。因此可以缓存公共页面。但是,如果客户端打开后端的登录页面,则会启动会话并设置会话 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) 测试您的设置。

    • 1

相关问题

  • Gzip 与反向代理缓存

  • nginx 作为代理的行为

  • Nginx 学习资源 [关闭]

  • 提供 70,000 个静态文件 (jpg) 的最佳方式?

  • 在 Apache、LightTPD 和 Nginx Web 服务器上提供 PHP 5.x 应用程序的现状?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve