502 Hatalı Ağ Geçidi - DecompressionFailureAtResponse

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 hata koduyla birlikte messaging.adaptors.http.flow.DecompressionFailureAtResponse 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ğıda gösterilene benzer bir hata mesajı da görebilirsiniz:

{
   "fault":{
      "faultstring":"Decompression failure at response",
      "detail":{
         "errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"
      }
   }
}

Olası nedenler

Bu hata yalnızca aşağıdaki durumlarda oluşur:

  • HTTP yanıtı (arka uç/hedef sunucudan) başlığında belirtilen kodlama Content-Encoding geçerlidir ve Apigee Edge tarafından desteklenir.
  • BUT

  • Arka uç/hedef sunucu tarafından HTTP yanıtının bir parçası olarak gönderilen yük biçimi, Content-Encoding başlığında belirtilen kodlama biçimiyle eşleşmiyor.

Bunun nedeni, yükün biçimi Content-Encoding üstbilgisinde belirtilen kodlamayla aynı biçimde olmadığından Apigee Edge'in yükü belirtilen kodlamayı kullanarak çözememesidir.

Aşağıda, desteklenen Content-Encoding değerlerine ve Apigee Edge'in bu durumlarda yük temsilinin nasıl olmasını beklediğine dair birkaç örnek verilmiştir:

Senaryo İçerik-Kodlaması Yük gösterimi
Tek Kodlama gzip

Unix gzip biçimi.

RFC1952 GZIP Biçimi'ni inceleyin.

Tek Kodlama sıkıştırma

Bu biçimde, deflate sıkıştırma algoritmasıyla zlib yapısı kullanılır.

RFC1950 ve RFC1951'e bakın..

Birden fazla kodlama

Birden fazla kodlama

Örneğin, kodlamanın iki kez yapıldığı durumlarda bu hata şöyle görünebilir:

  • gzip, deflate
  • gzip, gzip
  • deflate, gzip
  • deflate, deflate
Üstbilgide göründüğü sırayla yük için birden fazla kodlama uygulanır.

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

Neden Açıklama Aşağıdaki ürünler için geçerli sorun giderme talimatları
Yanıt yükü biçimi, Content-Encoding ile eşleşmiyor Arka uç/hedef sunucu tarafından gönderilen yanıt yükünün biçimi kodlanmamıştır veya Content-Encoding üstbilgisinde belirtilen kodlamayla eşleşmemektedir. 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çın.
  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 kodu messaging.adaptors.http.flow.DecompressionFailureAtResponse olan bir hücre seçin:

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

  8. Hata kodu messaging.adaptors.http.flow.DecompressionFailureAtResponse ile ilgili bilgiler aşağıda gösterildiği gibi görüntülenir:

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

  9. Günlükleri göster'i tıklayın ve 502 hatasıyla başarısız olan satırı genişletin.

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

  10. Günlükler penceresinde aşağıdaki ayrıntıları not edin:
    • Durum Kodu: 502
    • Hata Kaynağı: target
    • Hata Kodu: messaging.adaptors.http.flow.DecompressionFailureAtResponse.
  11. Hata Kaynağı target değerine sahipse bu, yanıt yükü biçiminin arka uç sunucusunun yanıt başlığında belirtilen desteklenen kodlamayla eşleşmediğini gösterir Content-Encoding.

İzleme aracı

