Estou usando um servidor Nginx como proxy reverso. Ele atende tráfego HTTP e HTTPS e despacha as chamadas para vários sites somente HTTP.
Recentemente, eu queria poder criptografar o tráfego entre o Nginx e o servidor subjacente. O Nginx ainda descriptografa o tráfego HTTPS que recebe da Internet como antes, mas deve usar HTTPS com um certificado diferente para acessar o servidor subjacente.
Comecei a alterar a configuração, seguindo a documentação oficial . No entanto, proxy_ssl on
pode ser definido apenas dentro de um stream
nível , e não http
. Isso é confirmado pelo nginx -t
que mostra a linha que contém proxy_ssl on;
o seguinte erro:
diretiva "proxy_ssl" não é permitida aqui [...]
Minha dificuldade é que estou usando o Nginx para registrar tráfego, adicionar cabeçalhos, etc., então tenho que usar http
. Se meu entendimento estiver correto, o stream
nível é necessário quando o Nginx é usado para transmitir tráfego HTTPS diretamente, sem a capacidade de descriptografá-lo (ou seja, SSL Pass-thru), o que não é meu caso.
Posso fazer com que o Nginx se conecte por meio de HTTPS ao servidor subjacente enquanto ainda estiver usando http
o nível e todos os seus benefícios, como log e alteração de cabeçalhos?
Configuração atual:
http {
proxy_set_header ... # Logging and custom headers.
...
upstream demo-failover {
server demo1.example.com:443 weight=1000 max_fails=0;
server demo2.example.com:443 backup;
}
server {
listen 80 proxy_protocol;
listen 443 ssl http2 proxy_protocol;
server_name demo.example.com;
# HTTPS configuration for public exchange (Internet <-> Nginx).
ssl_certificate /.../fullchain.pem;
ssl_certificate_key /.../privkey.pem;
ssl_stapling on;
ssl_stapling_verify on;
# HTTPS configuration for private exchange (Nginx <-> underlying server).
proxy_ssl on; # This is the line which is invalid.
proxy_ssl_trusted_certificate /.../ca.pem;
proxy_ssl_certificate /.../demo.pem;
proxy_ssl_certificate_key /.../demo.key;
proxy_ssl_verify on;
proxy_ssl_verify_depth 2;
proxy_ssl_session_reuse on;
if ($scheme = http) {
return 301 https://$server_name$request_uri;
}
location / {
proxy_pass http://demo-failover;
proxy_next_upstream error timeout invalid_header;
proxy_connect_timeout 2;
proxy_redirect off;
proxy_http_version 1.1;
}
}
}
Encontrei.
Não há necessidade de mudar para
stream
, e não há necessidade de usarproxy_ssl on
.Um exemplo diferente da documentação oficial mostra como usar HTTPS em
http
nível. O truque (e esse foi o meu erro quando tentei removerproxy_ssl on
e me encontrei com o Nginx tentando chamar o servidor subjacente usando HTTP) é oproxy_pass
valor. No meu caso, mantive o valor original:Em vez disso, eu deveria ter mudado para
https
: