502 Bozuk Ağ Geçidi - TooBigBody

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.TooBigBody 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ğıdaki hata mesajını da görebilirsiniz:

{
   "fault":{
      "faultstring":"Body buffer overflow",
      "detail":{
         "errorcode":"protocol.http.TooBigBody"
      }
   }
}

Olası nedenler

Bu hata, hedef/arka uç sunucusu tarafından HTTP yanıtının bir parçası olarak Apigee Edge'e gönderilen yük boyutu Apigee Edge'de izin verilen sınırdan büyükse ortaya çıkar.

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

Neden Açıklama Şunun için geçerli sorun giderme talimatları:
Yanıt yükü boyutu, izin verilen sınırdan büyük Hedef/arka uç sunucusu tarafından Apigee'ye HTTP yanıtının bir parçası olarak gönderilen yük boyutu, Apigee'de izin verilen sınırın üzerindedir. Edge Herkese Açık ve Özel Bulut kullanıcıları
Sıkıştırmayı açma sonrasında yanıt yükü boyutu, izin verilen sınırı aşıyor Apigee'ye HTTP yanıtının bir parçası olarak hedef/arka uç sunucusu tarafından sıkıştırılmış biçimde gönderilen yük boyutu, Apigee tarafından sıkıştırıldığında izin verilen sınırı aşıyor. 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. Hata kodunu daraltmak için Proxy filtresini seçebilirsiniz.
  6. Hata Kodu'nu Zamana göre çizin.
  7. Aşağıda gösterildiği gibi protocol.http.TooBigBody hata koduna sahip bir hücre seçin:

  8. protocol.http.TooBigBody hata koduyla ilgili bilgileri aşağıda gösterildiği gibi görürsünüz:

  9. Günlükleri görüntüle'yi tıklayın ve başarısız isteğin satırını genişletin.

  10. Günlükler penceresinde aşağıdaki ayrıntıları not edin:
    • Durum Kodu: 502
    • Hata Kaynağı: target
    • Hata Kodu: protocol.http.TooBigBody.
  11. Hata Kaynağı target değerine ve Hata Kodu protocol.http.TooBigBody değerine sahipse bu durum, hedef/ arka uç sunucusundan gelen HTTP yanıtının, Apigee Edge'de izin verilen sınırdan daha büyük bir yanıt yükü boyutuna sahip olduğunu gösterir.

