Varnish POST 问题“9 FetchError c 后端写入错误:11”针对 application/x-www-form-urlencoded 内容

Varnish POST 问题“9 FetchError c 后端写入错误:11”针对 application/x-www-form-urlencoded 内容

长话短说,我们已经设法从 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

这个错误报告似乎为您的问题提供了一种解决方法;您应该尝试一下。

https://www.varnish-cache.org/trac/ticket/849

答案2

if (req.http.Authenticate || req.http.Authorization) {
     pass;
    }

上次我使用 Varnish 时,并没有使用return(pass);,只是pass; 不知道这是否会导致错误,或者可能会导致 varnish 忽略这些语法。

这样做的原因是,这会pass;导致 varnish 引擎直接切换到 pass 模式,然后直接将内容从后端传递到客户端。
说真的。我开始越来越觉得这些return语句只是在搞砸它。

编辑2:我刚刚重新阅读了 VCL 文档,但找不到任何有关return关键字的内容。

相关内容