İzleme aracını kullanarak hatayı 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ını yapın ve sorunu yeniden oluşturun 502 Bad Gateway.
  2. Tüm FlowInfo'ları göster'in etkinleştirildiğinden emin olun:

  3. Başarısız olan yanıtlardan 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 Hedef sunucudan yanıt alındı aşamasından hemen sonraki akışta görürsünüz:

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

  6. İzdeki özelliklerin değerlerini not edin:

    • Content-Encoding: gzip
    • Yanıt İçeriği Metni: {"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
  7. Response Received from target server (Hedef sunucudan yanıt alındı) aşamasından hemen sonraki hata aşamasına gidin:

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

    Özellikleri not edin:

    • hata: Decompression failure at response
    • error.class: com.apigee.errors.http.server.BadGateway
    • error.cause: Not in GZIP format

      error.cause, yanıt yükünün GZIP biçiminde olmadığını belirtiyor. Bu, Apigee Edge'in yanıt yükünün Content-Encoding üstbilgisinde (önceki adımda belirlenmiştir) belirtildiği gibi GZIP biçiminde olmasını beklediği anlamına gelir. Bu nedenle, Apigee Edge yükü gzip kullanarak sıkıştırmayı açamaz ve Decompression failure at response hatasını döndürür.

    Bu durumda hedef/arka uç sunucusundan gelen yanıtın 200 olduğunu unutmayın. Ancak hata Apigee Edge tarafından döndürüldüğünden istemci uygulaması 502 yanıtı alır.

  8. İzleme işleminde Response Sent to Client (İstemciye Yanıt Gönderildi) aşamasına gidin ve bu aşamayı tıklayın.

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

    İzlemeyle ilgili aşağıdaki ayrıntıları not edin:

    • Durum kodu: 502 Bad Gateway.
    • Hata İçeriği: {"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
  9. İzleme işleminde AX (Analytics Verileri Kaydedildi) aşamasına gidin ve bu aşamayı tıklayın.

  10. Aşağı kaydırarak Aşama Ayrıntıları, Hata 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)

  11. X-Apigee-fault-code ve X-Apigee-fault-source değerlerini messaging.adaptors.http.flow.DecompressionFailureAtResponse ve target olarak görürsünüz. Bu, yanıt yükü biçiminin Content-Encoding başlığında belirtilen kodlamayla eşleşmediğini gösterir.
    Yanıt başlıkları Değer
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponse
    X-Apigee-fault-source target

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 içinde 502 hatası olup olmadığını (sorun geçmişte yaşandıysa) veya 502 ile hâlâ başarısız olan yanıtlar olup olmadığını görmek için arama yapın.
  4. 502 hataları bulursanız ve X-Apigee-fault-code, messaging.adaptors.http.flow.DecompressionFailureAtResponse değeriyle eşleşiyorsa 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 messaging.adaptors.http.flow.DecompressionFailureAtResponse
    X-Apigee-fault-source target

Neden: Yanıt yükü biçimi, Content-Encoding ile eşleşmiyor

Varsayılan olarak, yanıt başlığı Content-Encoding geçerli ve desteklenen bir kodlama içeriyorsa Apigee Edge, yükü her zaman sıkıştırır. Bu nedenle, yanıt yükünün biçiminin, yanıt başlığında Content-Encoding belirtilen kodlamayla eşleşmesi beklenir. Bir uyuşmazlık varsa bu hatayı alırsınız.

Teşhis

  1. Genel teşhis adımlarında açıklandığı gibi API izleme, izleme aracı veya NGINX erişim günlükleri kullanılarak gözlemlenen hatanın Hata Kodunu ve Hata Kaynağını belirleyin.
  2. Hata Kodu messaging.adaptors.http.flow.DecompressionFailureAtResponse ise ve Hata Kaynağı target değerine sahipse bu, arka uç/hedef sunucu tarafından gönderilen yanıt yükünün biçiminin, yanıt başlığında Content-Encoding belirtilen desteklenen kodlamayla eşleşmediğini gösterir.
  3. Aşağıdaki yöntemlerden birini kullanarak HTTP yanıtının bir parçası olarak uyuşmazlığı belirleyebilirsiniz:

    Hata mesajı

    Hata mesajını kullanarak doğrulamak için:

    1. Apigee Edge'den alınan hata mesajının tamamına erişiminiz varsa faultstring bölümüne bakın.

      Örnek hata mesajı:

      "faultstring":"Decompression failure at response"
    2. Yukarıdaki hata mesajında, "Decompression failure at response" gösteriliyor. Bu, yanıtın, Content-Encoding başlığında belirtilen kodlama kullanılarak sıkıştırılamadığı anlamına geliyor.

    Trace

    Trace'i kullanarak doğrulamak için:

    1. Content-Type ve error.cause değerlerini Yaygın teşhis adımları bölümünde açıklandığı gibi Trace kullanarak belirleyin.
    2. Örnek izlemedeki değerler şunlardır:

      • Content-Encoding: gzip
      • error.cause: Not in GZIP format

      Yanıt başlığındaki Content-Encoding değeri gzip; ancak yanıt yükü GZIP biçiminde değil (error.cause ile belirtildiği gibi). Bu nedenle, Apigee Edge 502 Bad Gateway ve hata kodu messaging.adaptors.http.flow.DecompressionFailureAtResponse ile yanıt verir.

    Gerçek istek

    Gerçek isteği kullanarak doğrulamak için:

    Hedef/arka uç sunucu uygulamasına yapılan gerçek isteğe erişiminiz varsa aşağıdaki adımları uygulayın:

    1. Herkese açık bulut/özel bulut kullanıcısıysanız, arka uç sunucusundan veya arka uç sunucusuna istekte bulunmanıza izin verilen başka bir makineden doğrudan arka uç sunucusuna istekte bulunun.
    2. Özel bulut kullanıcısıysanız isteği Mesaj İşleyicilerden birinden arka uç sunucusuna da gönderebilirsiniz.
    3. Arka uç sunucusu tarafından gönderilen yanıtı inceleyin ve yanıt başlığında Content-Encoding. ile iletilen değeri belirleyin.
    4. İsteğin bir parçası olarak gönderilen yükün biçimini belirleyin.
    5. Content-Encoding başlığının değeri, desteklenen kodlama listesinde yer alıyorsa ancak yanıt yükünün biçimi Content-Encoding başlığında belirtilen kodlamayla eşleşmiyorsa sorun bundan kaynaklanıyordur.

      Örnek:

      curl -v https://HOSTALIAS/test
      

      ***trimmed***
      >
      < HTTP/1.1 200 OK
      < Accept-Ranges: bytes
      < Content-Encoding: gzip
      < Date: Mon, 02 Aug 2021 08:17:35 GMT
      < Transfer-Encoding: chunked
      <
      < response_payload.zip Response Body(not in GZIP format)>
      

      Yukarıdaki örnek yanıt, gzip değerini Apigee Edge'de desteklenen bir kodlama olan Content-Encoding üst bilgisine gönderir. Ancak, response_payload.zip zip dosyası olarak gönderilir. Bu nedenle, bu yanıt 502 Bad Gateway hatasıyla ve messaging.adaptors.http.flow.DecompressionFailureAtResponse hata koduyla başarısız oluyor.

    Mesaj işleyici günlükleri

    Mesaj İşleyici günlüklerini kullanarak doğrulamak için:

    Özel bulut kullanıcısıysanız HTTP 502 hatalarıyla ilgili temel bilgileri belirlemek için Mesaj İşleyici günlüklerini kullanabilirsiniz.

    1. Mesaj İşleyici günlüğünü kontrol edin:

      /opt/apigee/var/log/edge-message-processor/logs/system.log

    2. Belirli bir süre içinde (sorun geçmişte yaşandıysa) 502 hatası olup olmadığını veya 502 ile hâlâ başarısız olan yanıtlar olup olmadığını görmek için arama yapın. Aşağıdaki arama dizesini kullanabilirsiniz:

      grep -ri "ZipException"
      
    3. system.log dosyasında aşağıdakine benzer satırlar görürsünüz:

      1. senaryo

      1. senaryo: API yanıtında Content-Encoding: gzip başlığı olduğunda

      2021-08-02 06:50:25,433  NIOThread@2 ERROR HTTP.CLIENT -
      HTTPClient$Context.onInputException() :  ClientInputChannel(ClientChannel[Connected:
      Remote:3.8.1.1:9000 Local:10.0.115.32:41298]@38140 useCount=1 bytesRead=0
      bytesWritten=203 age=469ms  lastIO=0ms  isOpen=true).onExceptionRead exception: {}
      java.util.zip.ZipException: Not in GZIP format
      ---trimmed--
      2021-08-02 06:50:25,433  NIOThread@2 INFO  HTTP.CLIENT -
      HTTPClient$Context.logContextDetails() : Request details : host=null
      path=/folder/testFile method=GET. Channel details : Bytes read=0
      2021-08-02 06:50:25,434  NIOThread@2 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError(HTTPResponse@4806fdab, Not in GZIP format)
      2021-08-02 06:50:25,434  NIOThread@2 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception
      java.util.zip.ZipException: Not in GZIP format
      occurred while writing to channel null
      2021-08-02 06:50:25,434  NIOThread@2 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception trace:
      java.util.zip.ZipException: Not in GZIP format
      

      Yukarıdaki hata mesajında java.util.zip.ZipException: Not in GZIP format satırı, Content-Encoding gzip olarak belirtilmesine rağmen yanıt yükünün GZIP biçiminde gönderilmediğini gösterir. Bu nedenle, Apigee Edge istisna oluşturur ve istemci uygulamalarına 502 durum koduyla birlikte messaging.adaptors.http.flow.DecompressionFailureAtResponse hata kodunu döndürür.

      2. senaryo

      2. senaryo: API yanıtında Content-Encoding: deflate üstbilgisi olduğunda

      2021-08-02 06:35:21,215  NIOThread@0 ERROR HTTP.CLIENT -
      HTTPClient$Context.onInputException() :  ClientInputChannel(ClientChannel[Connected:
      Remote:3.8.1.1:9000 Local:192.168.194.140:35224]@36014 useCount=1 bytesRead=0
      bytesWritten=202 age=439ms  lastIO=2ms  isOpen=true).onExceptionRead exception: {}
      java.util.zip.ZipException: incorrect header check
      ---trimmed----
      Caused by:
      java.util.zip.DataFormatException: incorrect header check
      ---trimmed---
      2021-08-02 06:35:21,215  NIOThread@0 INFO  HTTP.CLIENT -
      HTTPClient$Context.logContextDetails() : Request details :
      host=null path=/folder/testFile method=GET. Channel details : Bytes read=0
      2021-08-02 06:35:21,216  NIOThread@0 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError(HTTPResponse@3966e277,
      incorrect header check)
      2021-08-02 06:35:21,216  NIOThread@0 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception
      java.util.zip.ZipException: incorrect header check occurred while writing to channel null
      2021-08-02 06:35:21,217  NIOThread@0 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception trace:
      java.util.zip.ZipException: incorrect header check
      
      

      Yukarıdaki hata mesajında yer alan java.util.zip.ZipException: incorrect header check ve Caused by: java.util.zip.DataFormatException: incorrect header check satırları, yanıt yükünün deflate biçiminde gönderilmediğini ve deflate'in Content-Encoding başlığında belirtilen kodlamayla eşleşmediğini gösterir. Bu nedenle, Apigee Edge istisna oluşturur ve istemci uygulamalarına 502 durum koduyla birlikte messaging.adaptors.http.flow.DecompressionFailureAtResponse hata kodunu döndürür.

Çözünürlük

  1. Apigee Edge'deki API proxy akışında ve arka uç sunucusunda sıkıştırılmış yanıt yüküne gerek yoksa Content-Encoding üst bilgisini geçirmeyin. Yanıt yükünün sıkıştırılması gerekiyorsa 2. adıma gidin.
  2. Yanıt yükünün sıkıştırılması gerekiyorsa arka uç sunucusunun her zaman aşağıdakileri gönderdiğinden emin olun:
    • Yanıtın Content-Encoding üst bilgisinin değeri olarak desteklenen kodlamalardan herhangi biri
    • Apigee Edge'e gönderilen, desteklenen biçimdeki yanıt yükü, Content-Encoding üstbilgisinde belirtilen kodlama biçimiyle eşleşir.
  3. Yukarıda bahsedilen örnekte, yanıt yükü ZIP biçimindedir ancak yanıt başlığı Content-Encoding: gzip olarak belirtilir. Yanıt üstbilgisini Content-Encoding: gzip, yanıt yükünü ise gzip biçiminde göndererek sorunu düzeltebilirsiniz:
    curl -v https://HOSTALIAS/v1/test
    
    >
    < HTTP/1.1 200 OK
    < Accept-Ranges: bytes
    < Content-Encoding: gzip
    < Date: Mon, 02 Aug 2021 08:17:35 GMT
    < Transfer-Encoding: chunked
    <
    < response_payload.gz Response Body(in GZIP format)>
    

Spesifikasyon

Apigee Edge, aşağıdaki RFC spesifikasyonlarına göre 502 Bad Gateway durum koduyla ve messaging.adaptors.http.flow.DecompressionFailureAtResponse hata koduyla yanıt verir:

Spesifikasyon
RFC 7231, bölüm 6.5.1
RFC 7231, bölüm 3.1.2.2

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 yanıtları için izleme dosyası

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

  • Başarısız olan yanıtlarda gözlemlenen hata mesajının tamamı
  • Ortam adı
  • API proxy paketi
  • API yanıtları 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# gerçek değerlerle değiştirilir.

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