Donc, vous voulez nginx
proxy une demande du client au serveur principal, puis, avant de renvoyer la réponse du backend au client, redirigez cette réponse via un autre processeur externe?
Je ne pense pas que vous puissiez faire ce qui précède avec les nginx
modules officiels fournis par Igor Sysoev et Nginx, Inc actuellement. La chose la plus proche disponible pour modifier le corps de la réponse est quelques modules de filtrage qui viennent avec nginx, mais sont désactivés par défaut, y compris les directives add_before_body
, add_after_body
et sub_filter
:
http://nginx.org/en/docs/http/ngx_http_addition_module.html
http://nginx.org/en/docs/http/ngx_http_sub_module.html
Aussi, peut - être gzip on;
est ce que vous voulez réellement à la place?
http://nginx.org/en/docs/http/ngx_http_gzip_module.html
Ou, potentiellement, si vous connaissez perl
et êtes prêt à exécuter un module entièrement expérimental, jetez un œil à l'intégration perl
dans nginx
, avec un module nginx officiel qui est désactivé par défaut et est (quelque peu évidemment) totalement expérimental:
http://nginx.org/en/docs/http/ngx_http_perl_module.html
Une autre option consiste à utiliser une sorte de configuration Fast-CGI vers laquelle vous redirigerez les demandes, où, à son tour, votre script Fast-CGI fera des demandes au backend, puis au traitement final, avant de retourner les réponses sont retournées à nginx pour être mises en cache et renvoyées à l'utilisateur.
Il y a aussi proxy_set_body
(mais pas fastcgi_set_body
encore), pour changer le corps de la requête (par exemple à partir de ce que le client a fourni), mais il ne semble pas y avoir de directive ou de variable équivalente pour obtenir le corps de la réponse, afin de passer à une demande ultérieure en quelque sorte à un post-processeur. Dans tous les cas, un module de filtrage est probablement ce que vous recherchez pour un post-processeur.
(De plus, vous vous rendez compte qu'une approche naïve de fork
réponses et de réponses via un exécutif régulier va être extrêmement lente, non?)
Pour résumer , je pense que gzip on;
c'est exactement ce que vous recherchez; Sinon, à condition que vous puissiez modifier la webapp d'origine, je pense que votre meilleur pari pourrait être d'installer une sorte de post-processeur dans la webapp elle-même, ce qui semblerait être la prochaine solution la plus simple dans l'ensemble. Potentiellement, vous pouvez examiner la façon dont les modules de filtrage sont mis en œuvre, par exemple le ngx_http_addition_filter_module.c susmentionné, ainsi que des filtres plus évidents comme ngx_http_gzip_filter_module.c, et implémenter votre propre module de filtre intégré. Ou embauchez Nginx, Inc. pour écrire ceci pour vous! Mais, sérieusement, cela gzip on;
fonctionne et est susceptible de vous donner de bien meilleurs résultats sans problèmes, performances ou stabilité, et il est déjà compilé par défaut, il vous suffit de l'activer dansnginx.conf
.