Nginx代理传递到https

23

我们有: Ubuntu 16.04
nginx 1.10.3

我是nginx的新手,需要在proxy_pass到https时寻求帮助。
我们的客户在互联网上调用一个url,例如。

https://testapp.mobios.example.com

我想将这个流量传递到IP地址为192.168.0.10的服务器。 在这个服务器上,我启用了SSL并监听9443端口。

我们想要使用nginx作为反向代理。 我的nginx配置如下。

server {  
  listen 443;
  servername testapp.mobios.example.com;

  location / {
    proxy_pass https://192.168.0.10:9443;
}
}

如果客户尝试使用https://testapp.mobios.example.com联系SSL服务器,他们将得到无响应的结果。

我的需求只是将https传递给https。这里SNI有问题吗?

有任何想法吗? 请帮帮忙 ayyoladi


1
这篇文章在这里似乎是相关的:https://reinout.vanrees.org/weblog/2017/05/02/https-behind-proxy.html - x-yuri
3个回答

8
server {
    listen 80;
    server_name website.domain.com;
    return 301 https://$server_name$request_uri;
}

server {
        listen 443 ssl;
        listen [::]:443 ssl;
        server_name website.domain.com;

       #Size archive        client_max_body_size 50M;

        ssl_certificate          /etc/letsencrypt/live/mydomain/fullchain.pem;
        ssl_certificate_key      /etc/letsencrypt/live/mydomain/privkey.pem;
        ssl_trusted_certificate  /etc/letsencrypt/live/mydomain/chain.pem;

       location / {
               proxy_set_header   X-Forwarded-For $remote_addr;
               proxy_set_header   Host $http_host;
   1   ===>    proxy_pass         https://website5.domain.ru;
[ OR ]
   2   ===>    proxy_pass         http://192.65.87.4:8020;
       }

}




2
我知道这是一个旧的帖子,但我刚刚花了两天时间追踪类似的错误,在这个错误中,它可以将https代理到谷歌,但它在我的HTTPS服务器上无法工作。即使我绕过ssl验证..对我来说,错误是proxy_set_header Host $http_host;会传递一个我的服务器会拒绝的头文件。删除它解决了我的问题。我知道在这个例子中你确实需要主机,因为你指向一个IP。 - zzarbi
1
哈哈,我忘了提到那一部分。当时,我们专注于一个示例的重定向。 - AnonymousWebHacker
1
@zzarbi 你的回答对我很有帮助。谢谢! - undefined

8

虽然问题不是完全相同,但类似的问题引导我来到这里。

HTTPS负载均衡:

Client <- HTTPS -> (decrypt) Load balancer (encrypt) <- HTTPS -> Server

通常来说,这个答案 (http://reinout.vanrees.org/weblog/2017/05/02/https-behind-proxy.html) 很好,部分地解决了我的问题,但是添加负载均衡使得它更难以通过谷歌解决。

当您创建上游列表时,必须记住添加 443 端口。

不起作用:

upstream myapp2 {
  server 10.0.1.1;
}

工作原理:

upstream myapp2 {
  server 10.0.1.1:443;
}

即使您在 location 中使用 https 协议(我预期默认指向 443),也是这样的:
location / {
  proxy_pass https://myapp2;
}

完整示例:

http {
  upstream myapp2 {
    server 10.0.1.1:443;
  }

  server {
    listen 443;

    ssl_certificate     /etc/nginx/cert.crt;
    ssl_certificate_key /etc/nginx/cert.key;

    ssl on;

    location / {
      proxy_pass https://myapp2;
    }
  }
}

答案基于我最终在thisisayush评论的帮助下找到的文档:

https://docs.nginx.com/nginx/admin-guide/security-controls/securing-http-traffic-upstream/#complete-example

注:本文段保留了HTML标签。


我可能遇到了同样的问题。在我的情况下,我有一个带有TLS的Nginx服务器,它代理请求到一个也带有TLS的Gunicorn服务器。Gunicorn正在监听端口8080,而Nginx正在(对外)监听端口443。从你提供的文档来看,你认为我需要将Gunicorn监听的端口从8080更改为443,然后更新我的Nginx中的上游吗? - Jaume Sabater
你好Jaume。在我看来,你的Gunicorn端口是什么并不重要——只要8080是HTTPS端口而不是HTTP端口即可。但请注意,通常8080是默认的开发HTTP(无S)端口。8443有时是默认的开发HTTPS端口(但可能需要启用并添加证书!)。另一方面,如果你在同一台机器上运行Nginx和Gunicorn,你需要不同的端口——因此选择Gunicorn上的443端口将会破坏Gunicorn或Nginx的启动。 - Łukasz Kotyński
1
感谢您的回复,Lukasz。我可以确认Gunicorn与TLS在8080端口上运行良好,我遇到的任何Nginx问题都是与HTTP2相关的Nginx错误,与Gunicorn无关。 - Jaume Sabater

2
我曾为我的客户做过这件事。您需要在Nginx中启用并安装SSL,而不是在被代理的服务器上进行操作。

2
嗨,thisisayush,感谢您的回答。我不想在nginx上安装ssl。我只想将来自互联网的https流量内部传递到服务器。 - mobios
1
请查看https://reinout.vanrees.org/weblog/2017/05/02/https-behind-proxy.html,这可能会有所帮助 :) - thisisayush
4
在这种情况下,您需要一个TCP隧道。我不确定它在SSL方面的工作效果如何。但是,如果您想使用nginx代理SSL流量,则需要SSL证书 - 代理的本质是它将查看流量并重新封装它,因此需要SSL来完成这个过程。 - Rolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接