![Nginx como proxy de encaminhamento para HTTPS](https://rvso.com/image/1365821/Nginx%20como%20proxy%20de%20encaminhamento%20para%20HTTPS.png)
Embora eu tenha conseguido configurar com sucesso o nginx para proxy do tráfego HTTP (usandoeste guia), todas as tentativas de proxy de solicitações HTTPS resultaram no código 400 (Pedido ruim).
Os logs de depuração do Nginx não foram úteis:
2013/06/05 14:38:33 [info] 74946#0: *589
client sent invalid request while reading client request line, client: 127.0.0.1,
server: google.com, request: "CONNECT google.com:443 HTTP/1.1"
Quais são esses CONNECT
pedidos? É possível fazer proxy_pass
solicitações HTTPS no nginx?
Atualizar
Preciso acrescentar que um servidor proxy faz parte do meu fluxo de trabalho/kit de ferramentas de desenvolvimento web. É uma ótima maneira de testar/depurar JavaScript do lado do cliente emProduçãoambiente (usando reescritas antes do proxy).
Além disso, a linguagem de configuração do nginx é indiscutivelmente uma linguagem de programação por si só. Tem variáveis!
Responder1
Parece que o nginx não suporta o modo proxy de encaminhamento com SSL. Você precisará usar algo comoLulaem vez de. Aqui está um link com mais explicações do autor do nginx:HTTPS e nginx como proxy de encaminhamento.
Responder2
Só para esclarecer: como escrevi no feed de comentários do meu blog, o nginx não lida com chamadas do método CONNECT que são usadas para estabelecer uma conexão TCP bruta com um host remoto por meio de um proxy HTTP - o que faz sentido, considerando que o nginx não deveria funciona como um proxy de encaminhamento, mas funciona muito bem para HTTP normal de qualquer maneira.
O Nginx literalmente não tem ideia do que fazer com essas chamadas de método, é por isso que as mensagens de erro nos logs são inúteis. Sempre usei privoxy para HTTPS:http://www.privoxy.org/- também é incrivelmente fácil de configurar. Mas ainda é impossível filtrar ou alterar o conteúdo das retransmissões HTTPS, porque as conexões HTTPS são tratadas com uma conexão bruta por meio do método CONNECT e o servidor não tem ideia do que está retransmitindo.
Responder3
Se você não se importa em compilar o nginx a partir do código-fonte, você pode instalarngx_http_proxy_connect_module. O seguinte funcionou para mim no Debian 9 "Stretch" em um Raspberry Pi (depois de adicionar URLs deb-src a /etc/apt/sources.list e fazer o apt-get update):
cd /tmp &&
apt-get source nginx &&
git clone https://github.com/chobits/ngx_http_proxy_connect_module &&
cd nginx-* &&
patch -p1 < ../ngx_http_proxy_connect_module/proxy_connect.patch &&
sudo apt-get install libpcre3-dev &&
./configure --add-module=/tmp/ngx_http_proxy_connect_module &&
make && sudo make install
Em seguida, edite /usr/local/nginx/conf/nginx.conf
e faça com que fique assim (incluí um exemplo de domínios que você deseja bloquear, que funciona com proxy SSL e não SSL):
user www-data;
worker_processes auto;
events { }
http {
server_names_hash_bucket_size 128;
server {
listen 8888;
server_name spam.example.com *.spam.example.com;
server_name spam2.example.com *.spam2.example.com;
access_log off;
return 404;
}
server {
listen 8888;
server_name ~.+;
proxy_connect;
proxy_max_temp_file_size 0;
resolver 8.8.8.8;
location / {
proxy_pass http://$http_host;
proxy_set_header Host $http_host;
}
}
}
Então corra /usr/local/nginx/sbin/nginx
. Ele coexistirá alegremente com o nginx
pacote padrão do Debian se você também estiver executando um servidor web de produção na porta 80 e não quiser arriscar mexer com isso (mas certifique-se de iniciar a /usr/local
versão separadamente na inicialização); alternativamente, com mais configuração você pode executar os dois serviços do nginx que você compilou. Mas se você configurar seu nginx compilado para rodar em uma porta para a qual seu firewall permite tráfego, cuidado, você terá que verificar manualmente as atualizações de segurança do nginx, pois o sistema de pacotes Debian não fará mais isso por você.
Responder4
Demorou algum tempo para minha equipe descobrir como fazer isso funcionar. Finalmente, conseguimos isso incorporando o trecho abaixo no nginx.conf:
stream {
map_hash_bucket_size 128;
map $ssl_preread_server_name $sphere {
site-01.example.com site-01;
site-02.example.com site-02;
}
upstream site-01 {
server 192.168.0.1:443;
}
upstream site-02 {
server 192.168.0.2:443;
}
server {
listen 443;
proxy_pass $sphere;
ssl_preread on;
}
}