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 502 Bad Gateway HTTP durum kodunu ve protocol.http.DuplicateHeader hata 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ğı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 Edge'de yinelenmesine izin verilmeyen belirli bir HTTP üstbilgisi, 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ürse oluşur.

RFC 7230, bölüm 3.2.2: Alan Sırasıuyarınca, bir gönderen, söz konusu üst bilgi alanının alan değerinin tamamı virgülle ayrılmış bir liste olarak tanımlanmadığı sürece bir iletide aynı alan adına sahip birden fazla üst bilgi alanı oluşturmamalıdır [ör. #(values)] veya başlık alanı iyi bilinen bir istisnadır. Apigee Edge, yinelenmesine izin verilmeyen belirli bir başlığın hedef/arka uç sunucusu tarafından gönderilen HTTP yanıtında birden fazla kez gönderildiğini tespit ederse 502 Bad Gateway ve hata kodu protocol.http.DuplicateHeader ile yanıt verir.

Bu hatanın olası nedenleri şunlardır:

Neden Açıklama Aşağıdaki ürünler için geçerli sorun giderme talimatları
Yanıt başlığında yinelenen başlık Arka uç sunucusundan gelen yanıtta yinelenen üstbilgiler var. Edge Public ve Private Cloud kullanıcıları

Sık karşılaşılan teşhis adımları

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

API Monitoring

API İzleme'yi kullanarak hatayı teşhis etmek için:

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

  3. Analyze > API Monitoring > Investigate (Analiz > API İzleme > İnceleme) 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 Kodunu Zaman ile karşılaştırın.
  7. Aşağıda gösterildiği gibi, hata kodunu protocol.http.DuplicateHeader içeren bir hücre seçin:

    (daha büyük resmi görüntüle)

  8. protocol.http.DuplicateHeader hata koduyla ilgili bilgiler aşağıda gösterildiği gibi görüntülenir:

    (daha büyük resmi görüntüle)

  9. Durum Kodunun 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 olan 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'dir. Bu, arka uç sunucusundan gelen yanıtta yinelenen üstbilgiler olduğunu gösterir.

İzleme aracı

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

  1. İzleme oturumunu etkinleştirin ve şunlardan birini yapın:
    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 etkinleştirildiğinden emin olun:

  3. Başarısız olan isteklerden birini seçip izlemeyi inceleyin.
  4. İzlemenin farklı aşamalarında gezinin ve hatanın nerede oluştuğunu bulun.
  5. Hatayı genellikle aşağıdaki örnekte gösterildiği gibi Request sent to target server (İstek hedef sunucuya gönderildi) aşamasından sonraki bir akışta bulabilirsiniz:

    (daha büyük resmi görüntüle)

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

    Yukarıdaki örnek izlemede hata Duplicate Header "Expires" olarak gösterilmektedir. Hata, istek arka uç sunucusuna gönderildikten sonra Apigee tarafından oluşturulduğundan arka uç sunucusunun Expires üstbilgisini birden fazla kez gönderdiği anlaşılır.

  7. İzleme işleminde AX (Analytics Verileri Kaydedildi) aşamasına gidin ve bu aşamayı tıklayın.
  8. Aşağı kaydırarak Phase Details - Response Headers (Aşama Ayrıntıları - Yanıt Başlıkları) bölümüne gidin ve aşağıdaki gibi X-Apigee-fault-code ve X-Apigee-fault-source değerlerini belirleyin:

    (daha büyük resmi görüntüle)

  9. X-Apigee-fault-code ve X-Apigee-fault-source değerlerini protocol.http.DuplicateHeader ve target olarak görürsünüz. Bu değerler, hatanın, arka uç sunucusu tarafından Expires yanıt başlığı için yinelenen üstbilgiler iletilmesinden 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ı kontrol edin. Hedef sunucu veya hedef uç nokta, Apigee'de başka bir proxy'yi çağırıyor olabilir.

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

    2. Hedef Sunucuya Gönderilen İstek İçin Curl penceresi açılır. Bu pencereden hedef sunucu ana makine diğer adını belirleyebilirsiniz.

    3. Hedef sunucu ana makine takma adı, sanal ana makine takma adına işaret ediyorsa bu, proxy zincirlemedir. Bu durumda, 502 Bad Gateway hatasına neyin neden olduğunu belirleyene kadar zincirleme proxy için yukarıdaki tüm adımları tekrarlamanız gerekir.
    4. Hedef sunucu ana makine takma adı arka uç sunucunuza işaret ediyorsa arka uç sunucunuzun, Apigee'ye yanıt olarak yinelenen başlıklar gönderdiği anlamına gelir.

NGINX

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

  1. Özel bulut kullanıcısıysanız HTTP 502 hatalarıyla ilgili temel 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

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

  3. Belirli bir süre boyunca 502 hataları olup olmadığını (sorun geçmişte yaşandıysa) veya 502 ile hâlâ başarısız olan istekler olup olmadığını kontrol edin.
  4. X-Apigee-fault-code değerinin protocol.http.DuplicateHeader değeriyle eşleştiği 502 hataları bulursanız X-Apigee-fault-source değerini belirleyin.

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

    NGINX erişim günlüğündeki yukarıdaki örnek girişte X- Apigee-fault-code ve X-Apigee-fault-source: için aşağıdaki değerler yer almaktadır:

    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 var.

Teşhis

  1. API izleme veya NGINX erişim günlükleri kullanılarak gözlemlenen hatanın Hata Kodunu ve Hata Kaynağını belirleyin. Bu işlem, Yaygın teşhis adımları bölümünde açıklanmıştır.
  2. Hata Kaynağı target değerine sahipse bu, hedef sunucu tarafından gönderilen yanıtta yinelenen üst bilgiler olduğunu 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 bölümüne bakın. faultstring, birden fazla kez gönderilen üstbilgi adını içeriyor.

      Örnek hata mesajı:

      "faultstring":"Duplicate Header \"Expires\""
    2. Yukarıdaki hata mesajında, Expires üstbilgisinin faultstring içinde görüldüğü gibi birden fazla kez gönderildiği görülmektedir.

    Gerçek istek

    Gerçek isteği kullanma:

    1. Hedef sunucuya yapılan gerçek isteğe erişiminiz yoksa curl komutunu İzleme aracını kullanma bölümündeki 10.a ve 10.b adımlarından 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 sunucuya çağrı yapın.

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

        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ıt içinde 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ığı birden fazla kez gönderiliyor. Bu nedenle, bu istek 502 Bad Gateway hatası ve protocol.http.DuplicateHeader hata koduyla başarısız olur.

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

Çözünürlük

Kopyalama sorununu düzeltme

1. seçenek [önerilen seçenek]: Arka uç sunucusunu, yinelenen başlıkları içermeyecek şekilde düzeltin

  1. Belirli bir arka uç sunucusunun üstbilgiyi neden iki kez gönderdiğini analiz edin Expires ve API proxy'lerinin bunu kabul etmesinin uygun olup olmadığını doğrulayın. Çoğu durumda, HTTP spesifikasyonu RFC7230 uyarınca bu durum istenmez.
  2. Bu durum istenmiyorsa hedef sunucu uygulamanızı, yinelenen başlıklar göndermeyecek şekilde değiştirin. Yukarıda bahsedilen örnekte, Expires başlığının aynı değerle iki kez gönderildiği görülmektedir. Bu durum istenmeyen bir durumdur. Hedef sunucunun Expires üstbilgisini yalnızca bir kez ilettiğinden emin olarak sorunu düzeltebilirsiniz.
  3. İsteniyorsa ve yinelenen üstbilgilere izin vermek istiyorsanız 2. seçenek: CwC mülkünü kullanma bölümüne 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 başlıklar göndermesine olanak tanıyan bir CwC özelliği HTTPHeader.<HeaderName> sunar.

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

Örneğin, aşağıdaki özellik, ileti işlemcilerinde ayarlanarak Expires başlığı için yinelenenlere ve birden fazla değere izin verilebilir.

HTTPHeader.Expires=allowDuplicates, multiValued
  1. Özel bulut kullanıcısıysanız, istekte yinelenen üstbilgiler olsa bile Apigee Edge'in 502 Bad Gateway hatası vermesini önlemek için mülkü yapılandırabilirsiniz. Bu işlem için Mesaj işlemcilerini yinelenen üstbilgileri kullanacak şekilde yapılandırma başlıklı nasıl yapılır kılavuzundan yararlanabilirsiniz.
  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 spesifikasyonlarına göre davranmasını beklediği için 502 Bad Gateway hata yanıtını verir:

Spesifikasyon
RFC 7230, bölüm 3.2.2: Alan Sırası
RFC 7230, bölüm 3.2: Başlık Alanları

Apigee Destek Ekibi'nden hâlâ yardıma ihtiyacınız varsa Teşhis bilgilerini toplama başlıklı makaleyi inceleyin.

Teşhis bilgilerini toplamalı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'si adı
  • 502 hatasını yeniden oluşturmak için kullanılan curl komutunun tamamı
  • API istekleri için izleme dosyası

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

  • Başarısız olan istekler için gözlemlenen hata mesajının tamamı
  • 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

    Nerede: ORG, ENV ve PORT# değerlerinin yerine gerçek değerler girilir.

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