Я использую AWS Network Load Balancer и включил «Протокол прокси V2» в его целевой группе. Соединения перенаправляются в некоторые контейнеры докеров, на которых запущен nginx с такой конфигурацией:
server {
listen 8080 proxy_protocol;
set_real_ip_from 0.0.0.0/0;
real_ip_header proxy_protocol;
#...
}
Все работает хорошо, но теперь я бы хотел, чтобы эти докер-контейнеры работали локально, для тестовой среды. Итак, поскольку у меня нет локального AWS NLB, я подумал, что смогу смоделировать его поведение с помощью Apache http. Вот как я настроил виртуальный хост, он должен поддерживать SSL.
<VirtualHost *:443>
ServerAdmin mail@example.com
DocumentRoot "G:/path"
ServerName host.example.com
SSLEngine on
SSLCertificateFile "${SRVROOT}/conf/certs/host.crt"
SSLCertificateKeyFile "${SRVROOT}/conf/certs/host.key"
ProxyPass / balancer://mycluster/
<Proxy "balancer://mycluster">
BalancerMember "http://localhost:8117"
</Proxy>
</VirtualHost>
К сожалению, это не работает. Я думаю, это потому, что Apache http не «сообщает протокол прокси» BalanceMember. Когда я пытаюсь сделать запрос, я получаю эту ошибку.
<body>
<h1>Proxy Error</h1>
<p>The proxy server received an invalid
response from an upstream server.<br />
The proxy server could not handle the request<p>Reason: <strong>Error reading from remote server</strong></p>
</p>
</body>
Журнал ошибок сообщает эти две строки
[Mon Jun 08 13:19:43.324809 2020] [proxy_http:error] [pid 17460:tid 1164] (20014)Internal error (specific information not available): [client 127.0.0.1:51817] AH01102: error reading status line from remote server localhost:8117
[Mon Jun 08 13:19:43.324809 2020] [proxy:error] [pid 17460:tid 1164] [client 127.0.0.1:51817] AH00898: Error reading from remote server returned by /
Возможно ли моделировать NLB с помощью Apache httpd? Должен ли я просто отказаться и использовать вместо этого HAProxy? Спасибо
Поддержка протокола прокси Afaik для Apache HTTPD осуществляется через сторонний модуль.
Вы можете узнать об этом здесь: mod_proxy_protocol документ и тут: mod_proxy_protocol страница github
Объяснение здесь довольно простое, сначала загрузите модуль, включите протокол прокси с помощью директивы:
ProxyProtocol on