2013-03-11 10 views
5

Ich brauche etwas zeitaufwendige Verarbeitung von Bildern, die von NGinx bedient werden, und ich würde gerne in der Lage sein, schnell mit teilweise verarbeiteten Bildern aus dem Cache zu reagieren.Nginx abgelöste Unteranfrage

Hier sind die Schritte von Ich mag würde:

  • Benutzer erste Anfrage für Bild machen A
  • Benutzer erhalten ein Bild ohne Verarbeitung
  • Verbindung freigegeben wird
  • Bild A wird gesetzt on cache (A0)
  • Eine "losgelöste" Unteranfrage wird gestartet (S1) [erste Bildtransformation]
  • Bis Unteranforderung S1 abgeschlossen ist, alle Anfragen nach Bild A erhalten A0
  • Wenn subrequest S1 erfolgt, wird Cache-Wert mit seinen Ergebnissen (A1)
  • Von nun an alle Anforderung für Bild ersetzt A A1 erhalten
  • A "freistehende" subrequest gestartet (S2) [ zweite Bildtransformation]
  • Bis subrequest S2 erfolgt, alle Anforderung für das Bild A erhält A1
  • Wenn subrequest S2 erfolgt, Cache-Wert wird mit seinen Ergebnissen (A2) ersetzt. . . und so weiter

Ich bin mit Nginx Lua-Modul die Bilder zu verarbeiten, und ich möchte proxy_cache Funktionalität (LRU aufzuräumen, TTL, usw.)

ich versucht habe, in der Lage sein zu verwenden, Verwenden Sie proxy_pass, post_action und ngx.location.capture, aber alle warten darauf, dass die Unteranforderung beendet wird, um die Verbindung zu schließen. Ich habe einige Lösungen wie Drupal Cache Warmer gesehen, die einen OS-Aufruf zum curl ausgeben, aber wenn möglich, möchte ich das nicht tun.

Dies ist mein Testfall so weit

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) 
     '; 
    } 
} 

Antwort

4

ich versucht habe, mit post_action und ngx.location.capture, aber beide für die subrequest bis zum Ende warten, um die Verbindung zu schließen.

Werfen Sie einen Blick auf ngx.eof() Dokumentation.

Aktualisierung: http://wiki.nginx.org/HttpLuaModule#ngx.eof

+0

Willkommen bei Stack Overflow! Ihre Antwort könnte viel besser gemacht werden, wenn Sie tatsächlich einen Link zur 'eof()' Dokumentation zur Verfügung stellen. – Matt