我想为下载的文件设置一个缓存服务器。一个问题是我希望它能与 HTTPS 配合使用(包括从 HTTP 重定向到 HTTPS)。我理解这通常会带来的问题,但对我来说,不同之处在于它确实不是需要做透明代理。例如:
# Usually you'd do something like this:
curl --proxy myserver:8080 https://example.com/file.tar.gz
# But it's fine for our scripts to call something like this instead:
curl myserver:8080 --data-raw https://example.com/file.tar.gz
请注意,此处客户端专门将其请求定向到 myserver,因此它不会尝试验证响应是否来自example.com
。 (但我的服务器应该这样做!)
另一个变化是,这只适用于永不改变的文件(URL 包括版本号),因此通常的缓存新鲜度不适用。如果文件(或重定向响应)被缓存,则应返回它而不检查互联网。缓存的副本应在被删除后的某个固定时间段内删除最后的请求,无论我们何时首次下载。
问题:我曾希望使用像 Squid 这样的 HTTP 代理,但我不知道如何配置它来做这样的事情。或者,编写一些代码是一种选择,但我更愿意避免这样做。我该怎么做才能建立这样的缓存?
背景:这主要用于我们在源代码中使用的第三方库,在构建 Docker 镜像时以及开发人员在容器外部构建时。有时我们目前将第三方代码签入我们自己的存储库,但这并不理想。我敢肯定我们不是唯一面临这个问题的人,但我在网上找不到好的解决方案……也许我只是错过了正确的搜索词。
答案1
这是可能的,并且需要三项配置更改:
您应该知道,配置 SSL bump 后,Squid 将为其配置的每个要 bump 的域创建并颁发自签名证书。您的客户端必须接受此证书才能进行传输。cURL 可以使用 --cacert 参数(允许它接受公钥出现在列表中的 CA)或 -k 参数(完全禁用 SSL 检查)来执行此操作。
此外,您上面发布的两个 cURL 命令的工作方式存在细微(但重要)的差异。第一个命令将导致 cURL 打开连接,就像它在与代理对话一样,即打开端口、发出“CONNECT”语句,然后等待 SSL 握手,然后开始使用 HTTP。第二个调用将导致 cURL 打开连接并立即尝试 SSL 握手。在这种情况下,主机(运行 Squid)必须确定要连接到哪个主机,通常是从握手的 SNI 部分。Squid 可以做到这一点,但您需要使用https_port 透明语句。如果可以的话,我建议通过第一种方法进行操作,因为它在 Squid 端需要的配置较少,并且在客户端明确涉及代理。