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 messaging.adaptors.http.flow.DecompressionFailureAtResponse 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":"Decompression failure at response",
      "detail":{
         "errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"
      }
   }
}

Olası nedenler

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

  • Content-Encoding HTTP yanıtında (arka uç/hedef sunucudan) belirtilen kodlama geçerlidir ve Apigee Edge tarafından desteklenmektedir.
  • ANCAK

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

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

Aşağıda, desteklenen Content-Encoding değerlere ve Apigee Edge'in bu durumlarda yük gösteriminin 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 sayfasını inceleyin.

Tek Kodlama söndürme

Bu biçim, sıkıştırma sıkıştırması algoritmasıyla zlib yapısını kullanır.

Bkz. RFC1950 ve RFC1951.

Birden Çok Kodlama

Birden Çok Kodlama

Örneğin, kodlama iki kez yapıldığında şu olabilir:

  • gzip, sıkıştırma
  • gzip, gzip
  • deflate, gzip
  • havayı söndürme, azaltma
Başlıkta göründüğü sırada yüke birden fazla kodlama uygulanır.

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

Neden Açıklama Şunun 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 başlığında belirtilen kodlamayla eşleşmiyordur. 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 messaging.adaptors.http.flow.DecompressionFailureAtResponse hata koduna sahip bir hücre seçin:

    ( büyük resmi göster)

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

    ( büyük resmi göster)

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

    ( büyük resmi göster)

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

