长话短说,我们已经设法从 Varnishlog 中获取了更精确的错误。
Varnishlog 告诉我们正在发送一个
31 TxRequest - POST
31 TxHeader - Content-Type: application/x-www-form-urlencoded
但我们正在得到
9 FetchError c backend write error: 11
31 BackendClose - [backend name]
9 VCL_call c error
9 VCL_return c deliver
9 Length c 488
9 VCL_call c deliver
9 VCL_return c deliver
9 TxProtocol c HTTP/1.1
9 TxStatus c 503
我们仍然不知道这到底是什么,但显然 Content-Type:application/x-www-form-urlencoded 未按应有的方式传递。仍需要帮助,请帮忙!
以下是原始消息。
标题是“Varnish 不允许 Joomla 用户登录 - 503 guru 冥想错误”,但我将其改为以便更多地关注问题而不是症状。
你好,
我们有一个为当地报纸制作的网站,该网站目前位于 Apache 反向代理之后,基本上该网站位于一台服务器上,另一台服务器仅保留为反向代理(好吧,还有更多,但与此无关)。Apache 作为反向代理可以工作,但速度可以更快。
我们想在 Ubuntu 10.4 服务器上将反向代理更改为使用 Varnish 而不是 Apache。Varnish 是直接从 Ubuntu 存储库安装的 2.10 版本。Ubuntu 10.4 使用 PHP 5.3.2。
对于匿名浏览者来说,Varnish 可以完美地运行网站。到目前为止,Varnish 的速度非常快,只是在登录或退出时遇到了一些问题。
最大的问题是,用户无法登录:他们每次都会收到 Varnish 503 错误页面。日志没有揭示原因。感觉好像请求永远不会离开 Varnish。所以我们只是猜测——不是一个强有力的起点。
我们已经研究了网络上各个地方的建议。我们已将超时时间增加到
backend xxx {
.host = "xxx.xx";
.port = "http";
.connect_timeout = 60s;
.first_byte_timeout = 60s;
.between_bytes_timeout = 60s;
}
但我们似乎能更快地获得 503 guru 错误页面,大约只需 5 秒。
我们已将守护进程中的 Varnish 标头大小增加到 128。
在 vcl_recv 中我们有
if (req.http.Authenticate || req.http.Authorization) {
return(pass);
}
在 vcl_fetch 中
## auhtentication handling
if (req.http.Authenticate || req.http.Authorization) {
return(pass);
}
我们不剥饼干。
我们已尝试确保错误页面不会被缓存。如上所述,我们在后端 Apache 日志中看不到任何内容,显然它从未被要求进行 Joomla 用户身份验证。
Varnish 似乎很少与 Joomla 关联。(我们无法抛弃 Joomla,选择已经做出,我们只能接受已经得到的结果)有人有可用的 Varnish - Joomla 组合吗?
感谢您的阅读。请帮忙。我们迫切需要一些提示。有什么建议吗?
奥姆帕普
答案1
这个错误报告似乎为您的问题提供了一种解决方法;您应该尝试一下。
答案2
if (req.http.Authenticate || req.http.Authorization) {
pass;
}
上次我使用 Varnish 时,并没有使用return(pass);
,只是pass;
不知道这是否会导致错误,或者可能会导致 varnish 忽略这些语法。
这样做的原因是,这会pass;
导致 varnish 引擎直接切换到 pass 模式,然后直接将内容从后端传递到客户端。
说真的。我开始越来越觉得这些return
语句只是在搞砸它。
编辑2:我刚刚重新阅读了 VCL 文档,但找不到任何有关return
关键字的内容。