SSL 代理通过 NGINX 通过 Docker 导致网关错误 您所在的位置:网站首页 中国国民体质监测报告网站 SSL 代理通过 NGINX 通过 Docker 导致网关错误

SSL 代理通过 NGINX 通过 Docker 导致网关错误

2023-03-25 08:10| 来源: 网络整理| 查看: 265

问题:SSL 代理通过 NGINX 通过 Docker 导致网关错误 背景

我的设置基于以下教程:

使用 Postgres、Gunicorn 和 NGINX 对 Django 进行 Dockerizing

TL;DR:(斜体:教程未涵盖;个人冒险)

3 Docker 服务用于:nginx -> django -> postgres(箭头表示依赖)

Nginx 代理将请求传递到 Django 服务中暴露的端口。

HTTP(非 SSL)请求工作

require SSL 连接通过重定向 http -> https

详情

在尝试让它在生产中的 VPS 上工作之前,我已经生成了一个自签名证书来测试本地 NGINX 的 ssl 重定向。我对使用 NGINX 很陌生,所以我不完全确定出了什么问题或如何诊断问题。

这是我希望在下面提供的 NGINX 文件中发生的事情......(剧透:它没有):

1.去http://localhost

2.获取重定向到https://localhost

来自浏览器的关于自签名证书的警告;接受警告并继续

网站渲染良好,SSL 重定向正常!

但事实并非如此。我得到一个 502 Bad Gateway,NGINX 输出以下日志:

prod_1 | 192.168.144.1 - - [03/Jun/2019:00:01:44 +0000] "GET / HTTP/1.1" 502 158 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:67.0) Gecko/20100101 Firefox/67.0" "-" prod_1 | 2019/06/03 00:01:44 [error] 8#8: *1 peer closed connection in SSL handshake while SSL handshaking to upstream, client: 192.168.144.1, server: , request: "GET / HTTP/1.1", upstream: "https://192.168.144.3:8000/", host: "localhost"

谁能告诉我发生了什么或如何解决它?我觉得即使在 SSL 重定向之外,我的 conf 文件也可能存在一大堆错误,但我真的不知道如何识别任何问题。 conf文件如下...

upstream mysite { server web:8000; } # redirect http traffic to https server { listen 80; listen [::]:80; return 301 https://$host$request_uri; } server { listen 443 ssl; listen [::]:443 ssl; location / { proxy_pass https://mysite; proxy_ssl_server_name on; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_redirect off; } location /assets/ { alias /usr/src/site/assets/; } location /media/ { alias /usr/src/site/media/; } ssl_certificate /etc/ssl/certificates/site.crt; ssl_certificate_key /etc/ssl/certificates/site.key; ssl_session_cache builtin:1000 shared:SSL:10m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4; ssl_prefer_server_ciphers on; } 解答

根据您的错误

prod_1 | 2019/06/03 00:01:44 [error] 8#8: *1 peer closed connection in SSL handshake while SSL handshaking to upstream, client: 192.168.144.1, server: , request: "GET / HTTP/1.1", upstream: "https://192.168.144.3:8000/", host: "localhost"

我会说您可能在 Nginx 和 Django 之间存在某种协议不匹配。 Django 很可能期待非安全通信 (http)。您的 nginx 配置表明您已将其配置为通过 https 与 Django 通信:

proxy_pass https://mysite;

我的建议是确保 Nginx 和 Django 之间的通信使用相同的协议,无论是 http 还是 https。

是否要使用 http 或 https 取决于您。关于 http 在这里是否安全,有两种不同的思想流派。

第一个思想流派是 http 在这种情况下是安全的,因为通信在同一台机器内。

第二种思想流派是保护所有通信,并使用 https。但是,如果您同意这种思路,则必须确保 Web 服务器和数据库之间的通信也使用安全协议。毕竟,您的安全取决于您最薄弱的环节。

我倾向于倾向于第一流派。尽管这不一定适合您。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有