Проблемы с бэкэндом на http2

Pavel Odintsov pavel.odintsov на gmail.com
Вс Окт 18 18:58:20 UTC 2015


Всем привет!

Имеется сервер gRPC на С++, который работает только поверх
шифрованного HTTP2. Имеется желание его проксировать силами Nginx для
повышения надежности и реверс-проксирования.

Суть в том, что Nginx должен общаться с gRPC бэкэндом только по
HTTP2/TLS, иначе оно не работает.

Но Nginx не может подключиться к http2 бэкэнду вот с такой ошибкой:
2015/10/18 20:54:07 [error] 2954#2954: *3 peer closed connection in
SSL handshake while SSL handshaking to upstream, client: 127.0.0.1,
server: api.fastnetmon.io, request: "POST
/fastmitigation.Fastnetmon/GetBanlist HTTP/2.0", upstream:
"https://127.0.0.1:10777/fastmitigation.Fastnetmon/GetBanlist", host:
"api.fastnetmon.io:443"

Отладочный лог следующий:
https://gist.github.com/pavel-odintsov/a63be495bc8c97e263ce

gRPC сервер ругается вот так:
E1018 20:57:43.008673859    2849 security_connector.c:485]   Missing
selected ALPN property.
E1018 20:57:43.008703681    2849 handshake.c:133]            Peer check failed.
E1018 20:57:43.008715764    2849 server_secure_chttp2.c:154] Secure
transport failed with error 2

Судя по всему, ему нужно каким-то образом явно передать ALPN что оно
HTTP2, но это сделать с Nginx - я не понимаю :(

Мой конфиг вот такой:

user  nginx;
worker_processes  1;

# warn
error_log  /var/log/nginx/error.log debug;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" http
v2: $http2';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    #include /etc/nginx/conf.d/*.conf;

    server {
        listen 443 ssl http2 default_server;

        server_name api.fastnetmon.io;

        ssl_certificate     /usr/src/fastnetmon/src/server.crt;
        ssl_certificate_key /usr/src/fastnetmon/src/server.key;

        #root /var/www/html;
        location / {
            proxy_ssl_protocols TLSv1.2;
            add_header        Alternate-Protocol  10777:npn-spdy/3;
            proxy_pass https://127.0.0.1:10777;
            proxy_set_header       Host $host;
        }
    }
}



-- 
Sincerely yours, Pavel Odintsov


Подробная информация о списке рассылки nginx-ru