SSL、Django、Gunicorn、NGINX - 无法使用 https:// + domain.com 访问网站

SSL、Django、Gunicorn、NGINX - 无法使用 https:// + domain.com 访问网站

我最近推出了一个使用 SSL 的网站,特别是 Comodo PositiveSSL。

我遇到的唯一问题是无法使用

https://example.com

我已经在 NGINX 中为 http 设置了重定向。这是我的配置:

upstream myapp {
    server localhost:8000;
}

server {
    listen 80;
    server_name www.example.com example.com;
    root /var/www/;
    if ($host !~* ^(example.com|www.example.com)$ ) {
        return 444;
    }
    return 301 https://$host$request_uri;
}

server {
    listen 443 default ssl;
    root /var/www/;
    server_name www.example.com example.com;
    if ($host !~* ^(example.com|www.example.com)$ ) {
      return 444;
    }

    ssl_certificate      /etc/nginx/ssl/my_crt.crt;
    ssl_certificate_key  /etc/nginx/ssl/my_crt.key;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;

    access_log /var/log/nginx/myapp_access.log;
    error_log /var/log/nginx/myapp_error.log;
    gzip on;
    gzip_http_version 1.0;
    gzip_proxied any;
    gzip_types text/css application/x-javascript;
    gzip_vary on;
    client_max_body_size 0;
    try_files $uri @myapp;

    location ~*  \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 365d;
    }

    location @myapp {
        client_max_body_size 0;
        proxy_pass http://domain;
        proxy_redirect off;
        proxy_read_timeout 5m;
        proxy_set_header Host            $host;
        proxy_set_header X-Real-IP       $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

我的 DNS 注册商是 namecheap,并且我在 cpanel 中设置了 url 重定向:

host: @
value: http://www.example.com

通过这个我能够使用以下命令成功访问我的网站:

example.com = 302 Moved Temporarily
www.example.com = 302 Moved Temporarily
http://example.com = 302 Moved Temporarily
http://www.example.com = 302 Moved Temporarily

但这里却并非如此:

https://example.com = Failed to connect to domain.com port 443: Connection refused

我目前正在确保我的 SSL 证书允许以下两项操作:

https://example.com
https://www.example.com

似乎有文档说明了这一点:

Secures: www.site.com and site.com

任何能帮助我纠正错误问题的见解都将不胜感激。

谢谢。

更新:netstat -an | grep 443输出:

tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN
unix 2 [ ACC ] STREAM LISTENING 6131379 /tmp/ssh-Cpqcfwspdv/agent.25443

答案1

因为你得到了连接被拒绝错误在监听套接字时TCP/443我认为肯定是数据包过滤器在传输过程中造成的。请检查主机上的防火墙配置,如果防火墙已禁用,请检查传输过程中的任何中间防火墙。

答案2

如果你的 NGINX 配置匿名化是正确的,那么你的proxy_pass指令很可能是错误的。在当前状态下,到的连接http://example.com被重定向到https://example.com您点击try_files指令首先尝试从 提供文件/var/www/,如果不行,则将请求传递到指定位置@myapp

这就是我觉得奇怪的地方。我想象这应该是命中 Gunicorn 实例(上游myapp),但它却将请求代理到,http://domain而它最有可能被传递给http://myapp

它没有解释为什么http://domain似乎被转换为https://domain.com但无论如何,我建议你尝试一下。

答案3

感谢 @drookie 和 @Ginnungagap 的指导。通过这些指导,我能够排除服务器连接和 NGINX 配置的潜在原因。最终的解决方案分为两部分,其中一部分来自我的域名注册商 namecheap。解决方案如下:

1) 创建 A 记录以将我的裸域 (example.com) 指向我的服务器 IP 地址。2) 更新我的 nginx 配置以考虑流向 example.com 和 www.example.com 的流量

@Ginnungagap 在我最初的问题中尝试伪造我的 nginx 配置时,我proxy_pass错误地输入了指令。它被传递给http://myapp

我在这里找到了更优化、更安全的配置nginx 配置

我根据他的配置调整了我的配置(为了更好的衡量,添加了额外的 SSL 安全指令)但最终看起来非常相似。

再次非常感谢您就此事付出的时间和指导。

相关内容