502 Hatalı Ağ Geçidi - Yinelenen Başlık

Apigee Edge belgelerini görüntülüyorsunuz.
Apigee X belgelerine gidin.
bilgi

Belirti

İstemci uygulaması, API çağrılarına yanıt olarak protocol.http.DuplicateHeader hata koduyla birlikte 502 Bad Gateway HTTP durum kodunu alır.

Hata mesajı

İstemci uygulaması aşağıdaki yanıt kodunu alır:

HTTP/1.1 502 Bad Gateway

Ayrıca aşağıdakine benzer bir hata mesajı da görebilirsiniz:

{
   "fault":{
      "faultstring":"Duplicate Header \"Expires\"",
      "detail":{
         "errorcode":"protocol.http.DuplicateHeader"
      }
   }
}

Olası Nedenler

Bu hata, Apigee Edge'de yinelenmesine izin verilmeyen belirli bir HTTP üst bilgisi, arka uç sunucusu tarafından Apigee Edge'e gönderilen HTTP yanıtının bir parçası olarak aynı veya farklı değerlerle birden fazla kez görünüyorsa ortaya çıkar.

RFC 7230, bölüm 3.2.2: Alan Sırası'na göre, bir gönderen, bir iletide aynı alan adına sahip birden fazla üstbilgi alanı OLUŞTURMAMALIDIR.Bu alanlardan biri, söz konusu üstbilgi alanının tüm alan değerinin virgülle ayrılmış bir liste olarak tanımlanmadığı ([ör. #(values)] veya başlık alanı iyi bilinen bir istisnadır. Apigee Edge, yinelenen olmasına izin verilmeyen belirli bir üst bilginin hedef/arka uç sunucusu tarafından gönderilen HTTP yanıtında birden fazla kez gönderildiğini tespit ederse 502 Bad Gateway ve protocol.http.DuplicateHeader hata koduyla yanıt verir.

Bu hatanın olası nedenleri aşağıda açıklanmıştır:

Neden Açıklama Şunun için geçerli sorun giderme talimatları:
Yanıtta yinelenen başlık Arka uç sunucusundan alınan yanıtta yinelenen başlıklar var. Edge Herkese Açık ve Özel Bulut kullanıcıları

Yaygın teşhis adımları

Bu hatayı teşhis etmek için aşağıdaki araçlardan/tekniklerden birini kullanın:

API Monitoring

API Monitoring'i kullanarak hatayı teşhis etmek için:

  1. Uygun role sahip bir kullanıcı olarak Apigee Edge kullanıcı arayüzünde oturum açın.
  2. Sorunu incelemek istediğiniz kuruluşa geçin.

  3. Analiz > API İzleme > Araştır sayfasına gidin.
  4. Hataları gözlemlediğiniz belirli zaman aralığını seçin.
  5. Proxy filtresinin Tümü olarak ayarlandığından emin olun.
  6. Hata Kodu'nu Zamana göre çizin.
  7. Aşağıda gösterildiği gibi protocol.http.DuplicateHeader hata koduna sahip bir hücre seçin:

    (resmi büyüt)

  8. protocol.http.DuplicateHeader hata kodu ile ilgili bilgi aşağıdaki gibi gösterilmektedir:

    (resmi büyüt)

  9. Durum Kodu'nun yukarıdaki örnekte gösterildiği gibi 502 olduğundan emin olun.
  10. Günlükleri görüntüle'yi tıklayın ve başarısız isteğin satırını genişletin.
  11. Günlükler penceresinde aşağıdaki ayrıntıları not edin:

    • Durum Kodu: 502
    • Hata Kaynağı: target
    • Hata Kodu: protocol.http.DuplicateHeader.
  12. Hata Kaynağı target olup arka uç sunucusundan gelen yanıtın yinelenen üstbilgiler içerdiğini gösterir.

İzleme aracı

