我的设置基于以下教程:
使用 Postgres、Gunicorn 和 NGINX 对 Django 进行 Docker 化
TL;DR:(斜体:教程未涵盖;个人冒险)我已经生成了一个自签名证书,用于在本地测试 NGINX 的 ssl 重定向,然后再尝试使其在生产中的 VPS 上运行。我对 NGINX 的使用还很陌生,所以我不完全确定出了什么问题或如何诊断问题。
以下是我希望使用下面提供的 NGINX 文件实现的效果... (剧透:事实并非如此):
但事实并非如此。我收到 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"
Run Code Online (Sandbox Code Playgroud)
谁能告诉我发生了什么事或如何解决它?我觉得即使在 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;
}
Run Code Online (Sandbox Code Playgroud)
根据您的错误
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"
Run Code Online (Sandbox Code Playgroud)
我想说 Nginx 和 Django 之间可能存在某种协议不匹配。Django 可能期望非安全通信 (http)。您的 nginx 配置表明您已将其配置为通过 https 与 Django 通信:
proxy_pass https://mysite;
Run Code Online (Sandbox Code Playgroud)
我的建议是确保 Nginx 和 Django 之间的通信使用相同的协议,http 或 https。
您想使用 http 还是 https 由您决定。关于 http 是否安全,存在两种不同的观点。
第一种想法是,http 在这种情况下是安全的,因为通信是在同一台机器内进行的。
第二种想法是保护所有通信并使用 https。但是,如果您同意这种思路,则必须确保 Web 服务器和数据库之间的通信也使用安全协议。毕竟,您的安全取决于您最薄弱的环节。
我倾向于第一种思想流派。尽管这不一定适合您。
| 归档时间: |
|
| 查看次数: |
5333 次 |
| 最近记录: |