【问题标题】:cache pictures from remote server with varnish使用清漆缓存来自远程服务器的图片
【发布时间】:2017-04-26 16:03:48
【问题描述】:

我正在创建包含大量图片的简单页面。所有图片都托管在远程提供商上(托管在对象存储上,我只有所有图片的链接)为了加快 www 我想使用清漆来缓存这些图片,但我有问题:
所有图片均使用 https 提供,因此我使用 haproxy 终止 ssl 并将下一个流量转到 varnish,但是如何映射最终用户应该可见的 varnish 网站地址,例如 https://www.website.com/picture.jpg 以及图片托管的远程地址( https://www.remotehostedpictures.com/picture.jpg) 。因此,最终结果用户必须看到第一个链接,远程地址 remotehostedpictures.com/picture.jpg 不可见。

【问题讨论】:

  • 首先,请不要使用别人的域名作为占位符。 example.comexample.netexample.org 专门用于此目的。第二,你遇到的问题是什么?我问,因为您所描述的期望行为是 HAProxy 和 Varnish 的工作方式,无论如何。这是预期的行为。如果您有 example.com → HAProxy → Varnish → example.net(内容源),则链接和地址将为 example.com。
  • 我知道如何使用 haproxy(代理通行证),但我不知道如何使用清漆。也许有人可以在清漆中分享一些简单的配置示例?

标签: varnish haproxy varnish-vcl


【解决方案1】:

在您的清漆vcl_recv 中,您应该更改您的请求host 标头,然后您必须将remotehostedpictures.com 声明为您的后端。

最后,你应该有这样的东西(代码未测试)

sub vcl_recv {
  if (req.url ~ "\.jpg") {
    set req.http.host = "www.remotehostedpictures.com";
    set req.backend_hint = remote_host;
  }
}

backend remote_host {
  .host = "www.remotehostedpictures.com";
  .port = "80";
}

顺便提一下,注意backend.host 中的 dns。如果 dns 解析为多个 IP,varnish 将使用第一个。 dns 解析是在 vcl 编译时完成的,所以如果 dns 发生变化,你应该重新加载你的 vcl。

【讨论】:

  • 谢谢,几乎可以工作,但是当我输入 www.website.com/directory/picture.jpg 时,我看到 404 not found。 remote_host 中的文件路径看起来与 www.remotehostedpictures.com/directory/picture.jpg 相同。所以不会将路径映射到文件。
  • 如果您在请求图像时运行 varnishlog。输出是什么?
【解决方案2】:

我认为在 Varnish 中存储图像不是上帝的想法,因为 Varnish 会很快填满整个内存(如果你有很多图像),而不是当 Varnish 填满时它会清除整个缓存,想象一下服务器上发生了什么整个缓存被清除,您的页面上有流量。

前段时间我在 Varnish 中制作了这样的缓存,在直播几个小时后,我不得不禁用缓存图像,因为要清除(对我来说最重要的是缓存页面内容)。

在这种情况下,最好的解决方案是 CDN。您可以使用 Cloudflare 等外部服务,或在 Nginx 上制作简单的 CDN(仅提供带有过期标头的静态文件)。

希望对你有帮助:)

【讨论】:

    猜你喜欢
    • 2018-08-13
    • 1970-01-01
    • 2015-02-28
    • 2013-10-06
    • 2014-10-27
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多