Назад | Перейти на главную страницу

Nginx перед Varnish иногда выдает ошибку «преждевременно закрытое восходящее соединение при чтении заголовка ответа из восходящего потока».

У меня есть Nginx (1.9.9) перед Varnish (4.1.0) на том же сервере.

//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 не помогла.

У нас была такая же проблема, когда мы использовали Nginx для SSL и HTTP2, Varnish для кеширования и Apache для фактического веб-обслуживания.

Я заметил, что это происходило только с запросами, которые мы установили для обхода Varnish. По какой-то причине много лет назад мы использовали для этого return (pipe) в нашем файле VCL. Я изменил его с return (pipe) на return (pass), и, вуаля, проблема решена.

Очевидно, вам нужно взглянуть на свой VCL и убедиться, что return (pass) работает для вашего сценария, но в большинстве случаев он, вероятно, будет ответом.