我无法让缓存系统与 Joomla 3.x 配合使用。由于服务器应强制实施 HTTPS/TLS 连接,因此这尤其成问题。
Joomla 系统在 Debian Wheezy 上的 Apache2 上运行。
我尝试设置 Varnish,但发现 Varnish 无法终止 TLS 流量,因此我需要将其路由回 Apache 或 HAProxy。但如果我这样做,Joomla 会对请求标头感到困惑,因为请求在经过所有这些层时会被重写,Joomla 要么陷入重定向循环,要么回复服务器错误。
有没有一种干净的方法可以在 Joomla 前面放置缓存甚至负载平衡器,而不会产生由另一台服务器上发生的 SSL 终止引起的重定向问题?
答案1
正如您所提到的。虽然 Varnish 不处理 SSL,但可以使用传递给 Varnish 的 SSL 终止代理。SSL 终止代理可以添加或删除标头并更改端口,因此您应该能够创建避免重定向循环的流程。
流行的 SSL 终止代理包括 Pound、Stunel、Nginx 和 HAProxy。您需要的功能范围应该决定您使用哪个。Nginx 和 HAProxy 的最新版本允许您使用 SPDY,经过快速搜索后,我会说,目前有比其他平衡器更多的关于使用 Nginx 和 Varnish 的最新指南。
对于 Nginx 作为 SSL 终止代理,通常建议如下:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
location / {
proxy_pass http://127.0.0.1:80;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Port 443;
proxy_set_header Host $host;
}
}
这将从端口 443 获取 SSL,解密并将其传递到本地主机端口 80。它添加了标X-Forwarded-Proto https
头,表明这是(曾经是?)SSL 流量。该配置还添加了其他有助于读取日志等的标头。
当 Varnish 在 localhost:80 上监听时,它将像正常流量一样处理请求,并将其传递给 Apache 和 Joomla。
在 Apache 中您将需要SetEnvIfNoCase X-Forwarded-Proto https HTTPS=on
。
所有这些加在一起意味着 Joomla 知道发生了什么,并采取适当的行动。