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

Apigee Edge belgelerini görüntülüyorsunuz.
. Git: Apigee X belgeleri.
bilgi

Belirti

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

Hata mesajı

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

HTTP/1.1 502 Bad Gateway

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

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

Olası Nedenler

Bu hata, Apigee'de kopyası olmasına izin verilmeyen belirli bir HTTP üstbilgisinde ortaya çıkar. Edge, tarafından gönderilen HTTP yanıtının bir parçası olarak aynı veya farklı değerlerle birden fazla kez görünür tekrar Apigee Edge'e bağlayabilirsiniz.

uyarınca RFC 7230, bölüm 3.2.2: Alan Sırası, bir gönderen birden çok üstbilgi OLUŞTURMAMALIDIR bir iletide aynı alan adına sahip alanları oluşturmadığı sürece, üstbilgi alanı virgülle ayrılmış bir liste olarak tanımlanır, [ör. #(values)] ya da başlık alanı bir iyi bilinen bir istisnadır. Apigee Edge aynı başlıkta bir şey bulursa şuna izin verilmez: tarafından gönderilen HTTP yanıtında birden fazla kez gönderilmişse hedef/arka uç sunucusu ardından 502 Bad Gateway ve hata koduyla yanıt verir protocol.http.DuplicateHeader

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ıt yinelenen başlıklar içeriyor. Edge Herkese Açık ve Private Cloud kullanıcıları

Sık kullanılan 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. Apigee Edge kullanıcı arayüzünde uygun role sahip olur.
  2. Sorunu incelemek istediğiniz kuruluşa geçin.

  3. Analiz > API İzleme > İnceleme sayfası.
  4. Hataları gözlemlediğiniz zaman aralığını seçin.
  5. Proxy filtresinin Tümü olarak ayarlandığından emin olun.
  6. Zaman ile Hata Kodu'nun grafiğini ç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 koduyla ilgili bilgiler aşağıda gösterildiği gibidir:

    (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 bulunduğu satırı genişletin.
  11. Günlükler penceresinde aşağıdaki ayrıntılara dikkat edin:

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

İzleme aracı

İzleme aracını kullanarak hatayı teşhis etmek için:

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

  3. Başarısız isteklerden birini seçin ve izini inceleyin.
  4. İzlemenin farklı aşamaları arasında gezinin ve hatanın nerede oluştuğunu bulun.
  5. Hatayı genellikle İstek gönderilen hedeften sonraki bir akışta bulabilirsiniz. sunucu aşamasını görebilirsiniz:

    (resmi büyüt)

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

    Yukarıdaki örnek iz, hatayı Duplicate Header "Expires" olarak gösteriyor. Başlangıç hata, istek arka uç sunucusuna gönderildikten sonra Apigee tarafından ortaya çıkıyorsa arka uç sunucusunun Expires üstbilgisini birden fazla kez gönderdiğini varsayalım.

  7. İzlemedeki AX (Analytics Verilerinin Kaydedilen) Aşamasına gidin ve tıklayın.
  8. Aşama Ayrıntıları - Yanıt Başlıkları bölümüne gidin ve X-Apigee-fault-code ve X-Apigee-fault-source değerlerini aşağıda görebilirsiniz:

    (resmi büyüt)

  9. X-Apigee-fault-code ve X-Apigee-fault-source değerlerini görürsünüz. protocol.http.DuplicateHeader ve target olarak görünür. Bu da bu hata, aynı web sitesi için arka uç sunucusu tarafından yinelenen başlıkların iletilmesinden yanıt başlığı Expires.
    Yanıt Başlıkları Değer
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source target
  10. Şunu kullanıp kullanmadığınızı kontrol edin: proxy zincirleme; diğer bir deyişle, hedef sunucu veya hedef uç nokta Apigee'de başka bir proxy'yi çağırıyordur.

    1. Bunu belirlemek için İstek hedefe gönderildi sunucu aşamasına geri dönün. Curl'ü Göster'i tıklayın.

    2. Hedef Sunucuya Gönderilen İsteğin Kısmı penceresi açılır. Buradan aşağıdaki işlemleri yapabilirsiniz: hedef sunucu ana makine takma adını belirler.

    3. Hedef sunucu ana makine takma adı, bir sanal ana makine takma adına işaret ediyorsa bu bir proxy zincirlemedir. Bu durumda, zincirli proxy için yukarıdaki adımların tümünü tekrarlamanız gerekene kadar 502 Bad Gateway hatasına gerçekte neyin neden olduğunu belirlersiniz.
    4. Hedef sunucu ana makine takma adı, arka uç sunucunuzu işaret ediyorsa arka uç sunucunuz Apigee'ye yanıt olarak yinelenen başlıkları gönderiyor demektir.

NGINX

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

  1. Private Cloud kullanıcısıysanız NGINX erişim günlüklerini kullanarak şunları yapabilirsiniz: HTTP 502 hatalarıyla ilgili önemli bilgileri belirler.
  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# şununla değiştirilir: gerçek değerler.

  3. Belirli bir sürede 502 hatası olup olmadığını görmek için arama yapın (sorun geçmişte oluşmuşsa) veya hâlâ başarısız olan bir istek varsa 502
  4. X-Apigee-fault-code'da 502 hatası bulursanız protocol.http.DuplicateHeader değeriyle eşleşir, sonra X-Apigee-fault-source.'un değerini belirleyin.

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

    NGINX Erişim günlüğünden alınan yukarıdaki örnek giriş, X- Apigee-fault-code ve X-Apigee-fault-source:

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

Neden: Yanıtta yinelenen Üstbilgi

Teşhis

  1. API kullanılarak gözlemlenen hatanın Hata Kodu ve Hata Kaynağı'nı belirleme Yaygın teşhis adımlarında açıklandığı şekilde izleme veya NGINX erişim günlükleri.
  2. Hata Kaynağı target değerine sahipse bu durum, yanıtın hedef sunucu tarafından gönderilen yinelenen başlıklar içeriyor.
  3. Yanıtın parçası olarak birden çok kez gönderilen üstbilgiyi belirleyebilirsiniz. aşağıdaki yöntemlerden birini kullanın:

    Hata mesajı

    Hata mesajını kullanarak:

    1. Apigee Edge'den alınan hata mesajının tamamına erişiminiz varsa Şuraya: faultstring. faultstring, SSCS'nin birden fazla kez gönderildi.

      Örnek hata mesajı:

      "faultstring":"Duplicate Header \"Expires\""
      
    2. Yukarıdaki hata iletisinde, Expires üstbilgisinin gönderildiğini görüyorsunuz daha fazla faultstring görebilirsiniz.

    Gerçek istek

    Gerçek isteği kullanarak:

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

      1. Hedef sunucuya bir çağrı yapı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 başlıkların listesini doğrulayın.

        Bu örnekte kullanılan hedef sunucudan alınan Ö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çok kez kontrol edilir. Bu nedenle, bu istek 502 Bad Gateway ile başarısız oluyor hatası ve hata kodu: protocol.http.DuplicateHeader.

      3. Adı faultstring içinde görünen üstbilgi birden fazla kez yanıtlayamazsa bu durumun nedeni budur hatası. Yukarıdaki durumda Expires başlığı birden fazla kez gönderilir.

Çözünürlük

Kopyayı düzeltin

1. Seçenek [Önerilen Seçenek] Arka uç sunucusunu yinelenen başlıklar içermeyecek şekilde düzeltin

  1. İlgili arka uç sunucusunun yinelenen başlık göndermesinin nedenini analiz etme Expires'yı tıklayın ve API proxy'lerinin bunu kabul etmesinin uygun olup olmadığını doğrulayın. İçinde çoğu durumda, HTTP spesifikasyonu uyarınca bu RFC7230.
  2. İstenmiyorsa hedef sunucu uygulamanızı yinelenen başlıklar göndermeyecek şekilde değiştirin. Yukarıda açıklanan örnekte Expires başlığının gönderildiği fark edilmiştir. 2 katına çıkar. Bu da istenen bir durumdur. Sorunu çözmek için hedef sunucunun Expires üstbilgisini yalnızca bir kez ilettiğini belirtir.
  3. İsterseniz ve yinelenen başlıklara izin vermek istiyorsanız 2. Seçenek: CwC özelliğini kullanma.

CwC

2. seçenek CwC özelliğini kullanma

Apigee, CwC mülkü sunar HTTPHeader.<HeaderName> sunucuların Apigee Edge'deki API proxy'lerine yinelenen üstbilgiler göndermesini sağlar.

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

Örneğin, yinelemelere izin vermek için Mesaj İşleyicilerde aşağıdaki özellik ayarlanabilir. ve Expires başlığı için birden fazla değer girilmelidir.

HTTPHeader.Expires=allowDuplicates, multiValued
  1. Private Cloud kullanıcısıysanız mülkü Apigee'nin İstek şunu içerse bile 502 Bad Gateway hatasının oluşmasını engeller yinelenen başlıkları kullanarak İleti işlemcilerini yinelenen üstbilgileri kullanacak şekilde yapılandırma "nasıl yapılır?" kılavuzu.
  2. Herkese Açık Bulut kullanıcısıysanız bu ayarı yapılandırmak için Apigee Edge Destek Ekibi ile iletişime geçin sahip olmanız gerekir.

Spesifikasyon

Apigee, 502 Bad Gateway hata yanıtıyla yanıt verirken arka uç sunucusu aşağıdaki RFC spesifikasyonlarına göre davranır:

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

Hâlâ Apigee Destek Ekibi'nden yardım almak istiyorsanız adresine gidin. Teşhis bilgileri toplanmalıdır.

Teşhis bilgileri toplanmalıdır

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

Herkese açık Cloud 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 tam hata mesajı gözlemlendi
  • 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# şununla değiştirilir: gerçek değerler.

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