İzleme aracı

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

  1. İzleme oturumunu etkinleştirin ve aşağıdakilerden 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 işlemini yeniden oluşturun.
  2. Tüm FlowInfo'ları göster seçeneğinin etkin olduğundan emin olun:

  3. Başarısız yanıtlardan 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 Hedef sunucudan alınan yanıt aşamasından hemen sonraki bir akışta bulursunuz:

    ( büyük resmi göster)

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

    • İçerik Kodlaması: gzip
    • Yanıt İçeriği Gövdesi: {"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
  7. Hedef sunucudan yanıt alındı aşamasından hemen sonra hata aşamasına gidin:

    ( büyük resmi göster)

    Özelliklere dikkat 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ı belirtir. Bu, Apigee Edge'in yanıt yükünün Content-Encoding başlığında belirtildiği gibi (önceki adımda belirlenmiş) GZIP biçiminde olmasını beklediği anlamına gelir. Bu nedenle Apigee Edge, gzip kullanarak yükü açamaz ve Decompression failure at response hatasını döndürür.

    Bu durumda hedef/arka uç sunucusundan alınan 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. İzdeki Müşteriye Gönderilen Yanıt aşamasına gidin ve bunu tıklayın.

    ( büyük resmi göster)

    İzdeki 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. İzdeki AX (Analytics Verileri Kaydedilen) aşamasına gidin ve bunu tıklayın.

  10. Aşama Ayrıntıları ve Hata 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:

    ( büyük resmi göster)

  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 durum, 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. 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 herhangi bir 502 hatası olup olmadığını (sorun geçmişte gerçekleştiyse) veya 502 hatasıyla ilgili hâlâ başarısız olan yanıtlar olup olmadığını görmek için arama yapın.
  4. X-Apigee-fault-code ile messaging.adaptors.http.flow.DecompressionFailureAtResponse değeriyle eşleşen bir 502 hatası bulursanız X-Apigee-fault-source değerini belirleyin.

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

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

    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

Yanıt başlığı Content-Encoding hem geçerli hem de desteklenen bir kodlama içeriyorsa Apigee Edge varsayılan olarak yükü her zaman açar. Bu nedenle, yanıt yükünün biçiminin Content-Encoding yanıt başlığında belirtilen kodlamayla eşleşmesi beklenir. Uyuşmazlık varsa bu hatayı alırsınız.

Teşhis

  1. API Monitoring, İzleme aracı veya NGINX erişim günlüklerini kullanarak 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 Kodu messaging.adaptors.http.flow.DecompressionFailureAtResponse ve Hata Kaynağı target değerine sahipse bu durum, arka uç/hedef sunucu tarafından gönderilen yanıt yükünün biçiminin Content-Encoding yanıt başlığında belirtilen desteklenen kodlama ile eşleşmediğini gösterir.
  3. Uyuşmazlığı, aşağıdaki yöntemlerden birini kullanarak HTTP yanıtının bir parçası olarak 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 dokümanına bakın.

      Örnek hata mesajı:

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

    Trace

    Trace kullanarak doğrulamak için:

    1. Yaygın teşhis adımlarında açıklandığı şekilde, Trace kullanarak Content-Type ve error.cause değerlerini belirleyin.
    2. Örnek izdeki değerler aşağıdaki gibidir:

      • İçerik Kodlaması: gzip
      • error.cause: Not in GZIP format

      Yanıt başlığındaki Content-Encoding değeri, gzip şeklindedir ancak yanıt yükü GZIP biçiminde değildir (error.cause ile gösterilir). Bu nedenle Apigee Edge, 502 Bad Gateway ve messaging.adaptors.http.flow.DecompressionFailureAtResponse hata koduyla yanıt verir.

    Gerçek istek

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

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

    1. Herkese Açık Bulut/Private Cloud kullanıcısıysanız arka uç sunucusuna istek yapmanıza izin verilen başka bir makineden veya arka uç sunucunun kendisinden doğrudan arka uç sunucuya istek gönderin.
    2. Private Cloud kullanıcısıysanız Mesaj İşleyicilerinin birinden arka uç sunucusuna da istek gönderebilirsiniz.
    3. Arka uç sunucusu tarafından gönderilen yanıtı inceleyin ve Content-Encoding. yanıt başlığında iletilen değeri belirleyin
    4. İsteğin bir parçası olarak gönderilen yükün biçimini belirleyin.
    5. Content-Encoding üst bilgisinin değeri desteklenen kodlama listesindeyse ancak yanıt yükünün biçimi Content-Encoding başlığında belirtilen kodlamayla eşleşmiyorsa sorunun nedeni budur.

      Ö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 başlığına gönderir. Ancak, response_payload.zip zip dosyası olarak gönderilir. Bu nedenle, bu yanıt şu hata kodunu içeren bir 502 Bad Gateway hatasıyla başarısız olur: messaging.adaptors.http.flow.DecompressionFailureAtResponse.

    Mesaj İşleyici günlükleri

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

    Private Cloud kullanıcısıysanız HTTP 502 hatalarıyla ilgili önemli bilgileri belirlemek için Mesaj İşleyici günlüklerini kullanabilirsiniz.

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

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

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

      grep -ri "ZipException"
      
    3. system.log'da aşağıdakine benzer satırlar bulacaksınız:

      1. Senaryo

      1. Senaryo: API yanıtı Content-Encoding: gzip başlığına sahip 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ındaki java.util.zip.ZipException: Not in GZIP format satırı, Content-Encoding değerinin gzip olarak belirtilmesine rağmen yanıt yükünün GZIP biçiminde gönderilmediğini belirtir. Bu nedenle Apigee Edge bu durumu ortadan kaldırır ve istemci uygulamalarına messaging.adaptors.http.flow.DecompressionFailureAtResponse hata koduna sahip bir 502 durum kodu döndürür.

      2. Senaryo

      2. Senaryo: API yanıtında Content-Encoding: deflate başlığı 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ındaki 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 bu durumu bir kenara koyar ve istemci uygulamalarına messaging.adaptors.http.flow.DecompressionFailureAtResponse hata koduna sahip 502 durum kodu döndürür.

Çözünürlük

  1. Apigee Edge'deki ve arka uç sunucusundaki API proxy akışında sıkıştırılmış yanıt yüküne gerek yoksa Content-Encoding başlığını iletin. Yanıt yükünü sıkıştırmanız 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ğıdaki bilgileri gönderdiğinden emin olun:
    • Yanıttaki Content-Encoding üst bilgisi değeri olarak desteklenen kodlamalardan herhangi biri
    • Apigee Edge'e desteklenen biçimdeki yanıt yükü, Content-Encoding başlığında belirtilen kodlama biçimiyle eşleşir.
  3. Yukarıda açıklanan örnekte, yanıt yükü ZIP biçimindedir ancak yanıt başlığı Content-Encoding: gzip değerini belirtir. Yanıt başlığını Content-Encoding: gzip ve yanıt yükünü 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 özelliklerine göre messaging.adaptors.http.flow.DecompressionFailureAtResponse hata koduyla 502 Bad Gateway durum koduyla yanıt verir:

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

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

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

  • Başarısız yanıtlar için gözlemlenen tam hata mesajı
  • 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

    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