Trace

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

  1. İzleme oturumunu etkinleştirin ve aşağıdakilerden birini yapın:
    • 502 Bad Gateway hatasının oluşmasını bekleyin veya
    • Sorunu yeniden oluşturabiliyorsanız API çağrısı yapın ve 502 Bad Gateway hatasını yeniden oluşturun.
  2. Başarısız isteklerden birini seçip izi inceleyin.
  3. İzin farklı aşamaları arasında gezinin ve hatanın nerede gerçekleştiğini bulun.
  4. Aşağıda gösterildiği gibi, Hedef sunucudan yanıt alındı aşamasından hemen sonra Hata aşamasına gidin:

    İzlemedeki hatanın değerlerini not edin:

    • hata: Body buffer overflow
    • error.class: com.apigee.errors.http.server.BadGateway

    Bu durum, Apigee Edge'in (Mesaj İşleyici bileşeni) yük boyutunun izin verilen sınırı aşması nedeniyle arka uç sunucusundan yanıt alır almaz hatayı bildirdiğini gösterir.

  5. Bu hatayı Müşteriye Gönderildi aşamasında aşağıda gösterildiği gibi görürsünüz:

  6. İzlemedeki hatanın değerlerini not edin. Yukarıdaki örnek iz şunları gösterir:
    • hata: 502 Bad Gateway
    • Hata İçeriği: {"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
  7. Farklı senaryolar için aşağıda gösterildiği gibi Hedef sunucudan alınan yanıt aşamasına gidin:

    Sıkıştırılmamış

    1. Senaryo: Sıkıştırılmamış biçimde gönderilen yanıt yükü

    İzlemedeki hatanın değerlerini not edin:

    • Hedef sunucudan alınan yanıt: 200 OK
    • Content-Length (Content-Length bölümünden): ~11 MB

    Sıkıştırılmış

    2. Senaryo: Sıkıştırılmış biçimde gönderilen yük isteme

    İzlemedeki hatanın değerlerini not edin:

    • Hedef sunucudan alınan yanıt: 200 OK
    • Content-Encoding: Bu üst bilgiyi Yanıt Başlıkları bölümünde görüyorsanız değere dikkat edin. Örneğin, bu örnekte değer gzip şeklindedir.
  8. Yanıt İçeriği bölümünün altındaki Gövde'ye dikkat edin:

    {"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
    
  9. İzdeki AX (Analytics Verileri Kaydı) Aşamasına gidin ve ilgili ayrıntıları görmek için bunu tıklayın.

  10. Aşama Ayrıntıları'nda aşağı kaydırarak Okunan Değişkenler bölümüne gidin ve şunu gösteren target.received.content.length değerlerini belirleyin:
    • Yanıt yükünün sıkıştırılmamış biçimde gönderildiğindeki gerçek boyutu ve
    • Yük sıkıştırılmış biçimde gönderildiğinde, Apigee tarafından sıkıştırmanın kaldırılmasından sonra yanıt yükünün boyutu. Bu senaryoda değer, her zaman izin verilen sınırın değeriyle (10 MB) aynı olur.

    Sıkıştırılmamış

    1. Senaryo: Sıkıştırılmamış biçimde gönderilen yanıt yükü

    target.received.content.length değerini not edin:

    İstek başlıkları Değer
    target.received.content.length ~11 MB

    Sıkıştırılmış

    2. Senaryo: Sıkıştırılmış biçimde gönderilen yük isteme

    target.received.content.length değerini not edin:

    İstek Başlığı Değer
    target.received.content.length ~10 MB
  11. Aşağıdaki tabloda, target.received.content.length değerine bağlı olarak iki senaryoda Apigee 502 hatasının neden döndürüldüğü açıklanmaktadır.

    Senaryo target.received.content.length değeri Hatanın nedeni
    Sıkıştırılmamış biçimde yanıt yükü ~11 MB Boyut > 10 MB'lık izin verilen sınır
    Sıkıştırılmış biçimde yanıt yükü ~10 MB

    Sıkıştırma açılırken boyut sınırı aşıldı

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 özelliğinde protocol.http.TooBigBody değeriyle eşleşen bir 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üğünden yukarıdaki örnek giriş, X-Apigee- hata kodu 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.TooBigBody
    X-Apigee-fault-source target

Neden: Yanıt Yük Boyutu izin verilen sınırdan büyük

Teşhis

  1. API İzleme, Trace aracı veya NGINX erişim günlükleri kullanılarak gözlemlenen hata için Hata Kodu, Hata Kaynağı ve Yanıt Yük Boyutu'nu, 1. Senaryo ile Yaygın teşhis adımları bölümünde açıklandığı şekilde belirleyin.
  2. Hata Kaynağı target değerine sahipse hedef/arka uç sunucusu tarafından Apigee'ye gönderilen yanıt yükü boyutunun Apigee Edge'de izin verilen sınırdan daha büyük olduğu anlamına gelir.
  3. 1. adımda belirlenen Yanıt Yük Boyutu'nu doğrulayın.
  4. Aşağıdaki adımları uygulayıp gerçek yanıtı kontrol ederek yanıt yükü boyutunun gerçekten 10 MB'tan fazla izin verilen sınır olduğunu doğrulayın:
    1. Hedef/arka uç sunucusuna yapılan asıl isteğe erişiminiz yoksa Çözüm'e gidin.
    2. Hedef/arka uç sunucusuna 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 veya arka uç sunucusuna istekte bulunmasına izin verilen başka bir makineden doğrudan arka uç sunucusuna istek gönderin.
      2. Private Cloud kullanıcısıysanız Mesaj İşleyicilerinin birinden arka uç sunucuya istek gönderebilirsiniz.
      3. Content-Length (İçerik Uzunluğu) başlığını kontrol ederek yanıtta iletilen yükün boyutunu doğrulayın.
      4. Yükün boyutunun Apigee Edge'de izin verilen sınırın üzerinde olduğunu görürseniz sorunun nedeni budur.

    Arka uç sunucudan gelen örnek yanıt:

    curl -v https://BACKENDSERVER-HOSTNAME/testfile
    
    * About to connect() to 10.14.0.10 port 9000 (#0)
    *   Trying 10.14.0.10...
    * Connected to 10.14.0.10 (10.148.0.10) port 9000 (#0)
    > GET /testfile HTTP/1.1
    > User-Agent: curl/7.29.0
    > Host: 10.14.0.10:9000
    > Accept: */*
    >
    < HTTP/1.1 200 OK
    < Accept-Ranges: bytes
    < Content-Length: 11534336
    < Content-Type: application/octet-stream
    < Last-Modified: Wed, 30 Jun 2021 08:18:02 GMT
    < Date: Wed, 30 Jun 2021 09:22:41 GMT
    <
    ----snipped----
    <Response Body>
    

    Yukarıdaki örnekte, Apigee Edge'de izin verilen sınırı aştığından bu hatanın nedeninin Content-Length: 11534336 (which is ~11 MB) olduğunu görebilirsiniz.

Çözünürlük

Çözünürlük başlıklı makaleyi inceleyin.

Neden: Sıkıştırmayı açma sonrasında Yanıt Yük Boyutu izin verilen sınırı aşıyor

Yanıt yükü sıkıştırılmış biçimde gönderilirse ve yanıt başlığı Content-Encoding, gzip, olarak ayarlanırsa yanıt yükünü açar. Sıkıştırmayı açma işlemi sırasında Apigee, yük boyutunun Apigee Edge'de izin verilen sınırın üzerinde olduğunu tespit ederse sıkıştırmayı açma işlemini daha da durdurur ve hemen 502 Bad Gateway ve protocol.http.TooBigBody hata koduyla yanıt verir.

Teşhis

  1. API İzleme,İzleme Aracı veya NGINX Erişim günlüklerini kullanarak gözlemlenen hata için Hata Kodu, Hata Kaynağı ve Yanıt Yükü boyutunu 2. Senaryo ile Yaygın teşhis adımları bölümünde açıklandığı şekilde belirleyin.
  2. Hata Kaynağı target değerine sahipse hedef/arka uç uygulaması tarafından Apigee'ye gönderilen yanıt yükü boyutunun Apigee Edge'de izin verilen sınırdan daha büyük olduğu anlamına gelir.
  3. 1. adımda belirlenen Yanıt Yük Boyutu'nu doğrulayın.
    • Yük boyutu 10 MB'tan büyükse hatanın nedeni budur.
    • Yük boyutu izin verilen sınır olan yaklaşık 10 MB ise yanıt yükü sıkıştırılmış biçimde aktarılabilir. Bu durumda, sıkıştırılmış yanıt yükünün sıkıştırılmamış boyutunu kontrol edin.
  4. Hedef/arka uçtan gelen yanıtın sıkıştırılmış biçimde gönderilip gönderilmediğini ve sıkıştırılmamış boyutun izin verilen sınırdan büyük olup olmadığını aşağıdaki yöntemlerden birini kullanarak doğrulayabilirsiniz:

    Trace

    İzleme aracını kullanarak:

    1. Başarısız olan istek için bir iz yakaladıysanız İzleme ve
      1. target.received.content.length değerini belirleyin
      2. İstemciden gelen isteğin Content-Encoding: gzip üstbilgisini içerip içermediğini doğrulayın
    2. target.received.content.length değeri, izin verilen 10 MB'lık sınıra yakınsa ve yanıt başlığı Content-Encoding: gzip ise bu hatanın nedeni budur.

    Gerçek istek

    Gerçek isteği kullanarak:

    1. Hedef/arka uç sunucusuna yapılan asıl isteğe erişiminiz yoksa Çözüm'e gidin.
    2. Hedef/arka uç sunucusuna yapılan gerçek isteğe erişiminiz varsa aşağıdaki adımları uygulayın:
      1. Yanıtta gönderilen Content-Encoding başlığıyla birlikte yanıtta iletilen yükün boyutunu doğrulayın.
      2. Content-Encoding yanıt başlığının gzip olarak ayarlandığını ve yükün sıkıştırılmamış boyutunun Apigee Edge'de izin verilen sınırın üzerinde olduğunu görüyorsanız bu hatanın nedeni budur.

        Arka uç sunucudan alınan örnek yanıt:

        curl -v https://BACKENDSERVER-HOSTNAME/testzippedfile.gz
        
        * About to connect() to 10.1.0.10 port 9000 (#0)
        *   Trying 10.1.0.10...
        * Connected to 10.1.0.10 (10.1.0.10) port 9000 (#0)
        > GET /testzippedfile.gz HTTP/1.1
        > User-Agent: curl/7.29.0
        > Host: 10.1.0.10:9000
        > Accept: */*
        >
        < HTTP/1.1 200 OK
        < Accept-Ranges: bytes
        < Content-Encoding: gzip
        < Content-Type: application/x-gzip
        < Last-Modified: Wed, 30 Jun 2021 08:18:02 GMT
        < Testheader: test
        < Date: Wed, 07 Jul 2021 10:14:16 GMT
        < Transfer-Encoding: chunked
        <
        ----snipped----
        <Response Body>
        

        Yukarıdaki örnekte Content-Encoding: gzip başlığı gönderilir ve yanıttaki testzippedfile.gz dosyasının boyutu sınırdan küçük olsa da sıkıştırılmamış testzippedfile dosyasının boyutu yaklaşık 15 MB'tır.

    Mesaj İşleyici günlükleri

    İleti İşleyici günlüklerini kullanma:

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

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

    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. Aşağıdaki arama dizelerini kullanabilirsiniz:

      grep -ri "chunkCount"
      
      grep -ri "BadGateway: Body buffer overflow"
      
    4. system.log alanında aşağıdakine benzer satırlar bulacaksınız (sizin için TotalRead ve chunkCount farklı olabilir):
      2021-07-07 09:40:47,012  NIOThread@7 ERROR HTTP.SERVICE -
      TrackingInputChannel.checkMessageBodyTooLarge() : Message is too large.
      TotalRead 10489856 chunkCount 2571
      
      2021-07-07 09:40:47,012  NIOThread@7 ERROR HTTP.CLIENT -
      HTTPClient$Context.onInputException() :
      ClientInputChannel(ClientChannel[Connected:
      Remote:10.148.0.10:9000 Local:10.148.0.9:42240]@9155
      useCount=1 bytesRead=0 bytesWritten=182 age=23ms  lastIO=0ms
      isOpen=true).onExceptionRead exception: {}
      com.apigee.errors.http.server.BadGateway: Body buffer overflow
      
      2021-07-07 09:40:47,012  NIOThread@7 ERROR
      ADAPTORS.HTTP.FLOW - AbstractResponseListener.onException() :
      AbstractResponseListener.onError(HTTPResponse@77cbd7c4,
      Body buffer overflow)
      
    5. Sıkıştırmayı açma işlemi sırasında, Mesaj İşleyici toplam okunan bayt miktarının 10 MB'tan büyük olduğunu belirler belirlemez durur ve aşağıdaki satırı yazdırır:

      Message is too large. TotalRead 10489856 chunkCount 2571

      Bu, Yanıt Yük Boyutu'nun 10 MB'tan büyük olduğu anlamına gelir ve boyut protocol.http.TooBigBody olarak hata koduyla 10 MB sınırını aşmaya başladığında Apigee hata verir.

Çözünürlük

Boyutu düzelt

1. Seçenek [Önerilen]: Hedef sunucu uygulamasının, Apigee sınırını aşan yük boyutunu göndermemesi için düzeltmesi

  1. Belirli bir hedef sunucunun, Sınırlar bölümünde tanımlanan izin verilen sınırın üzerinde yanıt / yük boyutu gönderme nedenini analiz edin.
  2. Bu istenen bir durum değilse hedef sunucu uygulamanızı, izin verilen sınırın altında yanıt / yük boyutu gönderecek şekilde değiştirin.
  3. İstenirse ve izin verilen sınırın üzerinde bir yanıt/yük göndermek istiyorsanız sonraki seçeneklere gidin.

İmzalanmış URL modeli

2. Seçenek [Önerilen]: Apigee JavaScript'te imzalı URL'ler kalıbı kullanın

Apigee, 10 MB'tan büyük yükler için GitHub'daki Edge Callout: İmzalı URL Oluşturucu örneğinde gösterilen Apigee JavaCall'da imzalı URL kalıbı kullanmanızı önerir.

Canlı Yayın

3. Seçenek: Canlı Yayını Kullanma

API proxy'nizin çok büyük istekleri ve/veya yanıtları işlemesi gerekiyorsa Apigee'de akış özelliğini etkinleştirebilirsiniz.

CwC

4. Seçenek: Arabellek sınırını artırmak için CwC özelliğini kullanma

Varsayılan boyut artırılırsa performans sorunları olabileceğinden bu seçenek yalnızca önerilen seçeneklerden hiçbirini kullanamadığınızda kullanılmalıdır.

Apigee, istek ve yanıt yükü boyutu sınırını artıran bir CwC özelliği sunar. Ayrıntılar için Yönlendirici veya Mesaj İşleyici'de mesaj boyutu sınırını ayarlama bölümüne bakın.

Sınırlar

Apigee, istemci uygulamasının ve arka uç sunucusunun Apigee Edge Sınırları bölümünde Request/response size için belirtildiği üzere izin verilen sınırın üzerinde yük boyutu göndermemesini bekler.

  1. Herkese Açık Bulut kullanıcısıysanız istek ve yanıt yükü boyutu için maksimum sınır Request/response size için Apigee Edge Sınırları bölümünde belirtildiği şekildedir.
  2. Private Cloud kullanıcısıysanız istek ve yanıt yükü boyutu için varsayılan maksimum sınırı değiştirmiş olabilirsiniz (önerilen bir uygulama olmasa da). Geçerli sınırı kontrol etme başlıklı makaledeki talimatları uygulayarak maksimum istek yükü boyutu sınırını belirleyebilirsiniz.

Geçerli sınır nasıl kontrol edilir?

Bu bölümde, HTTPResponse.body.buffer.limit özelliğinin Mesaj İşleyicilerde yeni bir değerle güncellendiğini nasıl doğrulayacağınız açıklanmaktadır.

  1. Mesaj İşleyici makinesinde, /opt/apigee/edge-message- processor/conf dizininde HTTPResponse.body.buffer.limit özelliğini arayın ve hangi değerin aşağıda gösterildiği gibi ayarlandığını kontrol edin:

    grep -ri "HTTPResponse.body.buffer.limit" /opt/apigee/edge-message-processor/conf
    
  2. Yukarıdaki komuttan alınan örnek sonuç aşağıdaki gibidir:

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.body.buffer.limit=10m
    
  3. Yukarıdaki örnek çıkışta, HTTPResponse.body.buffer.limit özelliğinin http.properties içinde 10m değeriyle ayarlandığına dikkat edin.

    Bu, Private Cloud için Apigee'de yapılandırılan istek yükü boyutunun 10 MB olduğunu gösterir.

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 tam curl komutu
  • API istekleri için izleme dosyası
  • Yükün boyutuyla birlikte hedef/arka uç sunucusundan alınan yanıtın tam çıktısı

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ı
  • Kuruluş adı
  • Ortam adı
  • API Proxy paketi
  • Başarısız API istekleri için izleme dosyası
  • 502 hatasını yeniden oluşturmak için kullanılan tam curl komutu
  • Yükün boyutuyla birlikte hedef/arka uç sunucusundan alınan yanıtın tam çıktısı
  • 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