2013-03-11 32 views
5

NGinx tarafından sunulan görüntülerde zaman alan bir işlem yapmam gerekiyor ve kısmi olarak işlenmiş resimlerle önbelleğe hızlı bir şekilde yanıt verebilmek istiyorum. İşte Nginx ayrılmamış alt sorgu

istiyorum I adımlar şunlardır:

  • Kullanıcı görüntü için ilk talepte A
  • Kullanıcı
  • Bağlantı arındırılır
  • görüntü A konur hiçbir işleme tabi tutulmadan A görüntüsü almak önbellek (A0)
  • A "müstakil" alt sorgulama başlatıldı (S1) [ilk görüntü dönüştürme]
  • S1 alt sorguya kadar tamamlandı, Görüntü A olsun A0
  • S1 yapılır İstek içi olduğunda, önbellek değeri sonuçları (A1) Bundan görüntü için tüm istek üzerine
  • A A1 olsun değiştirilir
  • Bir "müstakil" İstek içi başlatılır (S2) [ S2 yapılır istek içi kadar ikinci görüntü dönüşüm]
  • , görüntü A için tüm istek istek içi S2 yapılır
  • A1
  • olsun, önbellek değeri sonuçları (A2) ile değiştirilir. . . ve böylece

I görüntüleri işlemek için Nginx Lua modülü kullanıyorum ve ben

denedim (LRU, vb TTL temizlemek) proxy_cache işlevselliği kullanabilmek için istiyorum proxy_pass, post_action ve ngx.location.capture kullanarak, ancak hepsi bağlantıyı kapatmak için alt sorgunun bitmesini bekleyin. Kıvrılmak için bir OS çağrısı yayınlayan Drupal Cache Warmer gibi bazı çözümler gördüm, ancak mümkünse bunu yapmak istemiyorum.

Bu benim test şimdiye kadar

server { 
    listen  8080; 

    location/{ 

     rewrite_by_lua ' 
      ngx.say(".") 
      --res = ngx.location.capture("/internal") 
      ngx.exit(ngx.OK) 
     '; 

     proxy_pass http://127.0.0.1:8080/internal; 

    } 

    location /internal { 
     content_by_lua ' 
      ngx.log(ngx.ERR, "before") 
      ngx.sleep(10) 
      ngx.say("Done") 
      ngx.log(ngx.ERR, "after") 
      ngx.exit(ngx.OK) 
     '; 
    } 
} 

cevap

4

Ben post_action ve ngx.location.capture kullanarak denedi durumda, ancak her ikisi de bağlantıyı kapatmak için sona İstek içi beklemek.

ngx.eof() belgelerine bir göz atın.

Güncelleştirme: http://wiki.nginx.org/HttpLuaModule#ngx.eof

+0

Yığın Taşması'na Hoş Geldiniz! Eğer 'eof()' belgelerine bir bağlantı sağladıysanız cevabınız çok daha iyi olabilir. – Matt