Modifica al volo i dati sottoposti a proxy da nginx


9

Ho una configurazione nginx che riceve richieste da host esterni e le inoltra a un server interno.

La configurazione è simile a questa:

server {

        listen 10.0.0.66:443;

        server_name my.example.com;

        root /websites/my.example.com

        ssl on;
        ssl_certificate /websites/ssl/my.example.com.crt;
        ssl_certificate /websites/ssl/my.example.com.key;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $http_host;

        location / {
                proxy_pass https://10.0.0.100:3000/;
        }
}

A scopo sperimentale / di test, vorrei essere in grado di eseguire ciò con cui l'host interno ha risposto attraverso un binario arbitrario e rispondere con ciò con cui il binario risponde.

Ad esempio , se volessi minimizzare html sul proxy, avrei eseguito la risposta del server tramite htmlcompressor e quindi avrei inviato l'output come risposta del proxy al client. Il risultato finale sarebbe che il client finale ottenga indietro il codice HTML minimizzato.

So che ci sono tutti i tipi di addon ed esempi per nginx per realizzare questo per i dati forniti localmente, ma come configurarlo per un proxy?


Giusto per chiarire. Vuoi nginx inoltrare la richiesta al server proxy, ricevere una risposta indietro, comprimerla, quindi inoltrarla all'utente? Vuoi che nginx lo elabori nel mezzo del server e dell'utente?
sjdaws,

@sjdaws, non necessariamente lo comprime, ma lo esegue attraverso qualsiasi programma arbitrario e usa l'output come ciò che viene inviato al client. Quindi in sostanza sì, voglio modificare l'output che va dal server al client.
0x6A75616E,

Risposte:


10

Quindi, si desidera nginxdelegare 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 nginxmodulo 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_bodye sub_filterdirettive:

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 perle sei disposto a eseguire un modulo completamente sperimentale, dai un'occhiata all'incorporamento perlin 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_bodyancora), 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 forking 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.


Grazie per la tua risposta! Sono a conoscenza di gzip on e quello che sto cercando di realizzare è più alto livello che sgonfiare l'output. Ho un proxy che controlla l'accesso ad alcuni servizi web interni e volevo poter aggiungere all'output cose come google analytics, un po 'come fa cloudflare. Come dici tu, sembra che fastcgi sia un'opzione, quindi esaminerò quello. Grazie ancora!
0x6A75616E,

Se vuoi solo aggiungere elementi o aggiungere google analytics, allora add_after_bodyo sub_filterè esattamente quello che ti serve. L'esempio su nginx.org/en/docs/http/ngx_http_sub_module.html mostra esattamente quello scenario: sostituendo "</head>" con "</head> <script ...". Potrebbe essere necessario ricompilare nginx per abilitare quei moduli (controllare nginx -Vcome è stato compilato nginx), ma in caso contrario sono già moduli standard.
primo

Dai un'occhiata anche al modulo subs_filter .
franzlorenzon,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.