![如何强制流图像对象由 Squid 正向代理缓存](https://linux22.com/image/763241/%E5%A6%82%E4%BD%95%E5%BC%BA%E5%88%B6%E6%B5%81%E5%9B%BE%E5%83%8F%E5%AF%B9%E8%B1%A1%E7%94%B1%20Squid%20%E6%AD%A3%E5%90%91%E4%BB%A3%E7%90%86%E7%BC%93%E5%AD%98.png)
我正在访问存储在 AWS S3 或 GCS 等存储器上的图像。
我正在使用名为 Got 的节点库来获取图像,然后将响应流式传输到图像处理器中。
我正在使用 Got 和隧道代理,以便它使用我的 Squid 正向代理。我将通过 Squid 进行操作,因为我想缓存图像,这样我就不必总是一路前往 S3 来获取图像。
但是,我的图片没有被缓存。每次通过 Squid 获取图片时都会出现以下日志消息:
1612789358.530 3100 172.22.0.3 TCP_TUNNEL/200 2296639 CONNECT storage.googleapis.com:80 - HIER_DIRECT/172.217.170.80 -
我添加了一个refresh_pattern
指令来强制缓存。
refresh_pattern . 0 100% 525600 override-expire override-lastmod ignore-reload ignore-no-cache ignore-no-store reload-into-ims ignore-must-revalidate
这应该可以将所有内容缓存一年。
相关的 javascript 是这个(以防万一)
let stream = await got.stream(sourceUrl, {
agent: {
http: tunnel.httpOverHttp({
proxy: {
host: "localhost",
port: "3128",
},
}),
},
});
我没有使用过 Squid - 我使用的是 4.x 版本
是不是因为我正在从 S3 流式传输响应,所以一旦整个图像响应流式传输完毕,Squid 就无法缓存响应?或者我的 squid.conf 文件中可能存在所需的特定缓存指令。
答案1
您正在使用 Squid 代理的 HTTP CONNECT 方法,它完全绕过缓存以及 Squid 所做的几乎所有其他事情。
你应该将它作为普通的 HTTP 代理进行连接,快速看一下got 在 npmjs.com 的页面表示应该用陣陣代理包裹。