一个 Ubuntu 9.04 盒子,在 8080 上运行 Apache,在 80 上运行 Varnish。
最近设置了 Munin,不知道为什么 Apache 图表是空的。从日志中看到 Munin 正在访问/server-status?auto
并403 Forbidden
返回。所以我编辑/etc/apache2/monds-enabled/status.conf
以允许从 访问127.0.0.1
。但这样做实际上会/server-status
公开,因为通过 Varnish 发出的请求似乎也来自127.0.0.1
。
所以问题是,我该如何配置mod_status
才能仅由 Varnish 访问munin-node
而不是由 Varnish 访问?
答案1
我解决这个问题的方法是确保即使请求通过 varnish 缓存,Apache 也能获取实际访问者的 IP。我使用 Apache mod_rpaf 来实现这一点(请参阅http://giantdorks.org/alain/easily-get-the-correct-client-ip-with-mod_rpaf/)。
另外,为了防止客户端的请求也经过设置 X-Forwarded-For 标头的某些代理,我在我的 varnish 缓存实例(在 vcl_recv 中)中重置了它:
remove req.http.X-Forwarded-For;
set req.http.X-Forwarded-For = client.ip;
然后还告诉 varnish 永远不要缓存 /server-status 和 /server-info 的响应。以下内容(也在 vcl_recv 中)对我有用:
if (req.url ~ "server-(info|status)") {
return (pass);
}
答案2
这看起来像一个解决方案,告诉我你的想法。
Varnish 会X-Varnish
向其发送到后端的每个请求添加一些 HTTP 标头。这些标头可用于 Apache 配置,以识别来自 Varnish 的请求。
在/etc/apache2/mods-enabled/status.conf
:
<IfModule mod_status.c>
SetEnvIf X-Varnish ".+" from_varnish
ExtendedStatus On
<Location /server-status>
SetHandler server-status
Order allow,deny
Deny from env=from_varnish
Allow from localhost ip6-localhost 127.0.0.1
</Location>
</IfModule>
然后告诉 munin 监视端口 8080 而不是 80。来自的请求munin-node
将直接发来,因此不会X-Varnish
设置标头。
添加到/etc/munin/plugin-conf.d/munin-node
:
[apache_*]
env.url http://127.0.0.1:%d/server-status?auto
env.ports 8080
答案3
我在 Ubuntu 12.04 上也遇到了同样的情况,Apache2 在端口 8008 上,Varnish 在端口 80 上。使用 Varnish VCL 时,我的服务器状态页面缓存了一个小时,因此仍然可用,但只有在缓存刷新时才提供状态报告。实施 Alain 的解决方案使实时服务器状态在 Varnish 传递到后端时可用。为了保护我的服务器状态,我做了以下事情:
我在 /etc/munin/plugin-conf.d/munin-node 中配置了 munin-node 来监听 8008:
[apache_*]
env.url http://127.0.0.1:%d/server-status?auto
env.ports 8008
然后我在 VCL 的 vcl_recv 部分顶部添加了以下行:
if (req.url ~ "^/server-status") {
error 403;
}
这将阻止对端口 80 上的服务器状态 URL 的访问,并显示 403 禁止消息,但 munin-node 仍然可以连接到 localhost:8008 上的服务器状态
这篇文章很有帮助:http://nwlinux.com/how-to-configure-varnish-on-ubuntu-server/