wedevelopnl/silverstripe-fpc-purge

1.0.0-rc4 2023-01-03 17:48 UTC

This package is auto-updated.

Last update: 2024-08-30 01:23:45 UTC


README

本模块为网站添加了一些缓存清除功能,以支持nginx或apache中的FPC。

需求

  • 查看composer.json需求
  • 带有Lua模块的nginx

安装

  • composer require wedevelopnl/silverstripe-fpc-purge

配置nginx

安装ngx_cache_purge的最新版本。

然后更新您的服务器配置

fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=fastcgicache:100m max_size=5g inactive=60m use_temp_path=off;
fastcgi_cache_key "$scheme$request_method$host$request_uri";

server {
    location = /purge-cache {
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        fastcgi_cache fastcgicache;
        fastcgi_cache_purge PURGE purge_all from 127.0.0.1;
        cache_purge_response_type text;
    }

    location /index.php {
        fastcgi_buffer_size 32k;
        fastcgi_busy_buffers_size 64k;
        fastcgi_buffers 4 32k;
        fastcgi_keep_conn on;
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;

        # fastcgi caching
        fastcgi_cache fastcgicache;
        fastcgi_cache_valid 200 301 302 60m;
        fastcgi_cache_use_stale error timeout updating invalid_header http_500 http_503;
        fastcgi_cache_min_uses 1;
        fastcgi_cache_lock on;
        fastcgi_no_cache $cookie_PHPSESSID;
        fastcgi_cache_bypass $cookie_PHPSESSID;
        fastcgi_ignore_headers Set-Cookie;

        add_header X-Cache $upstream_cache_status;
    }

    # ...
}

注意:请考虑随机化或以其他方式保护您的URL,以防止滥用。

配置模块

---
Name: 'fpc-purge-config'
Only:
  environment: 'live'
---
WeDevelop\FPCPurge\FPCPurgeConfig:
  enabled: true
  endpoints:
    # Purging locally over HTTP
    - host: localhost:80
      method: PURGE
      path: /purge-cache
    # Purging locally over HTTPS
    - host: tls://localhost:443
      http_host: example.com # Required to tell nginx or apache what virtual host you want to connect to
      method: PURGE
      path: /purge-cache
    # Purging externally over HTTPS
    - host: tls://example.com:443
      method: PURGE
      path: /purge-cache
    # Purging a specific server (useful when load balancing and purging all servers)
    - host: tls://10.0.0.5:443
      http_host: example.com # Required to tell nginx or apache what virtual host you want to connect to
      method: PURGE
      path: /purge-cache

Page:
  extensions:
    - WeDevelop\FPCPurge\Extensions\FPCPurgeExtension

在此处,您可以启用模块并配置用于清除的端点。

您可以通过进入SilverStripe管理界面,然后在侧边栏中单击FPC清除并单击清除缓存按钮来测试此配置。它应该告诉您是否成功。

我们还向页面添加了一个扩展,在发布页面后清除缓存。

注意:发布后的清除操作将打开一个连接,然后发送一个非阻塞请求,对发布性能的影响取决于端点,应该很小或几乎没有影响。

如果您使用dnadesign/silverstripe-elemental,别忘了在BaseElement上也应用此扩展,以确保在发布元素后清除缓存。

DNADesign\Elemental\Models\BaseElement:
  extensions:
    - WeDevelop\FPCPurge\Extensions\FPCPurgeExtension

设置缓存控制

以上所有设置都不会缓存任何内容,直到您设置缓存控制。您可以遵循官方SilverStripe文档,或使用此模块中包含的扩展以实现更简单、更可靠的实现。

PageController:
    extensions:
        - WeDevelop\FPCPurge\Extensions\FPCPurgeControllerExtension

现在您必须向您的PageController添加一个updateCacheControl()方法并配置CacheControl头部。

public function updateCacheControl(): void
{
    HTTPCacheControlMiddleware::singleton()
        ->enableCache()
        ->setSharedMaxAge(3600)
        ->setMaxAge(60);
}

共享最大年龄:此页面允许在您的FPC(nginx、apache等)中缓存的秒数
最大年龄:此页面允许在浏览器中缓存的秒数

如果您有扩展PageController的其他控制器,例如从API获取更多动态数据,您可以通过重写updateCacheControl方法在该控制器中重写CacheControl头部。

public function updateCacheControl(): void
{
    HTTPCacheControlMiddleware::singleton()
        ->enableCache()
        ->setSharedMaxAge(600)
        ->setMaxAge(0);
}

在此,我们将最大年龄设置为0,以防止它被浏览器缓存,并且共享最大年龄相对较低。这样,缓存只能过时10分钟。

会话和CSRF令牌

在会话上下文中生成页面时,例如登录用户或CSRF令牌,不要缓存页面。幸运的是,有两样东西可以保护我们免犯这个错误。

  1. SilverStripe会在会话活动时覆盖我们的缓存控制头部。
  2. nginx配置在发现PHPSESSID时触发绕过。

默认配置

WeDevelop\FPCPurge\FPCPurgeConfig:
  enabled: false
  endpoints: []

许可证

查看许可证

维护者

开发和贡献

欢迎pull requests。对于重大更改,请首先打开一个问题以讨论您想更改的内容。有关更多信息,请参阅我们的贡献文档。

开始使用

我们建议使用 DockerDocker Compose 进行开发。
我们还包含了一个 Makefile 以简化一些命令。

我们的开发容器包含一些内置工具,例如 PHPCSFixer

启动开发容器

使用 make build 构建Docker容器,然后分离运行。
如果您只想启动容器,可以直接输入 make up

您可以使用 make sh 通过SSH进入容器。

所有make命令

您可以通过运行 make help 来获取所有可用 make 命令的列表。