我在使用 http2 以 TCP 模式配置 HAProxy 时遇到问题。
我的主要目标是通过 HTTPS 提供静态维护页面。
这是我的 HAProxy 配置:
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
tune.ssl.default-dh-param 2048
ssl-default-bind-options no-sslv3 no-tls-tickets
ssl-default-bind-ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
defaults
log global
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
frontend http
mode http
bind *:80
redirect scheme https
frontend https
mode tcp
bind *:443 ssl crt /etc/ssl/certificate.pem alpn h2,http/1.1
default_backend web
backend web
mode tcp
balance roundrobin
server www1 192.168.0.100:443 check
server www2 192.168.0.101:443 check
server www3 192.168.0.102:443 check
backend maintenance
mode tcp
errorfile 503 /etc/haproxy/errors/503.http
当我切换到前端时默认后端部分到维护它不起作用 - HAProxy 没有提供任何页面。使用模式 http 的模拟解决方案工作正常。但是我无法在后端使用带有 http2 和 nginx 的 SSL。
后端有一个开启了 http2(不带 SSL)的 nginx。
我无法通过 nginx 进行维护,因为使用多个 Web 服务器是毫无意义的。未来我计划将 Web 服务器堆栈扩展到十几台服务器。
我曾考虑过放置一个简单的独立服务器来为一个静态维护页面提供服务,但我不知道有哪个应用程序/库允许在没有 SSL 的情况下使用 http2。我认为目前只有 nginx 允许这样做。
我把 HAProxy 的文档从头到尾都读了一遍,没有一个有用的示例描述 http2 和 SSL 配置。最后,连 Google 都束手无策。