我们最近从HTTP转移到了HTTPS。由于我们已经转移到HTTPS,我们正在考虑转向HTTP / 2以获得性能优势。
如上所述,浏览器和LB之间的请求是安全的(HTTPS),而LB和应用服务器之间的通信仍然使用HTTP
使用当前设置启用HTTP / 2有什么可能性?我们可以在浏览器和LB之间启用HTTP / 2,而LB和应用服务器之间的通信仍保留在HTTP上吗?
答案 0 :(得分:32)
HAProxy 1.8支持HTTP / 2
HAProxy 1.8现在支持客户端(在前端部分)的HTTP / 2,并且可以充当HTTP / 2客户端与HTTP / 1.1和HTTP / 1.0应用程序之间的网关。
您需要h2
中的haproxy.conf
指令。来自 CertSimple's HAProxy HTTP/2 and dynamic load balancing guide :
frontend myapp
bind :443 ssl crt /path/to/cert.crt alpn h2,http/1.1
mode http
旧版本的HAProxy
旧版本的HAProxy(如1.6和1.7)仅支持直通HTTP / 2 - 即将流量引导到支持HTTP / 2的单独应用服务器上。这要复杂得多 - 请参阅有关如何执行此操作的其他答案。要终止HTTP / 2并读取HAProxy上的流量,您需要HAProxy 1.8。
答案 1 :(得分:1)
haproxy真的不支持http / 2
它唯一支持的是检测http / 2请求,并将https / tcp443 tcp流传递给支持https和http / 2的服务器
这是别人的指南 http://m12.io/blog/http-2-with-haproxy-and-nginx-guide
答案 2 :(得分:1)
如果您能够在NginX
旁边运行一些HaProxy
,则应该在您的负载均衡器上运行。 NginX
(ab)用作纯SSL终结符,而不是全功能的Web服务器,因此NginX
不提供任何内容。
警告:这是匆忙完成的,所以没有任何证据证明这确实有效。缺少一些例子,对于这些链接很抱歉。
我在着名的 Munchhausen的照片之后称这个想法,将自己和马拉出泥潭:
首先,do a H2 setup in HaProxy喜欢Scott Farrell的回答,并进行了以下调整:
frontend http-in
mode http
bind *:80
option forwardfor
default_backend nodes-http
frontend https-in
mode tcp
bind *:443 ssl crt /etc/ssl/dummy.pem alpn h2,http/1.1
use_backend nodes-http2 if { ssl_fc_alpn -i h2 }
default_backend nodes-http
frontend http-lo
mode http
bind 127.0.0.1:82
#http-request set-header X-Forwarded-For req.hdr_ip([X-Forwarded-For])
default_backend nodes-http
backend nodes-http
mode http
server node1 web.server:80 check
backend nodes-http2
mode tcp
server loadbalancer 127.0.0.1:81 check send-proxy
这会将HTTP/2
连接循环回负载均衡器计算机并接受已解码的请求,以便通过http-lo
再次进入负载均衡。
现在在LB本身上,启动NginX
以在配置中侦听端口81
实例终止HTTP/2
连接并再次将其代理回负载均衡器。
在NginX中一定要:
使用HTTP/2
NginX
终止SSL
将所有内容透明地(又名。哑)代理回HaProxy
端口82
# Sorry, example `NginX`-config is missing here,
# but it includes something like:
proxy_pass http://127.0.0.1:82;
不要忘记在代理请求中通过X-Forwarded-For
标头包含Client-IP(我不知道如何配置NginX以使用"发送代理"传出协议代理请求)。
请注意,此设置主要是静态的。变化的部分是关于所有这些域及其TLS证书。
HTTP/2
请求流 Browser
| HTTP/2
V
Loadbalancer HaProxy *:443
| frontend https-in
| backend nodes-http2
| send-proxy
| TCP (transparent, HTTP/2)
V
Loadbalancer NginX 127.0.0.1:81
| HTTP/2 termination
| proxy_protocol
| proxy_pass 127.0.0.1:82
| Add header X-Forwarded-For
| HTTP
V
Loadbalancer HaProxy 127.0.0.1:82
| frontend https-lo
| Forward Header X-Forwarded-For
| backend nodes-http
| # DO YOUR LOADBALANCING HERE
| HTTP
V
web.server:80
是的,它通过HaProxy循环2次,但是由于HaProxy的工作速度很快,这种方式可以快速闪现。
真正低效的部分是将HTTP/2
标头解压缩为普通HTTP
标头。