HAProxy 1.5でALPNに対応していた。
HTTP/2 over TLSの通信を、HAProxyでTLSを終端することで、TLS対応を行わないであろうVarnishなどでもh2c接続が可能となる。
(HAProxy自体のhttp2対応はまだ先)
今回はバックエンドにNginxをh2cでリッスンさせて試してみた
構成
構成としては以下の図のとおりである。
HAproxyはTLSの終端のみを行い、中身のメッセージをそのままバックエンドに送信する。この時HAProxyはHTTP/2の処理は行わない。
バックエンドのNginxはh2cのダイレクトで通信を受け付ける。
HAProxyの設定
- bindでalpn h2を指定する
- if { ssl_fc_alpn -i h2 }で、h2ならh2cのバックエンドへ、そうでなければhttp/1.1のバックエンドへ
(opensslのバージョンが足りないとALPN使えません)
haproxy.cfg
frontend tls_proxy
bind *:443 name https ssl crt /etc/haproxy/ssl/server.pem alpn h2 ciphers AESGCM:HIGH:!aNULL:!MD5
mode tcp
use_backend nginx-h2c if { ssl_fc_alpn -i h2 }
default_backend nginx
backend nginx
balance roundrobin
server nginx1 localhost:8080 check inter 2000 send-proxy
backend nginx-h2c
balance roundrobin
server nginx1 localhost:8081 check inter 2000 send-proxy
Nginxの設定
今回はnginx 1.9.4 http2パッチv3
- 8080番ポートでhttp/1.1
- 8081番ポートでh2cダイレクト
nginx.conf
server {
listen 8080 proxy_protocol;
server_name localhost;
location / {
root /usr/share/www;
}
}
server {
listen 8081 http2 proxy_protocol;
server_name localhost;
location / {
root /usr/share/www;
}
}
