Ana içeriğe geç

Rehberler / Düzeltin: insanların gerçekten karşılaştığı hatalar için rehberler

ERR_HTTP2_PROTOCOL_ERROR: Nedenleri ve Çözümleri

ERR_HTTP2_PROTOCOL_ERROR, tarayıcının ve sunucunun HTTP/2'yi başarıyla müzakere ettiği, ama alışverişteki belirli bir çerçevenin veya akışın protokolün kurallarını bozduğu anlamına gelir, ve bağlantı sıfırlandı. Bu bir TLS hatasından farklıdır: şifreli bağlantı çalıştı, ve sorun bir katman yukarıda, HTTP/2 akışının kendisinin nasıl oluşturulduğundadır.

ERR_HTTP2_PROTOCOL_ERROR ne anlama gelir

HTTP/2, çerçeve boyutu, başlık kodlaması (HPACK) ve akış durumu hakkında katı kurallarla, istekleri ve yanıtları tek bir bağlantı üzerinden ikili çerçeveler olarak gönderir. Bozuk bir çerçeve, aşırı büyük bir başlık, veya zaten kapalı bir akış için bir çerçeve gönderen bir sunucu, proxy veya CDN, bu kuralları bozar, ve istemci ne kastedildiğini tahmin etmek yerine bağlantıyı sökar. Başarısızlık uygulama sunucusundan, bir ara proxy'den, bir CDN kenarından veya tarayıcının kendi ağ yığınından kaynaklanabileceğinden, bu hata bu listedeki çoğu diğerinden daha geniş bir kök neden aralığını kapsar.

Hata nasıl görünür

Chrome ve Edge, bazen sadece bazı sayfa yüklemelerinde, diğerlerinde değil, "This page isn't working - ERR_HTTP2_PROTOCOL_ERROR" gösterir, ki bu hatanın sabit bir yanlış yapılandırma yerine aralıklı olduğunun bir ipucudur. Firefox genellikle protokolü adlandırmak yerine genel bir bağlantı hatası gösterir.

curl, HTTP/2'yi zorlayabilir ve bağlantının tam olarak hangi çerçevede başarısız olduğunu gösterebilir:

curl --http2 -v https://example.com/ 2>&1 | tail -20
...
* Recv failure: Connection reset by peer
* HTTP/2 stream 1 was not closed cleanly: PROTOCOL_ERROR (err 1)

Bunu aynı URL'ye bir HTTP/1.1 isteğiyle karşılaştırmak, sorunun protokole özgü olup olmadığını izole eder:

curl --http1.1 -sI https://example.com/

HTTP/1.1 isteği başarılı olur ve HTTP/2 olan başarısız olursa, hata zincirdeki bir şeyin HTTP/2'yi nasıl uyguladığındadır, uygulamanın kendisinde değil.

ERR_HTTP2_PROTOCOL_ERROR'a ne sebep olur

  • Uygulamadan veya bir proxy'den bozuk ya da aşırı büyük başlıklar. Çok uzun bir çerez, aşırı büyük bir yanıt başlıkları kümesi, veya HPACK'ın kodlayamadığı karakterler içeren bir başlık değeri, sunucunun veya istemcinin beklediği çerçeve boyutunu ihlal edecektir.
  • Hatalı veya güncelliğini yitirmiş bir HTTP/2 uygulamasına sahip bir ters proxy veya yük dengeleyici. Bazı eski nginx, Apache veya gömülü cihaz HTTP/2 yığınlarının, yük altında belirli çerçeve dizileriyle bilinen sorunları vardır.
  • Bir CDN kenar hatası veya bir kenar-kaynak protokol uyuşmazlığı. Tarayıcı-kenar bacağı ve kenar-kaynak bacağı farklı protokoller kullanabilir; aralarında çeviri yapan bir hata, bazen sadece belirli istek şekilleri için bu hatayı üretir.
  • HTTPS trafiğini ele geçiren antivirüs yazılımı veya bir tarayıcı uzantısı. SSL el sıkışma başarısızlıklarına neden olan aynı sınıf yazılım, ele geçirme katmanı HTTP/2'yi doğru konuşmuyorsa sağlıklı bir HTTP/2 akışını da bozabilir.
  • Eski HTTP/2 uygulamasına sahip güncelliğini yitirmiş bir tarayıcı, veya bozuk bir tarayıcı ağ önbelleği.
  • Bir ters proxy arkasında bir Content-Length uyuşmazlığı. nginx (veya başka bir proxy), beyan edilen Content-Length'i gerçekte gönderilen baytlarla eşleşmeyen bir yanıtı iletirse, alt akıştaki HTTP/2 çerçevelemesi ortasında bozulabilir.

