linux上的nginx 1.7.9
问题:
当使用nginx时,Web服务器即使通过https进入,也可以看到所有的请求。
使用IIS请求跟踪,即使外部(来自浏览器)请求是https://myapp.com:443/appdir/ ,我们也会看到这样的请求:
RequestURL="http://myapp.com:80/appdir/"
但是在我们的硬件负载平衡器(我们试图逐步淘汰)上,它的正确性如下:
RequestURL="https://myapp.com:443/appdir/"
该应用程序需要查看https,这取决于它。 (它试图强制连接安全。)
我们知道使用X-Forwarded-Proto等来告诉应用程序,请求是通过ssl传入的,然而应用程序的一部分是围绕请求本身构build的,我们可能无法修改它。
硬件负载平衡器可以“完成所有” – 终止ssl,并向应用程序发送“假装”请求(通过端口80),这似乎是对https的请求。
如何让nginx将完整的,不变的请求url传递回服务器?
configuration:
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; } }
}
基本上你有两个select:
要么卸载SSL,就像现在正在做的那样,那么您可能会告诉您的后端实际上是通过SSL接收到的请求(如果是):
proxy_set_header X-Forwarded-Proto $scheme;
但这肯定意味着你必须调整代码,所以它处理这个头。
或者,如果不允许修改代码,则可以停止卸载SSL,并通过它实际从后端代理页面。
所以这就是SSL沙箱模块的样子:
location / { proxy_pass https://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; }
但是,第二种方式是多余的:您看到,实际上您仍然卸载SSL,但是再次组装SSL请求,即使它是通过您的可信networking传送的。 它所做的只是增加不必要的转换。