![Varnish 前面的 Nginx 有时会出现“从上游读取响应头时上游过早关闭连接”错误](https://linux22.com/image/674812/Varnish%20%E5%89%8D%E9%9D%A2%E7%9A%84%20Nginx%20%E6%9C%89%E6%97%B6%E4%BC%9A%E5%87%BA%E7%8E%B0%E2%80%9C%E4%BB%8E%E4%B8%8A%E6%B8%B8%E8%AF%BB%E5%8F%96%E5%93%8D%E5%BA%94%E5%A4%B4%E6%97%B6%E4%B8%8A%E6%B8%B8%E8%BF%87%E6%97%A9%E5%85%B3%E9%97%AD%E8%BF%9E%E6%8E%A5%E2%80%9D%E9%94%99%E8%AF%AF.png)
我在同一台服务器上的 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) 适合您的场景,但在大多数情况下它很可能就是答案。