我正在使用 AWS 网络负载均衡器,并在其目标组中启用了“代理协议 V2”。连接通过以下配置转发到运行 nginx 的一些 docker 容器:
server {
listen 8080 proxy_protocol;
set_real_ip_from 0.0.0.0/0;
real_ip_header proxy_protocol;
#...
}
一切运行良好,但现在我想让这些 docker 容器在本地工作,以用于测试环境。因此,由于我本地没有 AWS NLB,我想我会使用 Apache http 模拟其行为。以下是我配置虚拟主机的方式,它必须支持 SSL。
<VirtualHost *:443>
ServerAdmin [email protected]
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 /
是否可以使用 Apache httpd 模拟 NLB?我是否应该放弃并使用 HAProxy?谢谢
答案1
据我所知,Apache HTTPD 的代理协议支持通过第三方模块。
您可以在这里查看所有相关信息: mod_proxy_protocol 文档 和这里: mod_proxy_protocol github 页面
解释很简单,先加载模块,通过指令启用代理协议:
ProxyProtocol on