【问题标题】:Varnish with Apache2 using mod_ssl and mod_proxy causing issues使用 Apache2 清漆使用 mod_ssl 和 mod_proxy 导致问题
【发布时间】:2022-01-28 15:56:10
【问题描述】:

我已经使用 Apache2 安装了 Varnish 并使用 HTTP 代理 apache 模块进行了设置,并使用标头通过 HTTP 获取数据并使用反向代理将其发送到 HTTPS。

        ProxyPreserveHost On
        ProxyPass / http://127.0.0.1:80/
        ProxyPassReverse / http://127.0.0.1:80/
        RequestHeader set X-Forwarded-Port “443”
        RequestHeader set X-Forwarded-Proto “https

但我面临此设置的问题是浏览器错误 Content is loading from HTTP over HTTPS 已被阻止。

混合内容:“”处的页面是通过 HTTPS 加载的,但是 请求了一个不安全的样式表''。该请求已 阻塞;内容必须通过 HTTPS 提供。

请帮助了解我错在哪里以及如何使这项工作发挥作用?

在此先感谢您。

【问题讨论】:

    标签: apache2 reverse-proxy varnish mod-proxy mixed-content


    【解决方案1】:

    关于设置和配置的上下文并不多,但根据您提供的信息,我假设您使用 Apache 首先终止 TLS 连接,然后将该流量转发到 Varnish。

    我还假设 Apache 也被配置为 Varnish 中的后端,在 8080 等端口上侦听,而 Varnish 在 80 上,HTTPS Apache vhost 在 443 上。

    改变标题

    您的设置中可能缺少的一件事是基于 X-Forwarded-Proto 标头的缓存变体。

    我建议您使用以下配置设置缓存变体:

    Header append Vary: X-Forwarded-Proto
    

    这使用mod_headers 并且可以在您的.htaccess 文件或您的虚拟主机配置中设置。

    它应该允许 Varnish 了解基于 Vary: X-Forwarded-Proto 标头的变化,并存储一个用于 HTTP 的版本和一个用于 HTTPS 的版本。

    这将防止在请求 HTTPS 内容时存储 HTTP 内容,反之亦然。

    模拟问题的好方法

    如果您想确保问题的行为符合我的预期,请使用以下步骤进行测试:

    1. 通过sudo varnishadm ban obj.status "!=" 0清除缓存
    2. 运行varnishlog -g request -q "ReqUrl eq '/'" 过滤日志。主页
    3. 调用首页的HTTP版本,并确保其存储在缓存中
    4. 捕获此事务的日志输出并将其存储在某处
    5. 通过 HTTPS 调用同一页面并检查是否出现混合内容错误
    6. 捕获此事务的日志输出并将其存储在某处

    然后通过Vary: X-Forwarded-Proto 标头修复问题并再次尝试测试用例。

    如果出现问题,只需将 2 个日志事务添加到您的问题中(1 个未命中,1 个命中),我会为您检查它

    【讨论】:

    • 您对 Varnish 的 80、Apache 的 8080 和 SSL 的 443 端口是正确的,但是模拟和测试不起作用。仍然在浏览器上收到混合内容的错误。
    • 我更新了我的答案并包含了一个您应该在测试时运行的日志记录命令。请将日志输出附加到您的问题中。当缓存插入发生(未命中)时,我需要一个日志事务,当从包含混合 URL 方案的缓存中接收到对象时,我需要一个事务。
    猜你喜欢
    • 2022-12-20
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 2011-07-05
    • 2013-08-26
    • 1970-01-01
    相关资源
    最近更新 更多