Kimin hatası olduğunu nasıl anlarsınız

Birden fazla konumdan bir HTTP kontrolü çalıştırın: başarısızlık her yerde tutarlıysa, hata sunucuda veya CDN'in HTTP/2 işlemesindedir. Sadece sizin için başarısız oluyorsa, çok daha muhtemel yereldir, bir tarayıcı, bir antivirüs, veya sizinle site arasındaki bir ağ cihazı.

ERR_HTTP2_PROTOCOL_ERROR nasıl düzeltilir

Bir ziyaretçiyseniz

  1. Sayfayı yeniden yükleyin. Neden genellikle kalıcı bir yanlış yapılandırma yerine tek bir bozuk çerçeve olduğundan, taze bir bağlantı sık sık başarılı olur.
  2. Tarayıcı önbelleğini chrome://settings/clearBrowserData adresinde temizleyin, çünkü önbelleğe alınmış bozuk bir kaynak bunu yeniden yüklemede tetikleyebilir.
  3. Antivirüs HTTPS/SSL taramasını geçici olarak devre dışı bırakın ve yeniden deneyin; bu sınıf yazılım yaygın ve genellikle gözden kaçırılan bir nedendir.
  4. Bir uzantıyı elemek için gizli bir pencere deneyin.
  5. Tarayıcıyı en son sürüme güncelleyin, çünkü eski HTTP/2 istemci uygulamalarının bilinen hataları vardı.

Siteyi çalıştırıyorsanız

  1. Yukarıdaki curl komutlarıyla HTTP/2'yi HTTP/1.1 ile karşılaştırın. Sadece HTTP/2 başarısız oluyorsa, sorun uygulamada değil bir proxy veya CDN'in HTTP/2 katmanındadır.
  2. Büyük çerezler veya başlıklar söz konusuysa nginx'in başlık boyutu sınırlarını yükseltin:
    http2_max_field_size 16k;
    http2_max_header_size 32k;
    large_client_header_buffers 4 16k;
    Değişiklikten sonra nginx'i yeniden başlatın veya yeniden yükleyin ve yeniden test edin.
  3. Uygulamanın gönderdiği ile proxy'nin ilettiği arasında bir Content-Length uyuşmazlığı için kontrol edin; nginx'in tam yanıtı HTTP/2 için çerçevelemeden önce okuyabilmesi için proxy tamponlamasını etkinleştirin (proxy_buffering on;).
  4. nginx, Apache, veya herhangi bir yük dengeleyiciyi güncel bir sürüme güncelleyin; HTTP/2 çerçeve işleme hataları, nokta sürümlerinde düzeltilen türden şeylerdir.
  5. Kalıcı bir düzeltme değil bir teşhis testi olarak HTTP/2'yi devre dışı bırakın: nginx listen yönergesinden geçici olarak http2'yi bırakın. Hatalar dururasa, hatanın özellikle HTTP/2 katmanında olduğu doğrulanır, ve yukarıdaki başlık veya tamponlama düzeltmesi yerinde olduğunda onu yeniden etkinleştirebilirsiniz.
  6. Kaynağın önünde bir CDN varsa CDN tarafı günlükleri kontrol edin; çoğu CDN, HTTP/2 çerçeveleme hatalarını tarayıcının hiç göstermediğinden daha fazla ayrıntıyla kendi kenar günlüklerinde gösterir.

