SSL/TLSなしのHTTPでもHTTP/2に対応してくれるWebサーバーのリバースプロキシ
#nghttp2 #HTTP/2
背景
HTTP/2はHTTPSに限定したプロトコルではないが、サーバー自体がHTTPS(SSL)でないときは非対応のことが多い。すくなくともNginxもlisten 80 http2しても上手くいかなかった。
追記: @flano_yukiさんcurlであれば--http2-prior-knowledgeオプションで上手くいくのではという情報をもらい、それで上手くいった。
SSL/TLSで使えるALPNを使ってアップグレードしたりする関係もありHTTP/2は少し生HTTPとHTTPSで少し違うことも対応の差に影響があると思う。
関連: Node.jsのhttp2.createServer()がHTTP/1のリクエストを受け付けない仕様のテストコードの場所
nghttp2を使えば上手くいくことがわかった。
追記: Nginxでもcurlであれば--http2-prior-knowledgeを使ってHTTP/2を話すことを確認できる。
結果
以前「」で立てたサーバーにcurl -vvv --http2 http://localhost:8080/をしてみると、以下のようにHTTP/2で話してくれた。
Nginx
code:ログ
* Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8080 (#0)
GET / HTTP/1.1
Host: localhost:8080
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=27
* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
< HTTP/2 200
< content-length: 2246
< content-type: text/html
< date: Sun, 05 Jan 2020 04:11:17 GMT
< server: nghttpx
< via: 1.1 nghttpx
<
<html>
...
</html>
* Connection #0 to host localhost left intact
hr.icon
追記: 2020/1/7
プロトコルの解説記事などで有名な@flano_yukiさんにご指摘をいただいた。
nginxのlisten 80 http2は、仕様で言うとアップグレードではなくdirectの接続になるので、curlで言えば--http2-prior-knowledgeつけたらどうでしょうか
https://twitter.com/flano_yuki/status/1214412768557748224
上手くいった。
https://gyazo.com/3ecd12dae9d8d893302f95358159cbcd
HTTP/2のdirectの接続というものなど知ると理解が深まりそうな感じ。
簡単に調べた感じ以下の各ライブラリなどのHTTP/2実装の表が見つかった。関係があるかもしれない。HTTPとHTTPSで差異があったりとかするような気がするのでそういうのも調べると良さそうな感じ。
Implementations · http2/http2-spec Wiki
https://gyazo.com/740df92717462bc704cac81a88babcaf
https://gyazo.com/535792df7e9fd5b9c8abc6f96f0bc204
個人的には一番きになるのはブラウザがちゃんと対応しているかということなのでそれも合わせて調べたい。
https://gyazo.com/6b3e485620cb3c5c4401259332e6710d
https://gyazo.com/cbfd19ba236a8ce93ac53f643c22a9a6
そもそもこれを調べたくなった発端はOnion ServiceでHTTP/2に対応してもTor Browserはnon-HTTPSだとHTTP/2を話さないを検証することだった。HTTP/2には色々とnegotiationの種類があることがわかったので少しずつ調べたい。