Hatayı İzle aracını kullanarak teşhis etmek için:

  1. İzleme oturumunu ve aşağıdakilerden birini etkinleştirin:
    1. 502 Bad Gateway hatasının oluşmasını bekleyin veya
    2. Sorunu yeniden oluşturabiliyorsanız API çağrısı yapın ve 502 Bad Gateway hatasını yeniden oluşturun
  2. Tüm Akış Bilgilerini Göster'in etkin olduğundan emin olun:

  3. Başarısız isteklerden birini seçip izi inceleyin.
  4. İzin farklı aşamaları arasında gezinin ve hatanın nerede gerçekleştiğini bulun.
  5. Hatayı genellikle aşağıda gösterildiği gibi İstek hedef sunucuya gönderildi aşamasından sonraki bir akışta bulabilirsiniz:

    (resmi büyüt)

  6. İzdeki hatanın değerini not edin.

    Yukarıdaki örnek izde hata Duplicate Header "Expires" olarak gösterilmektedir. Hata, istek arka uç sunucusuna gönderildikten sonra Apigee tarafından bildirildiğinden, arka uç sunucusunun Expires üst bilgisini birden fazla kez gönderdiğini belirtir.

  7. İzdeki AX (Analytics Verileri Kaydedilen) Aşaması'na gidin ve onu tıklayın.
  8. Aşama Ayrıntıları - Yanıt Başlıkları bölümüne ilerleyin ve X-Apigee-fault-code ile X-Apigee-fault-source değerlerini aşağıda gösterildiği gibi belirleyin:

    (resmi büyüt)

  9. X-Apigee-fault-code ve X-Apigee-fault-source değerlerini protocol.http.DuplicateHeader ve target olarak görürsünüz. Bu durum, bu hatanın arka uç sunucu tarafından Expires yanıt başlığı için yinelenen üst bilgiler geçirilmesinden kaynaklandığını gösterir.
    Yanıt Başlıkları Değer
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source target
  10. Proxy zincirleme kullanıp kullanmadığınızı, yani hedef sunucunun veya hedef uç noktanın Apigee'de başka bir proxy çağırıp çağırmadığını kontrol edin.

    1. Bunu belirlemek için İstek hedefe gönderildi sunucusu aşamasına geri dönün. Show Curl (Curl'yi Göster) seçeneğini tıklayın.

    2. Hedef sunucu ana makine takma adını belirleyebileceğiniz Curl for Request to Target Server (Hedef Sunucuya Gönderilen İstek İçin Curl) penceresi açılır.

    3. Hedef sunucu ana makine takma adı bir sanal ana makine takma adına işaret ediyorsa bu, proxy zincirlemedir. Bu durumda, 502 Bad Gateway hatasının aslında neyin neden olduğunu belirleyene kadar zincirleme proxy için yukarıdaki adımların tümünü tekrarlamanız gerekir.
    4. Hedef sunucu ana makine takma adı, arka uç sunucunuzu işaret ediyorsa arka uç sunucunuzun Apigee'ye yanıt olarak yinelenen üst bilgiler gönderdiğini gösterir.

NGINX

NGINX erişim günlüklerini kullanarak hatayı teşhis etmek için:

  1. Private Cloud kullanıcısıysanız HTTP 502 hatalarıyla ilgili önemli bilgileri belirlemek için NGINX erişim günlüklerini kullanabilirsiniz.
  2. NGINX erişim günlüklerini kontrol edin:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Yer: ORG, ENV ve PORT# gerçek değerlerle değiştirilir.

  3. Belirli bir süre boyunca 502 hatası olup olmadığını (sorun geçmişte olduysa) veya 502 nedeniyle başarısız olan isteklerin olup olmadığını görmek için arama yapın.
  4. X-Apigee-fault-code değeriyle eşleşen X-Apigee-fault-code özelliğinde 502 hatası bulursanız X-Apigee-fault-code değerinin değerini belirleyin.

    NGINX erişim günlüğünden örnek 502 hatası:

    NGINX Erişim günlüğündeki yukarıdaki örnek giriş, X- Apigee-fault-code ve X-Apigee-fault-source için aşağıdaki değerlere sahiptir:

    Yanıt Başlıkları Değer
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source target

Neden: Yanıtta yinelenen başlık

Teşhis

  1. API Monitoring veya NGINX erişim günlükleri kullanılarak gözlemlenen hata için Yaygın teşhis adımları bölümünde açıklandığı şekilde Hata Kodu ve Hata Kaynağı'nı belirleyin.
  2. Hata Kaynağı'nda target değeri varsa bu, hedef sunucu tarafından gönderilen yanıtın yinelenen başlıklar içerdiğini gösterir.
  3. Aşağıdaki yöntemlerden birini kullanarak yanıtın bir parçası olarak birden fazla kez gönderilen gerçek başlığı belirleyebilirsiniz:

    Hata mesajı

    Hata mesajını kullanma:

    1. Apigee Edge'den alınan hata mesajının tamamına erişiminiz varsa faultstring dokümanına bakın. faultstring, birden fazla kez gönderilen üst bilgi adını içerir.

      Örnek hata mesajı:

      "faultstring":"Duplicate Header \"Expires\""
      
    2. Yukarıdaki hata mesajında, Expires üst bilgisinin faultstring öğesinde olduğu gibi birden fazla kez gönderildiğini görebilirsiniz.

    Gerçek istek

    Asıl isteği kullanarak:

    1. Hedef sunucuya yapılan asıl isteğe erişiminiz yoksa İzleme aracını kullanma adımı 10.a ve 10.b adımlarından ilgili curl komutunu alın.
    2. Hedef sunucu uygulamasına yapılan gerçek isteğe erişiminiz varsa aşağıdaki adımları uygulayın:

      1. Hedef sunucuyu arayın.

        Bu örnekte kullanılan hedef sunucu için örnek İstek:

        curl -X GET "https://BACKEND_SERVER_HOST/response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT" -v
        
      2. Yanıtta görünen üstbilgilerin listesini doğrulayın.

        Bu örnekte kullanılan hedef sunucudan Örnek Yanıt:

        * ...Trimmed...
        > GET /response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT HTTP/2
        > Host: BACKEND_SERVER_HOST
        > User-Agent: curl/7.64.1
        > Accept: */*
        >
        * Connection state changed (MAX_CONCURRENT_STREAMS == 128)!
        < HTTP/2 200
        < date: Fri, 02 Jul 2021 05:29:07 GMT
        < content-type: application/json
        < content-length: 166
        < server: gunicorn/19.9.0
        < Expires: Mon, 21 June 2021 07:28:00 GMT
        < Expires: Mon, 21 June 2021 07:28:00 GMT
        < access-control-allow-origin: *
        < access-control-allow-credentials: true
        <
        ----<Response BODY>------
        * Connection #0 to host httpbin.org left intact
        * Closing connection 0
        

        Yukarıdaki örnek istekte, Expires başlığı bir kereden fazla gönderilmiştir. Bu nedenle, bu istek 502 Bad Gateway hatası ve şu hata koduyla başarısız olur: protocol.http.DuplicateHeader.

      3. faultstring içinde adı görünen üst bilgi, arka uç sunucusunun yanıtında birden fazla kez görünüyorsa bu hatanın nedeni budur. Yukarıdaki örnekte, Expires başlığı bir kereden fazla gönderilir.

Çözünürlük

Yinelemeyi düzelt

1. Seçenek [Önerilen Seçenek] Arka uç sunucuyu, yinelenen başlıklar eklemeyecek şekilde düzeltin

  1. İlgili arka uç sunucusunun, yinelenen Expires üst bilgisi gönderme nedenini analiz edin ve API proxy'lerinin bunu kabul etmesinin uygun olup olmadığını doğrulayın. Çoğu durumda, RFC7230 HTTP spesifikasyonuna göre bu istenmeyen bir durum değildir.
  2. İstenirse, hedef sunucu uygulamanızı yinelenen başlıklar göndermeyecek şekilde değiştirin. Yukarıda açıklanan örnekte, Expires başlığının aynı değerle iki kez gönderildiği fark edilmiştir. Bu durum istenmeyen bir durumdur. Hedef sunucunun Expires üst bilgisini yalnızca bir kez ilettiğinden emin olarak sorunu düzeltebilirsiniz.
  3. Bunu tercih ediyorsanız ve yinelenen başlıklara izin vermek istiyorsanız 2. Seçenek'e (CwC mülkü kullanarak) gidin.

CwC

2. Seçenek: CwC mülkünü kullanma

Apigee ,istemci uygulamalarının ve hedef sunucuların Apigee Edge'deki API proxy'lerine yinelenen üstbilgiler göndermesini sağlayan bir CwC özelliği HTTPHeader.<HeaderName> sunar.

CwC mülkü Değerler
HTTPHeader.<HeaderName> allowDuplicates,multivalued

Örneğin, Mesaj İşleyicilerinde aşağıdaki özellik, Expires üstbilgisi için yinelenenlere ve birden çok değere izin verecek şekilde ayarlanabilir.

HTTPHeader.Expires=allowDuplicates, multiValued
  1. Private Cloud kullanıcısıysanız mülkü, İleti İşleyicileri yinelenen üstbilgiler kullanacak şekilde yapılandırma "Nasıl Yapılır?" kılavuzunda, yinelenen üstbilgiler içerse bile Apigee Edge'in 502 Bad Gateway hatası vermesini önleyecek şekilde yapılandırabilirsiniz.
  2. Herkese Açık Bulut kullanıcısıysanız bu özelliği kuruluşunuz için yapılandırmak üzere Apigee Edge Destek Ekibi ile iletişime geçin.

Spesifikasyon

Apigee, arka uç sunucusunun aşağıdaki RFC özelliklerine göre davranmasını beklediği için 502 Bad Gateway hata yanıtıyla yanıt verir:

Spesifikasyon
RFC 7230, bölüm 3.2.2: Alan Sırası
RFC 7230, bölüm 3.2: Üstbilgi Alanları

Apigee Desteği'nden hâlâ yardıma ihtiyacınız varsa Teşhis bilgilerini toplamalısınız başlıklı makaleyi inceleyin.

Teşhis bilgileri toplanmalıdır

Aşağıdaki teşhis bilgilerini toplayın ve ardından Apigee Edge Destek Ekibi ile iletişime geçin.

Herkese Açık Bulut kullanıcısıysanız aşağıdaki bilgileri sağlayın:

  • Kuruluş adı
  • Ortam adı
  • API Proxy adı
  • 502 hatasını yeniden oluşturmak için kullanılan curl komutunu tamamlayın
  • API istekleri için izleme dosyası

Private Cloud kullanıcısıysanız aşağıdaki bilgileri sağlayın:

  • Başarısız istekler için gözlemlenen tam hata mesajı
  • Ortam adı
  • API proxy paketi
  • API istekleri için izleme dosyası
  • NGINX erişim günlükleri:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Yer: ORG, ENV ve PORT# gerçek değerlerle değiştirilir.

  • Mesaj İşleyici sistem günlükleri /opt/apigee/var/log/edge-message-processor/logs/system.log