Соединение Nginx и Varnish 6 через Unix Domain Socket не работает - PullRequest
0 голосов
/ 15 мая 2019

Я использую Nginx в качестве конечной точки SSL перед Varnish 6 на той же машине. Это хорошо работает при использовании порта TCP. Поскольку Varnish 6 поддерживает прослушивание сокетов домена Unix, я изменил свою конфигурацию, чтобы использовать сокеты:

  • varnishd запускается с параметром: -a /var/run/varnish.sock,PROXY,user=varnish,group=varnish,mode=666 (ранее это было -a: 8080)

  • в конфигурации Nginx, я изменил proxy_pass http://127.0.0.1:8080; на proxy_pass http://unix:/var/run/varnish.sock;

Перезапустите Nginx и Varnish, ошибки не отображаются. Файл сокета /var/run/varnish.sock создан и доступен для записи во всем мире (я знаю, я знаю ... Я просто хотел запустить его). Netstat говорит, что varnishd слушает /var/run/varnish.sock.

Но это не работает, любой веб-запрос к nginx возвращает «502 Bad Gateway».

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

Varnishlog показывает записи, подобные следующим для каждого запроса:

*   << Session  >> 65578
-   Begin          sess 0 PROXY
-   SessOpen       0.0.0.0 0 a0 0.0.0.0 0 1557937009.691636 21
-   SessClose      RX_JUNK 0.000
-   End

Есть идеи, что не так?

Лак Лак-6.0.3 ревизия 7d1ded3aa033a018317dbafc61587026ea2ef8a3, Nginx - это nginx / 1.14.0 (Ubuntu), Работает на Ubuntu 18.04 Bionic

1 Ответ

1 голос
/ 15 мая 2019

У вас есть прослушивание Varnish по протоколу PROXY, но NGINX говорит с ним по обычному протоколу HTTP.Таким образом, происходит сбой.

Если быть точным, -a /var/run/varnish.sock,PROXY,user=varnish,group=varnish,mode=666 означает, что Varnish прослушивает сокет UDS только , принимая протокол PROXY.Не существует волшебного переключателя, позволяющего ему принимать как обычные протоколы HTTP, так и PROXY.

В идеальном мире у NGINX есть способ переадресовывать (говорить) протокол PROXY на Varnish.Но вы не можете сделать это с proxy_pass в контексте http {}.Вы можете сделать proxy_pass + proxy_protocol в потоке NGINX, но обычно это не то, что вам нужно, потому что это сломает HTTP / 2 и снизит его до более старого протокола.

Обязательно прочитайте Концепции стека UDS .В частности, в нем упоминается, почему NGINX является плохим выбором для завершения TLS при настройке UDS:

NGINX не способен пересылать протокол PROXY через прокси-модуль http.Это означает, что завершение TLS сервера {proxy_pass ....} для Varnish, который прослушивает протокол PROXY, не будет работать.

и

nginx SSL stream +Прослушивание лаком по протоколу PROXY не будет поддерживать HTTP / 2, потому что поток SSL nginx не знает, как согласовать протокол ALPN.

...