Поддерживает ли Nginx обновление http / 2 с http / 1.1 открытым текстом (h2c)? - PullRequest
0 голосов
/ 24 мая 2019

Есть ли способ поддержать обновление http1.1 до h2c (не в ssl) в nginx?

использовать тестовый сайт curl http://nghttp2.org/

$ curl --http2  http://nghttp2.org/ -s -o /dev/null -v

Я получаюследующий результат:

*   Trying 139.162.123.134...
* TCP_NODELAY set
* Connected to nghttp2.org (139.162.123.134) port 80 (#0)
> GET / HTTP/1.1
> Host: nghttp2.org
> User-Agent: curl/7.54.0
> Accept: */*
> Connection: Upgrade, HTTP2-Settings
> Upgrade: h2c
> HTTP2-Settings: AAMAAABkAARAAAAAAAIAAAAA
>
< HTTP/1.1 101 Switching Protocols
< Connection: Upgrade
< Upgrade: h2c
* Received 101
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=33
* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
< HTTP/2 200
< date: Fri, 24 May 2019 08:58:43 GMT
< content-type: text/html
< last-modified: Thu, 18 Apr 2019 06:19:33 GMT
< etag: "5cb816f5-19d8"
< accept-ranges: bytes
< content-length: 6616
< x-backend-header-rtt: 0.009521
< server: nghttpx
< via: 2 nghttpx
< x-frame-options: SAMEORIGIN
< x-xss-protection: 1; mode=block
< x-content-type-options: nosniff
<
{ [2159 bytes data]
* Connection #0 to host nghttp2.org left intact

но когда я захожу на статический веб-сайт nginx, он потерпит неудачу.

$ curl --http2 -v 10.10.5.89:9006
* Rebuilt URL to: 10.10.5.89:9006/
*   Trying 10.10.5.89...
* TCP_NODELAY set
* Connected to 10.10.5.89 (10.10.5.89) port 9006 (#0)
> GET / HTTP/1.1
> Host: 10.10.5.89:9006
> User-Agent: curl/7.54.0
> Accept: */*
> Connection: Upgrade, HTTP2-Settings
> Upgrade: h2c
> HTTP2-Settings: AAMAAABkAARAAAAAAAIAAAAA
>
* Connection #0 to host 10.10.5.89 left intact
$

вот мой nginx conf


server {
    listen 9006 http2 fastopen=3 reuseport;

    location / {
        autoindex_exact_size off;
        root /www/;
        autoindex on;
        }        
    }
}

nginxотладочная информация:

2019/05/24 16:49:53 [debug] 348#348: *1 invalid http2 connection preface "GET / HTTP/1.1
"
2019/05/24 16:49:53 [debug] 348#348: *1 http2 state connection error
2019/05/24 16:49:53 [debug] 348#348: *1 http2 send GOAWAY frame: last sid 0, error 1
2019/05/24 16:49:53 [debug] 348#348: *1 http2 frame out: 0000561508B48B08 sid:0 bl:0 len:8
2019/05/24 16:49:53 [debug] 348#348: *1 http2 frame out: 0000561508B48A58 sid:0 bl:0 len:4
2019/05/24 16:49:53 [debug] 348#348: *1 http2 frame out: 0000561508B489A0 sid:0 bl:0 len:18

1 Ответ

0 голосов
/ 24 мая 2019

С флагом --http2 и URL-адресом curl http: // отправляется сообщение HTTP / 1.1 с запросом на обновление до HTTP / 2 (upgrade заголовок HTTP и HTTP2-Settings заголовок HTTP), а затем обновляется, если Сайт заявляет, что поддерживает HTTP / 2 с ответом 103 с заголовком HTTP upgrade.

Это то, что вы видите в первом запросе к сайту nghttp2, и это работает, только если сайт понимает как HTTP / 1.1, так и HTTP / 2.

Ваша конфигурация nginx поддерживает только HTTP / 2, а не HTTP / 1.1, так что это не работает, так как не понимает первоначальный запрос HTTP / 1.1. Невозможно заставить Nginx поддерживать и HTTP / 1.1, и HTTP / 2 на одном и том же порту , поэтому ваша конфигурация верна - она ​​просто не будет работать с этой командой curl. Это необходимо сделать для того, чтобы curl использовал HTTP / 2 с самого начала ( называется предварительными знаниями в спецификации HTTP / 2 - отсюда и имя параметра командной строки):

curl --http2-prior-knowledge -v 10.10.5.89:9006
...