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 502 Bad Gateway HTTP durum kodunu ve protocol.http.TooBigBody 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ğı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'deki izin verilen sınırı aştığında oluşur.

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 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 üzerinde. Edge Public ve Private Cloud kullanıcıları
Yanıt yük boyutu, sıkıştırma açıldıktan sonra izin verilen sınırı aşıyor Hedef/arka uç sunucu tarafından HTTP yanıtının bir parçası olarak Apigee'ye sıkıştırılmış biçimde gönderilen yük boyutu, Apigee tarafından sıkıştırılması durumunda izin verilen sınırı aşıyor. 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. Hata kodunu daraltmak için Proxy filtresini seçebilirsiniz.
  6. Hata Kodunu Zaman ile karşılaştırın.
  7. Aşağıda gösterildiği gibi, hata kodu protocol.http.TooBigBody olan bir hücre seçin:

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

  9. Günlükleri görüntüle'yi tıklayın ve başarısız olan 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ğı değeri target ve Hata Kodu değeri protocol.http.TooBigBody ise bu, hedef/ arka uç sunucudan gelen HTTP yanıtının, Apigee Edge'deki izin verilen sınırdan daha büyük bir yanıt yükü boyutuna sahip olduğunu gösterir.

Trace

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

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

    İzlemedeki hata değerlerini not edin:

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

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

  5. Başarısızlığı, aşağıdaki örnekte gösterildiği gibi İstemciye Gönderilen Yanıt aşamasında görürsünüz:

  6. İzden hatanın değerlerini not edin. Yukarıdaki örnek izde şunlar gösterilmektedir:
    • 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 yanıt alındı aşamasına gidin:

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

    Senaryo 1: Yanıt yükü sıkıştırılmamış biçimde gönderildi

    İzlemedeki hata değerlerini not edin:

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

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

    2. senaryo: İstek yükü, sıkıştırılmış biçimde gönderildi

    İzlemedeki hata değerlerini not edin:

    • Hedef sunucudan yanıt alındı: 200 OK
    • Content-Encoding: Bu başlığı Response Headers (Yanıt Başlıkları) bölümünde görürseniz değeri not edin. Örneğin, bu örnekte değer gzip'dır.
  8. Yanıt İçeriği bölümündeki Gövde'yi inceleyin:

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

  10. Aşama Ayrıntıları'nda Okunan Değişkenler bölümüne gidin ve target.received.content.length değerlerini belirleyin. Bu değerler şunları gösterir:
    • 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ırma açıldıktan sonra yanıt yükünün boyutu. Bu senaryoda her zaman izin verilen sınırın (10 MB) değeriyle aynı olur.

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

    Senaryo 1: Yanıt yükü sıkıştırılmamış biçimde gönderildi

    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: İstek yükü, sıkıştırılmış biçimde gönderildi

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

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

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

    Sıkıştırma açıldığında boyut sınırı aşıldı

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. 502 Belirli bir süre boyunca hata olup olmadığını (sorun geçmişte yaşandıysa) veya 502 ile hâlâ başarısız olan istekler olup olmadığını görmek için arama yapın.
  4. 502 hataları bulursanız ve X-Apigee-fault-code değeri protocol.http.TooBigBody ile 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 protocol.http.TooBigBody
    X-Apigee-fault-source target

Neden: Yanıt yük boyutu, izin verilen sınırdan daha büyük

Teşhis

  1. API İzleme, Trace aracı veya NGINX erişim günlükleri kullanılarak gözlemlenen hatanın Hata Kodunu, Hata Kaynağını ve Yanıt Yükü Boyutunu belirleyin. Bu işlem, Yaygın teşhis adımları bölümünde 1. senaryo ile açıklanmıştır.
  2. Hata Kaynağı target değerine sahipse bu, hedef/arka uç sunucusu tarafından Apigee'ye gönderilen yanıt yükü boyutunun Apigee Edge'deki izin verilen sınırdan daha büyük olduğunu gösterir.
  3. 1. adımda belirlenen Yanıt Yükü Boyutu'nu doğrulayın.
  4. Aşağıdaki adımları uygulayarak gerçek yanıtı kontrol edip yanıt yükü boyutunun gerçekten de izin verilen 10 MB sınırından büyük olduğunu doğrulayın:
    1. Hedef/arka uç sunucusuna yapılan gerçek isteğe erişiminiz yoksa Çözüm bölümüne 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/ö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. Yanıtla iletilen yükün boyutunu Content-Length başlığını kontrol ederek doğrulayın.
      4. Yükün boyutunun Apigee Edge'de izin verilen sınırdan fazla olduğunu görürseniz sorunun nedeni budur.

    Arka uç sunucusundan ö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ığı için bu hataya neden olan Content-Length: 11534336 (which is ~11 MB) öğesini görebilirsiniz.

Çözünürlük

Çözünürlük bölümüne bakın.

Neden: Yanıt yük boyutu, sıkıştırma açıldıktan sonra 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 Apigee yanıt yükünü açar. Apigee, sıkıştırmayı açma işlemi sırasında yük boyutunun Apigee Edge'de izin verilen sınırdan daha büyük olduğunu tespit ederse sıkıştırmayı açma işlemine devam etmez ve hemen 502 Bad Gateway ile protocol.http.TooBigBody hata koduyla yanıt verir.

