跨服务器部署Magento 2与Varnish缓存后缓存失效问题排查
让我们一步步拆解并解决你遇到的两个核心问题:访问Varnish IP时重定向到Magento源站,以及缓存未实际生效。
一、先解决重定向问题(核心根源)
当你访问Varnish服务器IP(129.89.188.245)时被重定向到Magento源站IP,这几乎肯定是Magento的Base URL配置不匹配导致的:
修改Magento后台Base URL配置
登录Magento后台,依次进入:Stores > Configuration > General > Web > Base URLs- 将Base URL设置为
http://129.89.188.245/(Varnish服务器的IP) - 如果启用了HTTPS,同步修改
Base URLs (Secure)里的地址 - 保存配置后,清理Magento缓存:
bin/magento cache:flush
- 将Base URL设置为
验证Host头传递
你的VCL配置中没有修改Host头,这是正确的——当用户访问Varnish IP时,Host头会被传递给Magento。只要Magento的Base URL和这个Host值匹配,就不会触发重定向。
二、解决缓存未实际生效的问题
你提到Varnish日志显示页面已缓存,但实际未从缓存提供内容,结合重定向问题,解决完Base URL后,再做以下验证:
确认流量确实经过Varnish
不要直接访问Magento源站IP(129.89.188.244)——这个请求完全绕开了Varnish,自然不会被缓存。所有用户请求必须指向Varnish服务器IP,才能被Varnish处理和缓存。建议给Magento服务器的80端口加防火墙限制,只允许Varnish服务器访问:
iptables -A INPUT -p tcp --dport 80 -s 129.89.188.245 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -j DROP验证缓存命中状态
访问Varnish IP后,查看响应头(用浏览器开发者工具的Network面板,或者curl -I http://129.89.188.245):- 如果看到
X-Magento-Cache-Debug: HIT,说明缓存命中 - 如果是
MISS,说明第一次请求未命中,刷新页面后应该变成HIT
也可以用Varnish日志实时监控:
varnishlog -g request -q "ReqUrl ~ '/'"查看日志中的
Hit标记,确认缓存是否被正确读取。- 如果看到
检查VCL缓存规则的细节
你的VCL配置大部分是正确的,但有几个点需要确认:- 静态文件缓存:当前VCL中对
/pub/media或/pub/static的请求默认是return (pass),所以静态文件不会被缓存。如果需要缓存静态资源,可以注释掉这行,取消下面3行的注释:#return (pass); #unset req.http.Https; #unset req.http.X-Forwarded-Proto; #unset req.http.Cookie; - 健康检查:VCL中配置了后端健康检查
/pub/health_check.php,确保这个文件在Magento服务器上存在且返回200:
如果健康检查失败,Varnish会认为后端不健康,可能直接使用grace缓存或pass请求。curl http://129.89.188.244/pub/health_check.php
- 静态文件缓存:当前VCL中对
确认Magento全页面缓存配置
进入Magento后台:Stores > Configuration > Advanced > System > Full Page Cache- 确保Caching Application选择
Varnish Cache - 点击
Export Varnish Configuration,对比导出的VCL和你当前的配置,确保关键规则一致(比如Purge规则、ESI配置) - 保存配置后重启Varnish:
systemctl restart varnish
- 确保Caching Application选择
三、额外验证点
- 检查Varnish的内存分配:你的配置中
-s malloc,256m是合理的,但如果站点流量大,可以适当增加。 - 测试Purge功能:用Varnish服务器IP发送Purge请求,确认缓存能被正确清理:
应该返回curl -X PURGE -H "X-Magento-Tags-Pattern: .*" http://129.89.188.245200 Purged。
内容的提问来源于stack exchange,提问作者Dhaval Bhavsar

