首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CDN支持/配置服务“陈旧”内容,背景刷新

CDN支持/配置服务“陈旧”内容,背景刷新
EN

Stack Overflow用户
提问于 2020-01-19 18:43:55
回答 2查看 1.1K关注 0票数 8

目标

始终提供来自CDN边缘缓存的内容,而不管内容有多陈旧。可能的话,在后台刷新它。

问题

我有一个NextJS应用程序,它呈现一些反应组件服务器端,并将它们交付给客户端。对于这个讨论,让我们考虑一下我的主页,它是未经认证的,每个人都是一样的。

我想要的是服务器呈现的主页被缓存在CDN的边缘节点上,并尽可能频繁地或始终地从该缓存中为终端客户端服务。

据我所读,正确支持与缓存相关的头部设置(如Surrogate-ControlCache-Control: stale-while-revalidate )的CDN(比如Fastly)应该能够做到这一点,但实际上,我并没有看到它像我所期望的那样起作用。我看到的是:

  • 请求丢失缓存,并在先前的请求应该使其温暖时返回原点。
  • 请求是从缓存提供的,但在源发布新内容时永远不会更新。

示例

考虑以下时间线:

T0 - Visitor1 request www.mysite.com - CDN缓存是完全冷的,所以请求必须返回原点(AWS )并重新计算主页。返回带有头Surrogate-Control: max-age=100Cache-Control: public, no-store, must-revalidate的响应。然后Visitor1被送达主页,但他们不得不等待5秒!恶心!可能再也没有其他访客要经历同样的命运了。

T50 - Visitor2 requests www.mysite.com - CDN缓存包含我的文档并立即返回给访问者。他们只需要等40毫秒!太棒了。在背景中,CDN从我的原点重取主页的最新版本。结果一切都没变。

T80 - www.mysite.com向主页发布新内容,使任何缓存的内容都真正过时。V2的网站现在是现场直播!

T110 -- Visitor1返回www.mysite.com --从CDN的角度来看,从访问者2的请求到现在才60年代,这意味着Visitor2发起的背景刷新应该会导致缓存中的主页(尽管是V1,而不是主页的V2 )的陈旧副本。Visitor1是从缓存中为60年代陈腐的V1主页服务的。这次Visitor1的体验要好得多!此请求启动CDN缓存中陈旧内容的背景刷新,而这次的原点返回网站的V2 (30年代前发布的)。

T160 - Visitor3 refresh www.mysite.com --尽管是一个新的访问者,但CDN缓存现在已经从visitor 1最新的背景刷新触发器中获得了新生。向Visitor3提供缓存的V2主页。

..。

只要每100亿次至少有1名访问者访问我的网站(因为max-age=100),任何访问者都不会经历往返我的原点的等待时间。

问题

1.这是现代CDN的合理要求吗?我无法想象这比回到原点(没有CDN缓存)要费钱,但是我很难从任何CDN提供者那里找到关于正确方法的文档。我现在正在快速地工作,但我也愿意尝试其他的(我首先尝试了Cloudflare,但读到他们不支持stale-while-revalidate)

2.什么是正确的头来做这件事?(假设CDN提供程序支持它们)我在Fastly和Cloudflare中使用了Surrogate-Control: maxage=Cache-Control: public, s-maxage=, stale-while-revalidate,但是似乎没有一个能正确地做到这一点(在最大时限内的请求在缓存未命中之前不会恢复原点的更改)。

如果不支持3.,是否有API调用允许我将内容更新推送到CDN的缓存层,有效地说:“嘿,我刚刚为这个缓存键发布了新内容。就在这里!”

我可以使用Cloudflare工作人员来使用KV存储来实现这种缓存,但我想在实现一个似乎很常见的问题的代码解决方案之前,我应该做更多的研究。

提前感谢!

EN

回答 2

Stack Overflow用户

发布于 2021-02-16 13:23:50

最近我已经部署了一个类似的应用程序。最后,我在Next.js服务器前运行了一个定制的nginx实例。

  • 忽略来自上游服务器的缓存头。
    • 我想缓存标记和JSON,但我不想向客户端发送Cache-Control头。您可以调整此配置以使用来自Next.js的Next.js中的值,如果MIME类型为text/htmlapplication/json,则可以在响应客户机之前删除该标头。

  • 考虑所有答复有效10分钟。
  • 30天后移除缓存的响应。
  • 使用高达800 MB的缓存。
  • 在提供过时的响应后,尝试从上游服务器获取新的响应。

这并不完美,但它处理的是重要的陈腐而又重新验证的行为。如果您希望获得全局传播的好处,也可以在此基础上运行CDN。

警告:还没有进行广泛的测试。我不相信错误页面和响应代码周围的所有行为都是正确的。

代码语言:javascript
复制
# Available in NGINX Plus
# map $request_method $request_method_is_purge {
#   PURGE   1;
#   default 0;
# }

proxy_cache_path
  /nginx/cache
  inactive=30d
  max_size=800m
  keys_zone=cache_zone:10m;

server {
  listen 80 default_server;
  listen [::]:80 default_server;

  # Basic
  root /nginx;
  index index.html;
  try_files $uri $uri/ =404;

  access_log off;
  log_not_found off;

  # Redirect server error pages to the static page /error.html
  error_page 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 500 501 502 503 504 505 /error.html;

  # Catch error page route to prevent it being proxied.
  location /error.html {}

  location / {
    # Let the backend server know the frontend hostname, client IP, and
    # client–edge protocol.
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
    # This header is a standardised replacement for the above two. This line
    # naively ignores any `Forwarded` header passed from the client (which could
    # be another proxy), and instead creates a new value equivalent to the two
    # above.
    proxy_set_header Forwarded "for=$remote_addr;proto=$scheme";

    # Use HTTP 1.1, as 1.0 is default
    proxy_http_version 1.1;

    # Available in NGINX Plus
    # proxy_cache_purge $request_method_is_purge;

    # Enable stale-while-revalidate and stale-if-error caching
    proxy_cache_background_update on;
    proxy_cache cache_zone;
    proxy_cache_lock on;
    proxy_cache_lock_age 30s;
    proxy_cache_lock_timeout 30s;

    proxy_cache_use_stale
      error
      timeout
      invalid_header
      updating
      http_500
      http_502
      http_503
      http_504;

    proxy_ignore_headers X-Accel-Expires Expires Cache-Control Vary;
    proxy_cache_valid 10m;

    # Prevent 502 error
    proxy_buffers 8 32k;
    proxy_buffer_size 64k;
    proxy_read_timeout 3600;

    proxy_pass "https://example.com";
  }
}
票数 3
EN

Stack Overflow用户

发布于 2020-01-23 12:43:22

关于问题3。

您可以为每一个文件使用新的名称来防止不需要的缓存,也可以像您建议的那样使用API cloudFlare来释放缓存。

可能,你可以在这里找到更多的信息

https://api.cloudflare.com/#zone-purge-files-by-cache-tags-or-host

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59813228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档