我在服务器上安装了 varnish 和 apache。这是一个 SSL 站点。因此,我使用 apache 和 varnish 进行 SSL 终止。问题是,当我使用 curl -I 命令时,标头显示 age 总是大于 0。当我使用以下代码测试我的站点时,情况也一样https://isvarnishworking.uk但是,当我从浏览器查看标题时,它总是显示年龄为 0。我尝试了所有方法。我甚至尝试过一个仅使用 http 的网站。在 Web 浏览器中,年龄仍然显示为 0
我使用的指南:https://bash-prompt.net/guides/apache-varnish/
这些是标题
接受范围:字节 访问控制允许来源:* 年龄:0 内容编码:gzip 内容长度:7128 内容类型:text/html;字符集=UTF-8 日期:2019 年 8 月 15 日星期四 05:37:53 GMT 最后修改时间:2019 年 8 月 15 日星期四 04:25:12 GMT 服务器:Apache/2.4.29(Ubuntu) 状态:200 变化:X-Forwarded-Proto、Accept-Encoding 通过:1.1 清漆(Varnish/5.2) x-清漆:65690
编辑:这是我使用 curl -v 127.0.0.1:8080 时获得的标题
重建 URL 为:127.0.0.1:8080/ 尝试 127.0.0.1... TCP_NODELAY 设置 连接到 127.0.0.1 (127.0.0.1) 端口 8080 (#0) 获取/HTTP/1.1 主机:127.0.0.1:8080 用户代理:curl/7.58.0 接受: */* HTTP/1.1 200 正常 日期:2019 年 8 月 15 日星期四 09:58:23 GMT 服务器:Apache/2.4.29(Ubuntu) 链接:;rel="https://api.w.org/", https://arcadesite.io/>; rel=shortlink 变化:接受编码 访问控制允许来源:* 内容类型:text/html;字符集=UTF-8 X-清漆:491654 524537 年龄:62岁 通过:1.1 清漆(Varnish/5.2) 接受范围:字节 内容长度:28467 连接:保持连接
答案1
为什么您在浏览器中无法获得相同的结果,而curl
原因大多总是一个——cookies。
Varnish 会为你做一些预防措施,并在存在 cookie 的情况下绕过缓存(无论是在由后端设置或当你通过浏览器发送)。
就您而言,很可能是您的浏览器发送了一个Cookie:
请求(可以在 Chrome devtools 的“网络”选项卡中轻松验证)。
为了让 Varnish 发挥作用,典型的解决方案是将其配置为在没有必要的 cookie 存在时删除所有 cookie,例如vcl_recv
:
if (req.http.cookie !~ "your-app-cookie-name") {
unset req.http.cookie;
}
这将仅在发送 cookie 时才传递 cookie your-app-cookie-name
。对于其他情况(例如,用户未登录,JavaScript 跟踪脚本可能需要 cookie,因此对于 Varnish 或后端的正常工作来说都不是必需的)。
如果您的应用程序为每个页面发送“必需”的 cookie(经常引用),您将需要调整您的应用程序(最佳路线,例如PHPSESSID
仅在登录页面发送 cookie)和/或调整 Varnish 配置以在特定页面上忽略它以增加缓存命中率。