Debian 10下Varnish与Apache SSL配置问题求助
先帮你拆解两个问题的根源,一步步来修复:
问题1:HTTP协议返回默认目录,而非虚拟主机配置的/var/www/example
这个问题大概率是Apache虚拟主机匹配逻辑或Varnish请求头传递导致的,按下面步骤排查:
确保Apache优先匹配你的example.com虚拟主机
Apache会按配置文件加载顺序匹配虚拟主机,如果000-default.conf还在监听127.0.0.1:8080,它会被优先匹配。你可以:- 把example.com的虚拟主机配置文件重命名为
000-example.conf,让它在000-default.conf之前加载; - 或者直接禁用默认虚拟主机:
a2dissite 000-default.conf,执行后重启Apache:systemctl restart apache2。
- 把example.com的虚拟主机配置文件重命名为
确认Varnish正确传递Host请求头
默认情况下Varnish会传递Host头,但保险起见,可以在/etc/varnish/default.vcl里显式添加规则,确保后端Apache能拿到正确的Host来匹配虚拟主机:sub vcl_backend_fetch { set bereq.http.Host = req.http.Host; }修改后重启Varnish:
systemctl restart varnish。调整Apache虚拟主机的绑定范围
你当前的虚拟主机是<VirtualHost 127.0.0.1:8080>,可以改成<VirtualHost *:8080>,这样不管请求从哪个IP过来,只要是8080端口都能匹配到这个虚拟主机,避免IP绑定导致的匹配失败。
问题2:HTTPS协议未启用Varnish
你的预期链路是HTTPS → Apache(SSL终止)→ Varnish(80)→ Apache(8080),但当前配置有几个关键细节没到位:
启用X-Forwarded-Proto传递HTTPS标识
你注释掉了两个关键配置,需要打开它们,这样后端Apache能识别请求原本是HTTPS的,同时Varnish也能正确处理缓存逻辑:- 在HTTPS的
<VirtualHost *:443>里取消注释:RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME} - 在HTTP的
<VirtualHost 127.0.0.1:8080>里取消注释:SetEnvIf X-Forwarded-Proto https HTTPS=on
- 在HTTPS的
确认Apache 443端口的监听配置
检查ports.conf里是否有Listen 443(默认Apache会包含这条配置,如果没有的话手动加上),确保Apache能正常接收HTTPS请求。验证ProxyPass的正确性
你当前的443虚拟主机配置里ProxyPass / http://127.0.0.1:80/是正确的,指向Varnish的80端口,且已经开启ProxyPreserveHost On,这能保证Host头传递给Varnish,进而让后端Apache匹配到正确的虚拟主机。重启服务生效
修改配置后,依次重启Apache和Varnish:systemctl restart apache2 systemctl restart varnish
最后你可以用curl -I http://example.com和curl -I https://example.com测试,检查响应头里是否有X-Varnish字段——有这个字段说明请求经过了Varnish;同时访问页面确认内容是否正确指向/var/www/example的文件。
内容的提问来源于stack exchange,提问作者luca carboni

