2013-03-11 9 views
5

Ho bisogno di fare un po 'di elaborazione che richiede tempo su immagini che sono servite da NGinx, e mi piacerebbe essere in grado di rispondere rapidamente con immagini parzialmente elaborate dalla cache.Nginx distaccato subrequest

qui sono i passi di che mi piacerebbe:

  • utente fare prima richiesta di immagine Una
  • ottenere l'utente immagine A senza alcuna elaborazione
  • connessione viene liberato
  • immagine A è messa nella cache (A0)
  • Viene avviato un sottorequest "distaccato" (S1) [prima trasformazione immagine]
  • Fino a quando subrequest S1 non è terminato, tutte le richieste per immagine A ottenere A0
  • Quando sotto richiesta S1 è fatto, valore cache viene sostituito con i suoi risultati (A1)
  • Da ora in poi ogni richiesta di immagine Una arrivare A1
  • viene avviata una sotto richiesta "distaccato" (S2) [ seconda immagine trasformazione]
  • Fino sotto richiesta S2 è fatto, tutte le richieste di immagine Una arrivare A1
  • Quando sotto richiesta S2 è fatto, valore cache viene sostituito con i suoi risultati (A2) . . . e così via

sto usando il modulo nginx Lua per elaborare le immagini, e mi piacerebbe essere in grado di utilizzare la funzionalità proxy_cache (LRU ripulire, TTL, ecc)

ho provato usando proxy_pass, post_action e ngx.location.capture, ma tutti aspettano che il subrequest finisca di chiudere la connessione. Ho visto alcune soluzioni come Drupal Cache Warmer che emettono una chiamata al SO per arricciarsi, ma se possibile mi piacerebbe non farlo.

Questo è il mio banco di prova finora

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

risposta

4

Ho provato con post_action e ngx.location.capture, ma ciascuno di essi attendere il sotto richiesta alla fine per chiudere la connessione.

Dai un'occhiata alla documentazione ngx.eof().

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

+0

Benvenuti in Stack Overflow! La tua risposta potrebbe essere migliorata molto se fornissi effettivamente un link alla documentazione 'eof()'. – Matt