目前,我们有一个需要回拨的软件解决方案,例如,为了自动更新,它需要联系 Azure 容器注册表。我们只能与 建立传出连接example.com
,所有其他传出连接都被客户的防火墙阻止。因此,操作软件所需的所有连接都必须通过我们的反向代理。
因此,我们创建了一个反向代理,例如,example.com/acr/*
它将连接代理到example.azurecr.io
。一切正常。我遇到的问题是如何处理答案中返回的 URL?
例如,通过请求 docker 镜像,example.com/arc/something
我会收到这样的响应,告诉 docker docker 容器 blob 存储在哪里。
HTTP/1.1 307 Temporary Redirect
Location: https://weumanaged131.blob.core.windows.net/...e5698526-1gpll71q59//docker/registry/v2/blobs/sha256/a8/a87a....
显然我无法连接到这个 URL,因为我被限制了example.com
。
问题:是否可以使用如下 URL 重写并缓存响应 URL:(example.com/acr/<UUID>
使用随机 UUID)?通过反向代理调用此 URL 时,反向代理会将 URL 代理到原始位置 URL,如上所示。如果有其他解决方案可以通过我的反向代理重定向响应 URL,我很乐意听到。
使用 nginx 是否会出现类似的情况?如果其他解决方案可以解决此问题,我不会局限于 nginx。
谢谢你,菲利普
编辑:为了清楚起见,软件解决方案安装在客户网络内的一台机器上。客户网络只允许从这www.example.com
台特定机器发出连接。反向代理安装在我们网络的服务器上(在本例中是我们的 Azure 云网络)。因此,我们无法从这台机器调用其他域。
答案1
我不确定我是否理解了全部内容,但是如果您有代理,为什么不让所有东西都通过代理?为什么对 weumanaged131.blob.core.windows.net 的调用不通过代理?
仅供测试,在 Linux 环境中,可以通过 http_proxy 和 https_proxy 变量为任何程序/服务设置代理。可能在服务脚本的开头添加它们就可以了。例如,export http_proxy=http://proxy:port 如果需要用户身份验证:export http_proxy=http://username:password@proxy:port 对于 docker,还有更多技巧,或者可能需要大写字母变量:HTTP_PROXY 和 HTTPS_PROXY。
答案2
您需要使用像 Squid 这样的正向代理,而不是像 nginx 这样的反向代理。
在服务器上安装 Squid www.example.com
,并配置您的软件解决方案以使用正向代理www.example.com
。