nginx 1.7.9 no linux
Questão:
Ao usar o nginx, os servidores da Web veem todas as solicitações como provenientes de http, mesmo quando chegam via https.
Usando o rastreamento de solicitação do IIS, vemos a solicitação chegando assim, mesmo quando a solicitação externa (do navegador) é https://myapp.com:443/appdir/
:
RequestURL="http://myapp.com:80/appdir/"
Mas em nosso balanceador de carga de hardware (que estamos tentando eliminar), ele vem corretamente como:
RequestURL="https://myapp.com:443/appdir/"
O aplicativo precisa ver o https, depende disso. (Ele tenta forçar as conexões a serem seguras.)
Sabemos como usar o X-Forwarded-Proto e similares para informar ao aplicativo que a solicitação veio via SSL, no entanto, parte do aplicativo é construída em torno da própria solicitação e talvez não possamos modificá-la.
O balanceador de carga de hardware pode "fazer tudo" - encerrar o ssl e enviar solicitações "fingidas" de volta ao aplicativo (pela porta 80) que parecem ser solicitações para https.
Como faço para que o nginx passe o URL de solicitação completo e inalterado de volta aos servidores?
Configuração:
http {
upstream sandbox_site {
least_conn;
# we pipe to back end on port 80 only, so that nginx handles all ssl
server 192.168.2.16:80 max_fails=1 fail_timeout=60s; # sbox3-site is .2.16
}
server {
# This is sandbox.myapp.com block **************************************
listen 192.168.2.27:80;
server_name sandbox.myapp.com;
location / {
proxy_pass http://sandbox_site;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
# This is SSL version of sandbox.myapp.com block **************************************
listen 192.168.2.27:443 ssl;
server_name sandbox.myapp.com;
ssl_certificate new-sandbox-myapp-com.cer;
ssl_certificate_key new-sandbox-myapp-com.key;
ssl_protocols SSLv3 TLSv1;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://sandbox_site;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
Basicamente você tem duas opções:
ou você está descarregando o SSL, como está fazendo agora, pode informar aos seus back-ends que a solicitação realmente foi recebida com SSL (se foi):
mas isso certamente significa que você precisa ajustar o código, para que ele lide com esse cabeçalho.
ou, se nenhuma modificação de código for permitida, você pode parar de descarregar o SSL e, na verdade, fazer proxy de páginas de back-ends por meio dele.
Então é assim que o bloco sandbox SSL ficaria:
No entanto, esta segunda maneira é redundante: você vê, na verdade, você ainda descarrega o SSL, mas monta a solicitação SSL novamente, mesmo quando ela vem por meio de sua rede confiável. Tudo o que faz - apenas adicionando conversão desnecessária.