Teşhis

  1. API İzleme, İzleme Aracı veya NGINX Erişim günlükleri kullanılarak gözlemlenen hata için Hata Kodunu, Hata Kaynağını ve Yanıt Yükü boyutunu belirleyin. Bu işlem, Genel teşhis adımları bölümünde 2. senaryo ile açıklanmıştır.
  2. Fault Source değeri target ise bu, 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ğunu gösterir.
  3. 1. adımda belirlenen Yanıt Yükü Boyutu'nu doğrulayın.
    • Yük boyutu, izin verilen 10 MB sınırını aşıyorsa hatanın nedeni budur.
    • Yük boyutu, izin verilen sınır olan ~10 MB ise yanıt yükünün sıkıştırılmış biçimde iletilmesi mümkündür. Bu durumda, sıkıştırılmış yanıt yükünün sıkıştırılmamış boyutunu kontrol edin.
  4. Aşağıdaki yöntemlerden birini kullanarak 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ı doğrulayabilirsiniz:

    Trace

    Trace aracını kullanma:

    1. Başarısız olan istek için izleme yakaladıysanız İzleme ve
      1. target.received.content.length değerini belirleyin.
      2. İstemciden gelen istekte Content-Encoding: gzip başlığının bulunup bulunmadığını doğrulayın.
    2. target.received.content.length değeri izin verilen 10 MB sınırına yakınsa ve yanıt başlığı Content-Encoding: gzip ise bu hatanın nedeni budur.

    Gerçek istek

    Gerçek isteği kullanma:

    1. Hedef/arka uç sunucusuna yapılan gerçek isteğe erişiminiz yoksa Çözüm bölümüne 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 iletilen yükün boyutunu ve yanıtta gönderilen Content-Encoding üstbilgisini doğrulayın.
      2. Yanıt başlığının Content-Encoding, gzip olarak ayarlandığını ve yükün sıkıştırılmamış boyutunun Apigee Edge'de izin verilen sınırdan fazla olduğunu görürseniz bu hatanın nedeni budur.

        Arka uç sunucusundan 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 üstbilgisi gönderiliyor ve yanıttaki testzippedfile.gz dosyasının boyutu sınırdan küçük olmasına rağmen sıkıştırılmamış testzippedfile dosyasının boyutu yaklaşık 15 MB.

    Mesaj işleyici günlükleri

    Mesaj İşleyici günlüklerini kullanma:

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

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

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

      grep -ri "chunkCount"
      
      grep -ri "BadGateway: Body buffer overflow"
      
    4. Aşağıdakine benzer system.log satırları görürsünüz (TotalRead ve chunkCount sizin durumunuzda 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, İleti İşleyici toplam okunan bayt sayısının 10 MB'tan fazla olduğunu belirlediği anda 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 ve Apigee'nin, boyut 10 MB sınırını aşmaya başladığında hata kodu olarak protocol.http.TooBigBody ile hatayı gösterdiği anlamına gelir.

Çözünürlük

Boyutu düzelt

1. seçenek [Önerilir]: Hedef sunucu uygulamasının, Apigee sınırını aşan yük boyutu göndermesini engelleyin

  1. Sınırlar bölümünde tanımlandığı gibi, belirli hedef sunucunun yanıt / yük boyutunu izin verilen sınırdan daha fazla göndermesinin nedenini analiz edin.
  2. Bu durum istenmiyorsa hedef sunucu uygulamanızı, izin verilen sınırdan daha küçük bir yanıt / yük boyutu gönderecek şekilde değiştirin.
  3. İsteniyorsa ve izin verilen sınırdan daha fazla yanıt/yük göndermek istiyorsanız sonraki seçeneklere gidin.

İmzalanmış URL kalıbı

2. seçenek [Önerilir]: Apigee JavaCallout içinde imzalı URL kalıbını kullanın

Apigee, 10 MB'tan büyük yükler için GitHub'daki Edge Callout: Signed URL Generator örneğinde gösterildiği gibi, bir Apigee JavaCallout içinde imzalı URL'ler kalıbının kullanılmasını önerir.

Canlı Yayın

3. seçenek: Yayın özelliğini kullanma

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

CwC

4. seçenek: Arabellek sınırını artırmak için CwC mülkünü kullanma

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

Apigee, istek ve yanıt yük boyutu sınırını artırmasına olanak tanıyan bir CwC özelliği sağlar. Ayrıntılar için Yönlendiricide veya ileti işlemcisinde ileti boyutu sınırını ayarlama başlıklı makaleyi inceleyin.

Sınırlar

Apigee, istemci uygulamasının ve arka uç sunucusunun, Apigee Edge Sınırları'nda Request/response size için belirtilen izin verilen sınırı aşan yük boyutları 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ı'nda belirtildiği gibidir.
  2. Özel bulut kullanıcısıysanız istek ve yanıt yükü boyutu için varsayılan maksimum limiti 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.

Mevcut sınır nasıl kontrol edilir?

Bu bölümde, tesisinHTTPResponse.body.buffer.limit Mesaj İşleyiciler'de yeni bir değerle güncellendiğinin nasıl doğrulanacağı açıklanmaktadır.

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

    grep -ri "HTTPResponse.body.buffer.limit" /opt/apigee/edge-message-processor/conf
    
  2. Yukarıdaki komutun örnek sonucu aşağıdaki gibidir:

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.body.buffer.limit=10m
  3. Yukarıdaki örnek çıktıda, HTTPResponse.body.buffer.limit özelliğinin http.properties içinde 10m değeriyle ayarlandığını unutmayın.

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

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 tam curl komutu
  • API istekleri için izleme dosyası
  • Hedef/arka uç sunucudan gelen yanıtın tam çıktısı ve yükün boyutu

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ı
  • Kuruluş adı
  • Ortam adı
  • API proxy paketi
  • Başarısız olan API isteklerinin izleme dosyası
  • 502 hatasını yeniden oluşturmak için kullanılan tam curl komutu
  • Hedef/arka uç sunucudan gelen yanıtın tam çıktısı ve yükün boyutu
  • 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