django - 将 SSL 与 Gunicorn/Django/Nginx 应用程序一起使用时出现混合内容错误
问题描述
我正在尝试为Superdesk的实例配置 HTTPS,该实例使用 Gunicorn 和 Nginx 进行路由。我安装了证书并且(我认为)在服务器上工作。然而,将浏览器指向应用程序会在 Firefox 和“WebSocket 连接到'ws://localhost/ws' 失败:Chrome 上的连接建立错误:net::ERR_CONNECTION_REFUSED"。这个应用程序的文档几乎不存在,我现在花了无数个小时试图让它工作。我在 GitHub 上向开发人员提交了一个问题,但我没有得到太多的答案。这是我的 Nginx 配置:
server {
listen 80;
listen 443 ssl;
server_name my_server_name;
ssl on;
ssl_certificate /path/to/my/cert.pem;
ssl_certificate_key /path/to/my/key/key.pem;
location /ws {
proxy_pass http://localhost:5100;
proxy_http_version 1.1;
proxy_buffering off;
proxy_read_timeout 3600;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
location /api {
proxy_pass http://localhost:5000;
proxy_set_header Host localhost;
expires epoch;
sub_filter_once off;
sub_filter_types application/json;
sub_filter 'http://localhost' 'http://$host';
}
location /contentapi {
proxy_pass http://localhost:5400;
proxy_set_header Host localhost;
expires epoch;
}
location /.well-known {
root /var/tmp;
}
location / {
root /opt/superdesk/client/dist;
# TODO: use "config.js:server" for user installations
sub_filter_once off;
sub_filter_types application/javascript;
sub_filter 'http://localhost' 'http://$host';
sub_filter 'ws://localhost/ws' 'ws://$host/ws';
}
location /mail {
alias /var/log/superdesk/mail/;
default_type text/plain;
autoindex on;
autoindex_exact_size off;
}
}
这是我第一次使用 nginx/gunicorn/django 应用程序,我完全迷失了。有人能指出我正确的方向吗?
解决方案
对于任何尝试设置 Superdesk 并遇到相同问题的人,我终于找到了正确的配置。
首先,这是我必须处理 HTTPS 请求并将 HTTP 请求重定向到 HTTPS 的 Nginx 配置:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name my.domain.com;
ssl on;
ssl_certificate /path/to/my/cert.pem;
ssl_certificate_key /path/to/my/key.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
location /ws {
proxy_pass http://localhost:5100;
proxy_http_version 1.1;
proxy_buffering off;
proxy_read_timeout 3600;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
location /api {
proxy_pass http://localhost:5000;
proxy_set_header Host my.domain.com;
expires epoch;
sub_filter_once off;
sub_filter_types application/json;
sub_filter 'http://localhost' 'https://$host';
}
location /contentapi {
proxy_pass http://localhost:5400;
proxy_set_header Host my.domain.com;
expires epoch;
}
location /.well-known {
root /var/tmp;
}
location / {
root /opt/superdesk/client/dist;
# TODO: use "config.js:server" for user installations
sub_filter_once off;
sub_filter_types application/javascript;
sub_filter 'http://localhost' 'https://$host';
sub_filter 'ws://localhost/ws' 'wss://$host/ws';
}
location /mail {
alias /var/log/superdesk/mail/;
default_type text/plain;
autoindex on;
autoindex_exact_size off;
}
}
server {
listen 80;
listen [::]:80;
server_name my.domain.com;
return 301 https://$host$request_uri;
}
我在配置中缺少的内容:
该proxy_set_header
字段必须设置为proxy_set_header Host <my_domain name>
并且在该sub_filter
字段中,只有第二个参数必须设置为使用 HTTPS
必须配置的特定于 Superdesk 的东西:
在 /opt/superdesk/activate.sh 中,将 HOST_SSL 设置为HOST_SSL=${HOST_SSL:-s}
. 这将确保通过邮件发送的链接(如密码剩余电子邮件)以 HTTPS 发送。
回想起来似乎很简单,但是哇,由于对 Nginx 的了解有限,很难弄清楚......
推荐阅读
- javascript - 将对象数据传递给引导模式
- javascript - 如何在日期选择器中开始年份范围?
- redis - 用于开发环境的 Redis 设置
- sql - 计算历史平均值并检查当前值是否大于 3 的 SQL 查询
- regex - 正则表达式:如何在其他捕获字符之前匹配一个字符?
- c# - 如果字符串数据数组不同,则增加位置 C# (Unity)
- amazon-web-services - 在 AWS CodeBuild 中缓存 Gradle 包装器
- java - 何时准确使用 servlet 请求和响应?
- python - 在 Windows 上安装 Caffe 时出现“Invalid Integer Constant Expression”错误
- single-sign-on - LB 上的 TLS 版本问题