我正在实现一种 URL 缩短服务。实际情况是,我有一些后端应用服务器,它接收请求,进行一些计算,并将 301 重定向 URL 返回上游到 nginx 前端:
request ---> nginx ----> app_server
我想要做的是缓存针对同一请求返回的 301 url(带有“短代码”的特定 url)。
nginx 会自动执行此缓存吗?还是我应该在 nginx 和 app_server 之间放入类似 varnish 的东西?我可以轻松地将其缓存在 memcache 中,但这需要访问 app_server,我确信在第一个请求之后就可以省去它。
谢谢。
答案1
您可以配置 Nginx 来执行此操作。
示例:缓存重定向(301 或 302)最多 60 分钟:
proxy_cache_valid 301 302 60m;
答案2
我也在研究这个问题,据我所知,Varnish 的重定向非常间接。Nginx 中的代理缓存也是如此。所以据我所知,我们需要 Varnish 进行缓存和上游,而 Nginx 仅用于重定向?
但这可能并不特定于您的应用程序。
答案3
Varnish 会缓存符合其逻辑的任何 HTTP 响应,重定向只是可以轻松缓存的 HTTP 301 或 302 响应。当然,您可以通过 Varnish 的 VCL 语言覆盖默认逻辑。
我们的 Varnish 服务器会自动缓存重定向。您可以通过在后端响应中设置“Cache-Control: max-age”(或 Expires)标头来控制缓存 TTL。如果您未指定 TTL,我相信默认值为 120 秒。确保您没有在域上设置任何 cookie,或者在它们进入 Varnish 时丢弃它们,否则请求将通过 Varnish。我们简单地为重定向创建了一个单独的子域,并通过 VCL 明确丢弃任何传入和传出的 cookie。
对于其他用例,需要注意的是:您可以将重定向完全卸载到 Varnish,这样它们就永远不会到达后端。以下是一些示例代码:https://www.varnish-cache.org/trac/wiki/VCLExampleRedirectInVCL