Modifica os dados sendo proxiados por nginx durante o processo

8

Eu tenho uma configuração nginx que recebe solicitações de hosts externos e faz proxy deles para um servidor interno.

A configuração é algo assim:

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/;
        }
}

Para fins experimentais / de teste, gostaria de poder executar o que o host interno respondeu com um binário arbitrário e responder com o que o binário responde.

Para o exemplo , se quisesse minimizar o html no proxy, executaria a resposta do servidor por meio do htmlcompressor e, em seguida, enviaria a saída como a resposta do proxy ao cliente. O resultado final seria o cliente final recebendo o html diminuído.

Eu sei que existem todos os tipos de addons e exemplos para o nginx para conseguir isso para dados servidos localmente, mas como configurá-lo para um proxy?

    
por thatjuan 19.02.2013 / 17:40

2 respostas

10

Então, você deseja que nginx envie um pedido do cliente para o servidor backend e, antes de retornar a resposta do back-end ao cliente, canalize essa resposta por meio de outro processador externo?

Eu não acho que você possa fazer o que foi mencionado acima com qualquer módulo oficial nginx fornecido por Igor Sysoev e Nginx, Inc atualmente. A coisa mais próxima disponível para alterar o corpo da resposta são alguns módulos de filtro que vêm junto com o nginx, mas estão desativados por padrão, incluindo as diretivas add_before_body , add_after_body e sub_filter :

link
link

Além disso, talvez gzip on; seja o que você realmente deseja em vez disso?

link

Ou, potencialmente, se você conhece perl e deseja executar um módulo totalmente experimental, confira perl em nginx , com um módulo nginx oficial desativado por padrão e é ( um pouco obviamente) totalmente experimental:

link

Outra opção é usar algum tipo de configuração Fast-CGI para a qual você estará redirecionando as solicitações, onde, por sua vez, o script Fast-CGI fará solicitações ao backend e, em seguida, o processamento final, antes de retornar as respostas de volta ao nginx para armazenar em cache e retornar ao usuário.

Há também proxy_set_body (mas ainda não há fastcgi_set_body ), para alterar o corpo do pedido (por exemplo, do que o cliente forneceu), mas não parece haver qualquer diretiva ou variável equivalente para obter o corpo da resposta, a fim de passar para um pedido subsequente de alguma forma a um pós-processador. Em qualquer caso, um módulo de filtro é provavelmente o que você deseja para um pós-processador.

(Além disso, você percebe que uma abordagem ingênua de fork ing e respostas de piping através de um executivo regular vai ser extra-extra lento, certo?)

Para resumir , acho que gzip on; é exatamente o que você está procurando; mais, desde que você possa modificar o webapp original, acho que sua melhor aposta seria instalar algum tipo de pós-processador dentro do próprio aplicativo, o que parece ser a solução mais fácil em geral. Potencialmente, você poderia investigar como os módulos de filtro são implementados, por exemplo o ngx_http_addition_filter_module.c acima mencionado, além de alguns filtros mais relevantes, como o ngx_http_gzip_filter_module.c, e implemente seu próprio módulo de filtro embutido. Ou contratar a Nginx, Inc. para escrever isso para você! Mas, sério, gzip on; apenas funciona, e é provável que você obtenha resultados muito melhores sem problemas, desempenho ou estabilidade, e já está compilado por padrão, você só precisa ativá-lo em nginx.conf .

    
por 28.02.2013 / 22:15
1

Acho que se você quiser executar código arbitrário para mofificar a saída nginx, ... Você pode escrever um roteiro de lua.

Procure por "nginx lua".

(Exemplo: link )

    
por 14.02.2017 / 11:21