İlgili hatalar

  • ERR_SSL_PROTOCOL_ERROR, benzer görünür ama daha erken, TLS el sıkışması sırasında, herhangi bir HTTP/2 çerçevesi alışverişi yapılmadan önce başarısız olur.
  • 5xx sunucu hata kodları, bağlantının ve protokolün gayet iyi çalıştığı ama uygulamanın kendisinin başarısız olduğu durumları kapsar.

Ayırmaya değer bir ayrıntı: bir HTTP/2 protokol hatası, örneğin bir istemcinin bir isteği uçuşta iptal etmesi gibi, uygulama tarafından temiz bir şekilde sıfırlanan bir HTTP/2 akışıyla aynı değildir. Tarayıcı geliştirici araçları ve sunucu erişim günlükleri bazen ikisini de "sıfırlandı" olarak etiketler, ama tarayıcıda sadece gerçek bir çerçeveleme ihlali ERR_HTTP2_PROTOCOL_ERROR üretir; kasıtlı olarak iptal edilen bir akış basitçe bir hata sayfası olmadan durur.

ERR_HTTP2_PROTOCOL_ERROR nasıl önlenir

Bu hata genellikle aralıklı olduğundan, belirli başlık boyutlarına veya belirli proxy sürümlerine bağlı olduğundan, birisi bir kalıp fark etmeden haftalarca ziyaretçilerin bir kısmını etkileyebilir. Birden fazla konumdan zamanlı olarak çalışan bir HTTP kontrolü, dağınık kullanıcı raporlarına güvenmek yerine, bir dağıtım, bir CDN değişikliği veya bir proxy yükseltmesinden hemen sonra yükselen bir başarısızlık oranını yakalar. HostTracker, bir kontrol başarısız olmaya başladığı anda e-posta, SMS, sesli arama, Slack, Telegram ve daha fazlasıyla uyarır.

Sık sorulan sorular

ERR_HTTP2_PROTOCOL_ERROR bir SSL hatasıyla aynı mı?

Hayır. Bu hata TLS başarılı olduktan sonra, HTTP/2 çerçeveleme katmanında olur. Bir SSL hatası, şifreli bağlantının kendisinin hiç oluşmadığı anlamına gelir.

Hata neden sadece bazen olur, her sayfa yüklemesinde değil?

Buradaki çoğu neden, her seferinde başarısız olan sabit bir yanlış yapılandırma yerine, bir sınırı aşan bir başlık, yük altında bir proxy'deki bir yarış durumu, veya belirli önbelleğe alınmış bir kaynak gibi belirli koşullar tarafından tetiklenir.

Sunucumda HTTP/2'yi devre dışı bırakmak performansı zedeler mi?

HTTP/2, gerçek faydalar sunar (çoğullama, başlık sıkıştırma), bu yüzden onu devre dışı bırakmayı kalıcı bir düzeltme değil, geçici bir teşhis adımı olarak ele alın. Altta yatan başlık boyutu veya tamponlama sorununu düzeltin ve yeniden etkinleştirin.

Kaynak sunucum sağlam olsa bile bir CDN buna neden olabilir mi?

Evet. CDN kenarı ve kaynak, bağlantının her bacağında farklı protokoller kullanabilir, ve CDN'in aralarında nasıl çeviri yaptığı konusundaki bir hata veya yanlış yapılandırma, kaynağın kendi sağlığından bağımsız olarak bu hatayı üretebilir.

Bu, HTTP/1.1 sitelerinde olur mu?

Hayır, ERR_HTTP2_PROTOCOL_ERROR, HTTP/2 müzakere eden bağlantılara özgüdür. Sadece HTTP/1.1 sunan bir site bu belirli hatayı üretemez, ancak kendi bağlantı sorunlarına sahip olabilir.

Şimdi kontrol edin

Ücretsiz kontrolü kendi sitenizde çalıştırın - hesap gerekmez.

HTTP check

Bunu sürekli izleyin

Bir sorun çıktığı anda haberdar olun: HostTracker 300’den fazla konumdan kontrol eder ve size e-posta, SMS, Slack, Telegram ve daha fazlasıyla bildirim gönderir.

HostTracker özellikleri

Bu bölümde daha fazlası: Düzeltin: insanların gerçekten karşılaştığı hatalar için rehberler