このガイドでは、HTTP/2 と HTTP/3 の一般的な問題(オリジン非互換、多重化エラー、ブラウザーエラー)を取り上げ、切り分けと対処の手順を説明します。
- オリジンの
max_concurrent_streamsは、ハンドシェイク中にネゴシエートされます。 GOAWAY(0)を受け取った場合は、サーバー再起動などにより、サーバーが新しいストリームを拒否している可能性が高いです。- 詳細は RFC 9113 - SETTINGS_MAX_CONCURRENT_STREAMS ↗ を参照してください。
- 多重化の問題は、サーバー設定の誤りで起きることがあります。
- netlogs ↗ を使い、
SETTINGS_MAX_CONCURRENT_STREAMSの違反や予期しないGOAWAYフレームを特定します。 - 詳細は Stream Concurrency Issues ↗ を参照してください。
よくあるブラウザーエラーは次のとおりです。
ERR_HTTP2_PROTOCOL_ERRORERR_HTTP3_PROTOCOL_ERRORERR_QUIC_PROTOCOL_ERROR
これらのエラーは、必ずしもプロトコルレベルの問題を意味しません。次の手順で確認します。
- HTTP/1.1 で再現を試みます。
- HTTP/1.1 でも問題が続く場合は、HTTP/2 や HTTP/3 を試す前に、根本のエラーに対処します。
- 問題が再現しない場合は、HTTP/2 または HTTP/3 固有の問題がないか netlogs を分析します。
詳細は Chromium URL Request Header ↗ を参照してください。
問題が Chrome の HTTP/3 だけで再現し、HTTP/3 を無効にすると消える場合、オリジンサーバーではなく、ブラウザー側の QUIC 処理に関係していることがあります。これは既知の Chrome の問題(crbug.com/41161335 ↗)です。Cloudflare の QUIC 実装が原因ではありません。
症状の例は次のとおりです。
- 大きなダウンロードが突然止まる。
- 同時リクエストが多いページが 1〜3 分ハングしたあと失敗する。
- 接続が進まなくなったあと、Chrome が
ERR_QUIC_PROTOCOL_ERRORまたはERR_HTTP3_PROTOCOL_ERRORを報告する。 - Firefox や Safari では再現しない。
chrome://flagsで QUIC を無効にすると解消する。
- ゾーンの HTTP/3 を一時的に無効にします。
- 同じリクエストを HTTP/2 で再テストします。
- HTTP/2 では問題が消える場合、Chrome の NetLog を取得して動作を比較します。
すぐに試す: Chrome で chrome://flags を開き、「QUIC」を検索して Disabled に設定し、Chrome を再起動します。
特定のホスト名だけで問題が起きる場合は、より限定した回避策を使えます。影響のあるホスト名について、Alt-Svc ヘッダーを削除する Response Header Modification Transform Rule を作成します。
- Cloudflare ダッシュボードで、Rules の Overview ページを開きます。
- Create rule > Response Header Transform Rule を選択します。
- 一致条件をホスト名に設定します:
(http.host eq "example.com")。 - Modify response header で Remove を選び、ヘッダー名に
Alt-Svcを入力します。
これで、HTTP/3 を全体で無効にせず、そのホスト名では Chrome に HTTP/2 を使わせます。ただし、プロキシされたホスト名は生成された HTTPS レコードでも HTTP/3 を告知できるため、切り分け中に HTTP/2 へ確実に寄せるには、ゾーンの HTTP/3 を無効にするのが最も確実です。
Alt-Svc を変更したあと、ブラウザーは告知された代替サービスを最大 24 時間キャッシュする場合があることに注意してください。