Quindi, si desidera nginx
delegare una richiesta dal client al server back-end e quindi, prima di restituire la risposta del back-end al client, reindirizzare tale risposta attraverso un altro processore esterno?
Non credo che tu possa fare quanto sopra con nessun nginx
modulo ufficiale come attualmente fornito da Igor Sysoev e Nginx, Inc. La cosa più vicina che è disponibile per alterare il corpo della risposta è a pochi moduli filtro che si uniscono con nginx, ma sono disattivati di default, tra cui il add_before_body
, add_after_body
e sub_filter
direttive:
http://nginx.org/en/docs/http/ngx_http_addition_module.html
http://nginx.org/en/docs/http/ngx_http_sub_module.html
Inoltre, forse gzip on;
è quello che vuoi invece?
http://nginx.org/en/docs/http/ngx_http_gzip_module.html
O, potenzialmente, se conosci perl
e sei disposto a eseguire un modulo completamente sperimentale, dai un'occhiata all'incorporamento perl
in nginx
, con un modulo nginx ufficiale che è disattivato di default ed è (in qualche modo ovviamente) totalmente sperimentale:
http://nginx.org/en/docs/http/ngx_http_perl_module.html
Un'altra opzione è quella di utilizzare una sorta di installazione Fast-CGI alla quale reindirizzerai le richieste, dove, a sua volta, lo script Fast-CGI eseguirà le richieste al back-end e quindi l'elaborazione finale, prima di tornare le risposte tornano a nginx per memorizzare nella cache e tornare all'utente.
C'è anche proxy_set_body
(ma non fastcgi_set_body
ancora), cambiare il corpo della richiesta (ad es. Da ciò che il cliente ha fornito), ma non sembra esserci alcuna direttiva o variabile equivalente per ottenere il corpo della risposta, al fine di passare a una richiesta in qualche modo successiva a un post-elaboratore. In ogni caso, un modulo filtro è probabilmente quello che vuoi per un post-processore.
(Inoltre, ti rendi conto che un approccio ingenuo di fork
ing e risposte di piping attraverso un dirigente regolare sarà molto più lento, giusto?)
Per riassumere , penso che gzip on;
sia esattamente quello che stai cercando; altrimenti, purché tu possa modificare la webapp originale, penso che la tua scommessa migliore potrebbe essere quella di installare una sorta di post-processore all'interno della webapp stessa, che sembrerebbe la soluzione più semplice nel complesso. Potenzialmente, potresti esaminare come sono implementati i moduli di filtro , ad esempio il summenzionato ngx_http_addition_filter_module.c, oltre ad alcuni filtri più ovviamente rilevanti come ngx_http_gzip_filter_module.c, e implementare il tuo modulo filtro incorporato. O assumi Nginx, Inc. per scrivere questo per te! Ma, sul serio, gzip on;
funziona e probabilmente ti darà risultati molto migliori senza problemi, prestazioni o stabilità, ed è già compilato per impostazione predefinita, devi solo abilitarlo innginx.conf
.