我正在尝试为 Magento2 配置清漆。
问题:我无法配置 PURGE varnish 缓存。
这是我的构建:https://github.com/zhartaunik/magento2-docker
清漆设置:https://github.com/zhartaunik/magento2-docker/tree/master/docker/varnish
我正在使用 docker-compose。Varnish FROM varnish:6.2 vcl 4.0;
我正在尝试以安全的方式配置 purge 命令。我不确定如何配置 varnish 的最佳实践是什么,但 Magento 建议如下:
acl purge {
"nginx";
}
并有如下验证:
sub vcl_recv {
if (req.method == "PURGE") {
if (!client.ip ~ purge) {
return (synth(405, "Purging not allowed for " + client.ip));
}
就我而言,当我尝试从控制台/管理 UI 中清除清漆时 - 我总是面临以下错误:
<!DOCTYPE html>
<html>
<head>
<title>405 Purging not allowed for 192.168.128.7</title>
</head>
<body>
<h1>Error 405 Purging not allowed for 192.168.128.7</h1>
<p>Purging not allowed for 192.168.128.7</p>
<h3>Guru Meditation:</h3>
<p>XID: 32770</p>
<hr>
<p>Varnish cache server</p>
</body>
</html>
在docker重启之后,这个IP地址就改变了。
当我尝试使用容器名称配置 acl purge 时,我仍然遇到相同的错误。但是,将容器名称添加到“白名单”并运行
curl-k-X清除https://magento2.docker
通过本次验证。
配置部分的最佳和最安全的方法是什么acl purge
?
答案1
如果你使用Nginx身为你的TLS 终止器,client.ip
价值有风险总是NginxIP。这是可以预见的,但不一定安全。
你应该做的是确保Nginx&漆使用相互连接PROXY 协议. 这将确保原始客户端 IP 被传输并存储在 中client.ip
。
在 Varnish 上设置 PROXY 协议
为了使PROXY 协议在 Varnish 中使用您的 Docker 设置在,您需要修改 的值${VARNISH_LISTEN}
。
你可以这样做:
ENV VARNISH_LISTEN :6081,PROXY
此时,Varnish 不再接受传统的HTTP 连接。
在 Nginx 中设置 PROXY 协议
根据文档,Nginx 支持proxy_protocol
自版本起1.9.2
。这似乎与您在 Dockerfile 中使用的版本兼容。
只需将以下行添加到您的/docker/nginx/etc/vhost.conf
文件即可:
proxy_protocol on;
使用 PROXY 协议的附加值是,
X-Forwarded-For
无论 Varnish 前面有多少个代理节点,Varnish 设置的值将始终包含原始客户端的 IP 地址。
后备方案
如果PROXY 协议在 Nginx 中不是一个选项,我可以给你 3 个备选方案:
- 使用 Hitch 作为你的 TLS 代理:它支持PROXY 协议,它非常轻量,由 Varnish Software 开发
- 使用 HAProxy 作为你的 TLS 代理:他们发明了PROXY 协议,它比 Hitch 重一点
- 不要使用PROXY 协议并匹配
X-Real-IP
您的 ACL 中的值。此标头由 Nginx 设置,并根据 Nginx 包含客户端 IP。