Linux 上的 nginx 1.7.9
问题:
使用 nginx 时,Web 服务器将所有请求视为来自 http,即使它们是通过 https 进入的。
使用 IIS 请求跟踪,我们看到请求是这样进来的,即使外部(来自浏览器)请求是https://myapp.com:443/appdir/
:
RequestURL="http://myapp.com:80/appdir/"
但是在我们的硬件负载均衡器(我们正试图逐步淘汰)上,它正确地出现在:
RequestURL="https://myapp.com:443/appdir/"
该应用程序需要看到https,这取决于它。(它试图强制连接安全。)
我们知道使用 X-Forwarded-Proto 等来告诉应用程序请求是通过 ssl 进来的,但是应用程序的一部分是围绕请求本身构建的,我们可能无法修改它。
硬件负载均衡器可以“全部完成”——终止 ssl,并将“假装”请求发送回应用程序(通过端口 80),这些请求似乎是对 https 的请求。
如何让 nginx 将完整的、未更改的请求 url 传递回服务器?
配置:
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;
}
}
}
基本上你有两个选择:
要么你正在卸载 SSL,就像你现在正在做的那样,那么你可以告诉你的后端请求实际上是用 SSL 接收的(如果是的话):
但这肯定意味着您必须调整代码,以便它处理该标头。
或者,如果不允许修改代码,您可以停止卸载 SSL,并通过它从后端实际代理页面。
所以这就是 SSL 沙盒块的样子:
但是,第二种方式是多余的:您看,您实际上仍然卸载 SSL,但随后再次组装 SSL 请求,即使它来自您的受信任网络。它所做的一切——只是增加了不必要的转换。