我在同一台服务器上的 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) 适合您的场景,但在大多数情况下它很可能就是答案。