Apache HTTP2 h2 c режим не работает должным образом - PullRequest
0 голосов
/ 21 февраля 2020

Я бы хотел включить режим h2 c на apache, чтобы я мог использовать протокол HTTP2.0. В моей конфигурации виртуального хоста я включил строку:

Protocols h2c http/1.1

Я также следовал совету , чтобы отключить prefork , но он не работает должным образом.

В настоящее время я использую apache 2.4.29 в Ubuntu.

Case 1) curl, запрашивающий обновление http2

$ curl -vs --http2 http://domain1.com
* Rebuilt URL to: http://domain1.com/
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to domain1.com (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> Host: domain1.com
> User-Agent: curl/7.58.0
> Accept: */*
> Connection: Upgrade, HTTP2-Settings
> Upgrade: h2c
> HTTP2-Settings: AAMAAABkAARAAAAAAAIAAAAA
> 
< HTTP/1.1 101 Switching Protocols
< Upgrade: h2c
< Connection: Upgrade
* 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=28
* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
< HTTP/2 200 
< date: Sun, 00 Jan 1900 00:00:00 GMT
< server: Apache/2.4.29 (Ubuntu)
< last-modified: Fri, 29 Mar 2019 13:52:29 GMT
< etag: W/"2aa6-5853bfb4c71ac"
< accept-ranges: bytes
< content-length: 10918
< vary: Accept-Encoding
< content-type: text/html
< 
.... [snip website code] ....

Case 2) curl напрямую, используя http2

$ curl -vs --http2-prior-knowledge http://domain1.com
* Rebuilt URL to: http://domain1.com/
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to domain1.com (127.0.0.1) port 80 (#0)
* 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=0
* Using Stream ID: 1 (easy handle 0x5604f1cb1580)
> GET / HTTP/2
> Host: domain1.com
> User-Agent: curl/7.58.0
> Accept: */*
> 
* http2 error: Remote peer returned unexpected data while we expected SETTINGS frame.  Perhaps, peer does not support HTTP/2 properly.

Как вы можете видеть, Случай 1 работает должным образом, но Случай 2 не возвращает сайт. Почему это происходит? Это потому, что Apache ограничивает прямое использование HTTP2.0 без безопасности?

Надеюсь, вы можете дать мне ответ, поскольку я не знаю, почему сейчас все не работает.

1 Ответ

0 голосов
/ 22 февраля 2020

Я думаю, что нашел ответ, и я думаю, что это ошибка в последних Apache версиях. Если я включаю только h2 c на виртуальном хосте, ошибка не исчезнет, ​​но если я включу его на виртуальном хосте по умолчанию (000-default.conf), все будет работать нормально.

Другое потенциальное решение, которое я протестировал и это работает, чтобы включить протоколы h2 и h2 c на каждом виртуальном хосте, изменив файл mods-enabled/http2.load:

LoadModule http2_module /usr/lib/apache2/modules/mod_http2.so

<IfModule http2_module>
   Protocols h2 h2c http/1.1
</IfModule>

Кажется, что любой из вышеупомянутых параметров заставляет систему работать должным образом как с согласованием протокола, так и с предварительными знаниями.

...