Varnish 前面的 Nginx 有时会出现“从上游读取响应头时上游过早关闭连接”错误

Varnish 前面的 Nginx 有时会出现“从上游读取响应头时上游过早关闭连接”错误

我在同一台服务器上的 Varnish(4.1.0) 前面安装了 Nginx(1.9.9)。

//nginx
upstream varnish {
    server 127.0.0.1:8391;
    keepalive 16;
}

location ~ \.php$ {
     proxy_pass http://varnish;
     proxy_http_version 1.1; #for 1.0 varnish shows blank page
     proxy_set_header Connection "";
     proxy_redirect off;

     proxy_set_header Host $host:$server_port;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     proxy_set_header X-Forwarded-Proto $scheme;

     proxy_read_timeout 600;
     proxy_send_timeout 600;
     proxy_connect_timeout 600;
}

//varnish
DAEMON_OPTS="-a :8391 \
             -T localhost:6082 \
             -f /etc/varnish/default.vcl \
             -S /etc/varnish/secret \
             -s malloc,1024m"

对于 0.001% 的请求,nginx 显示错误:

[error] 5331#5331: *7392847 upstream prematurely closed connection while reading response header from upstream, client: xx.xx.xx.xx, server: _, request: "GET /home HTTP/1.1", upstream: "http://127.0.0.1:8391/index.php?q=/home", host: "xxx", referrer: "xxx"

使用 proxy_buffers 没有帮助。

答案1

我们遇到了同样的问题,使用 Nginx 进行 SSL 和 HTTP2,使用 Varnish 进行缓存,使用 Apache 进行实际的 Web 服务。

我注意到这种情况只发生在我们设置为绕过 Varnish 的请求上。出于某种原因,几年前,我们在 VCL 文件中对这些请求使用了 return(pipe)。我将它从 return(pipe) 更改为 return(pass),问题就解决了。

显然,您需要查看您的 VCL 并确保 return(pass) 适合您的场景,但在大多数情况下它很可能就是答案。

相关内容