Firefox、HTTP/2 Pushのサポート終了を意図
(groups.google.com)- Firefoxは利用率の低さと互換性対応の負担が大きくなった HTTP/2 Push を、すべてのプラットフォームで数日以内に無効化し、実装コードは当面ツリーに残す予定
- ブラウザーエコシステムではすでにサポートが縮小しており、Chrome 106 は2022年9月にこれを無効化し、Safariの最新バージョンもローカルテストでpush streamを拒否している
- ChromeはHTTP/2 Pushの利用率の低さを理由に挙げ、代替手段として rel="preload" と 103 Early Hints を推奨していた
- Firefoxは保守コストが大きくないためサポートを続けてきたが、ここ数か月でHTTP/2 Pushが原因の Firefoxでのみ発生するWeb互換性バグ が現れている
- サーバーやWebサイトがpushを使いながらFirefoxでのテストを省略すると、特定のサイトが Firefoxでのみ動作しない可能性がある
FirefoxのHTTP/2 Push無効化計画
- Firefoxはすべてのプラットフォームで HTTP/2 Push を無効化する予定
- 削除作業はBugzillaの 1915848 - Pref off HTTP/2 push で追跡されている
- まずはpreferenceで無効化し、実装コードは当面ツリーに残す
- 完全削除は来年春の ESR 140 ブランチ以前に行われる可能性が高い
ブラウザー別のサポート状況と無効化の理由
-
Chrome
- Chrome 106 は2022年9月にHTTP/2 Pushを無効化
- 関連ステータスは Chrome Platform Status で確認できる
- Chromeは利用率の低さを理由に挙げ、代替手段として
rel="preload"と 103 Early Hints を推奨
-
Safari
- 公式なdeprecation資料は確認できていないが、現行バージョンはNode.jsサーバーを使ったローカルテストでpush streamを拒否する
-
Firefox
- Firefoxはこれまで保守負担が大きくなかったため、HTTP/2 Pushのサポートを継続してきた
- ここ数か月でHTTP/2 Pushにより、Firefoxのみに影響する Web互換性の問題 が発生している
- 関連事例として bug 1915830 がある
- サーバーやWebサイトがpushを使いながらFirefoxでテストしない場合、Firefoxでのみサイトが停止することがあり、例として bug 1913100 がある
1件のコメント
Hacker News の意見
HTTP/2 Push は結局うまくいかないという「突然の発見」が出たあとでも、以前からなぜうまくいかないのかを説明していたのに無視されていた人たちに何の謝罪もないのが腹立たしい
Google のより賢い人たちが必要だと言うのだから仕様に押し込もう、という空気が何年もあり、仕様にはもっとはるかに保守的に向き合うべき。Google の一部が良いと思った 投機的な拡張目標 を入れ続けるようなやり方はやめるべき
ブラウザを遅くしているのは、たいていサイトを押しつぶしている広告、トラッカー、雑多なものだけで、それを直すために使うのは Google の発明品ではなく uBlock Origin だ。最近 Google が Web 標準に押し込んでいるものは、普通の開発者のためではなく、広告をもっと入れるため、あるいはデータセンター費用を0.1%節約するためのもののように見える
HTTP/2 は、ある一社が自社の利益に合わせて公共資源である www へのアクセスを支配し続けようとする事例に見える。Chrome を使うと HTTP/2 を試すことになり、同じ会社が検索エンジン、ハードウェア、ブラウザ、そして今ではネットワークプロトコルまで支配している。HTTP/2 は事実上 HTTP/Chrome と見てもよい
HTTP/2 Push が失敗した理由として示されている説明に、説得力を感じたことがない。Google はたいてい Jake Archibald の記事を指し示すが、その記事はプロトコル自体がうまくいかない理由というより、ブラウザ実装がどれほどお粗末だったかを列挙している側に近く見える
ブラウザはすでに preload リンクをサポートしており、これは Push ヘッダーと実質的に同じ役割を果たすべきものだ。キャッシュや認証ヘッダーのような2017年時点の実装上の難点も、既存の preload 処理コードを再利用できなかったのか疑問だ
https://jakearchibald.com/2017/h2-push-tougher-than-i-though...
HTTP/2 Push は、サーバーがクライアントに必要だと判断したリソースを先回りして送り込み、往復1回を減らす方式であり、DOM→レンダリングのパイプラインとは別にリソースを送って遅延を減らすことが目的だ。Preload ヘッダーは、サーバーが本文と一緒に並列ロードすべきリソースを知らせ、パースや JS 評価の前に取得させる方式だ。103 Early Hints は、レスポンス生成が終わる前、本文の最初のバイトより前に Preload ヒントを送り、取得段階をさらに前倒しする
核心的な違いは、サーバー主導かクライアント主導か、本文と一緒か最初のバイト以前かにある。HTTP/2 Push が目標達成に弱い最も単純な理由はキャッシュだ。ブラウザはすでに持っているリソースをリクエストしないが、サーバーはクライアントのキャッシュに何があるかを知らない。Push は不要なリソースを送るリスクが大きく、103/Preload は外れても無駄になるのは役に立たないヘッダー数バイト程度なので、実装も簡単でコストも低い
https://github.com/whatwg/fetch/issues/51
皆が注目していたコンテンツ配信のユースケースにも、まだ多くの可能性があったように思う。公に見える試みも多くなく、何を Push すべきかを実験できるライブラリや出発点にアクセスできた人もほとんどいなかった
HTTP/3 0-RTT 開始 で一部の速度を取り戻し、103 Early Hints でブラウザにアセットを早めにプリロードさせることができる。この組み合わせには HTTP/1 と意味的に後方互換であるという利点もある。リバースプロキシやロードバランサーでも扱いやすい
HTTP/2 Push が結局消えていくのを見ると少し惜しい。アイデアはすっきりしていたが、フレームワークでの採用が低調で、もっと注目されていればよかった機能だ
.NET 側は最後まで出さず、nginx には基本的な実装程度があった。キャッシュダイジェスト がなかったこともずっと足かせになった。Chrome は「どうせ誰も気づかないだろう」といった理由も一部挙げて削除し、NAT でいつも素晴らしく動作する UDP ですべてを再設計することのほうが重要だったようだ
HTTP/2 が標準化される前に Mike Belshe と話したときも、すでにこの機能は利点の実現が難しく、問題や落とし穴が多いため、H2 から外そうという空気があった
最大の問題の一つは、ブラウザキャッシュにすでにあるものを送ったり、重要でないコンテンツを送りすぎたりする 過剰な Push だった。実際に Push のせいでページロードがさらに遅くなった非常に悪い事例も見た。ブラウザがローカルキャッシュに何を持っているかをサーバーに知らせる提案もあったが、さまざまな問題にぶつかった。HTTP Early Hints と Resource Hints が H2 Push の必要性をおおむねなくし、実装がはるかに簡単で、不要な取得を避けられ、理解もしやすい
「WebサーバーやWebサイトが Push を使っていて Firefox でテストしていないと、Firefox だけでサイトが止まることがあり得る」という解釈もできるが、別の解釈も可能。
他のブラウザーは HTTP/2 Push を拒否して黙って無視する一方、Firefox は一部の境界条件で大きく転ぶ。たとえば「Firefox がヘッダー名の大文字に遭遇すると接続をリセットするようだ」という内容。
この記事は、他のブラウザーのように H2 Push を拒否して黙って無視する、まさにその措置を説明しているように見え、何かを隠しているようには見えない。
Push がなぜもっと広く採用されなかったのか気になる。大きな欠陥があるにもかかわらず、HTTP/2 がゲームチェンジャーになると見なされた大きな理由の1つだった。
ブラウザー対応の不足だったのか、それとも CDN との相性が悪かったのかは分からない。
後者の場合、特にモバイルでは有害な負担になる。サーバーはそのアセットが実際にクライアントに必要かどうかを絶対に正確には分からない。Early Hints の方がおそらく優れていて、サーバーが必要なアセットを素早く知らせれば、クライアントが取得するか、すでに持っているかを判断できる。
Index.htmlのリクエストが来たら、普通はscript.jsとstyle.cssを押し込みたくなるだろうが、そうすると数百 kbit を送ったことになる。ユーザーが再び
index.htmlをリクエストしたら、また全部送るべきなのか?リソースはすでにユーザーのキャッシュにある可能性が高い。送らないなら、何を送るべきかどうやって分かるのか?キャッシュに何があり何がないかはブラウザーだけが知っている。結局、初回訪問を速くする代わりに再訪問で帯域を浪費するか、初回訪問は遅いままにして再訪問を速くするか、という選択になる。それ以外の大多数にとっては巨大な複雑性の増大であり、実質的に無視された。
https://developer.chrome.com/blog/removing-push/
nginx の Push サポートは、Wikipedia 基準では2018年ごろに入ったようだ。こうした変更が安定版ディストリビューションのバージョンやデフォルト設定まで降りてくるには時間が必要。自分の Apache サーバーで初めて HTTP/2 を有効にしたのも2020年だったし、2024年でも直接サポートしていないアプリケーションサーバーがある可能性は高い。
…Firefox で、という話。
関連記事に見える。ほかにもあるだろうか?
Removing HTTP/2 Server Push from Chrome - https://news.ycombinator.com/item?id=32522926 - 2022年8月、コメント201件
A Study of HTTP/2’s Server Push Performance Potential - https://news.ycombinator.com/item?id=32097013 - 2022年7月、コメント2件
HTTP/2 Push is dead - https://news.ycombinator.com/item?id=25283971 - 2020年12月、コメント168件
Blink: Intent to Remove: HTTP/2 and gQUIC server push - https://news.ycombinator.com/item?id=25064855 - 2020年11月、コメント133件
We're considering removing HTTP/2 Server Push support - https://news.ycombinator.com/item?id=24591815 - 2020年9月、コメント2件
Performance Testing HTTP/1.1 vs. HTTP/2 vs. HTTP/2 and Server Push for REST APIs - https://news.ycombinator.com/item?id=21937799 - 2020年1月、コメント71件
How HTTP/2 Pushes the Web - https://news.ycombinator.com/item?id=18216495 - 2018年10月、コメント16件
Nginx HTTP/2 server push support - https://news.ycombinator.com/item?id=16365413 - 2018年2月、コメント63件
HTTP/2 Server Push on Netlify - https://news.ycombinator.com/item?id=14798271 - 2017年7月、コメント23件
The browser bugs and edge cases of HTTP/2 push - https://news.ycombinator.com/item?id=14445728 - 2017年5月、コメント20件
A Guide to HTTP/2 Server Push - https://news.ycombinator.com/item?id=14077955 - 2017年4月、コメント59件
HTTP/2 Server Push - https://news.ycombinator.com/item?id=13990074 - 2017年3月、コメント2件
HTTP/2 Server Push and ASP.NET MVC – Cache Digest - https://news.ycombinator.com/item?id=13659962 - 2017年2月、コメント9件
Accelerating Node.js Applications with HTTP/2 Server Push - https://news.ycombinator.com/item?id=12296922 - 2016年8月、コメント6件
Rules of Thumb for HTTP/2 Push - https://news.ycombinator.com/item?id=12224258 - 2016年8月、コメント25件
Google's Rules of Thumb for HTTP/2 Push - https://news.ycombinator.com/item?id=12223352 - 2016年8月、コメント2件
HTTP/2 Protocol for iOS Push Notifications - https://news.ycombinator.com/item?id=11175980 - 2016年2月、コメント13件
驚きではない。特定の目的のために作られた既存プロトコルの上に、本来の設計目標とほとんど関係のない機能を付け足すと、たいていこうなる
たいていの場合は低レベルのプロトコルから始めて、そのままユースケースに合わせるほうがよく、その点では WebSockets が双方向通信の問題をすでにエレガントに解いていると思う。深いファイル/スクリプト階層をロードするときの遅延を減らすには、
rel="preload"やrel="modulepreload"タグが優れていて、構造もシンプルだ要するに、サーバーが事前に読み込むべきコンテンツをヘッダーで送り、リンクタグが送信されたりパースされたりする前から先読みさせるというものだった。ストリーミングをサポートするページにはあまり有用ではないだろうが、HTMLページ全体がサーバー側でレンダリングされるまでリクエストが止まっている場合には、目に見えるメリットがあったかもしれない