Nginx反向代理无法通过LetsEncrypt SSL连接与Gunicorn配合使用

时间:2019-09-28 14:59:45

标签: ssl nginx gunicorn

我已经在Gunicorn应用服务器上运行了带有Python Flask框架的EC2 Ubuntu 18.04服务器,并在端口80和443上侦听了Nginx反向代理。我为域添加了LetsEncrypt使用certbot。

没有ssl,该网站可以正常运行。使用LetsEncrypt上的Nginx ssl配置,服务器无法加载页面。 我以前的不支持ssl的supervisorNginx的配置如下,Nginxgunicorn可以正常使用。

server {
        listen 80;
        server_name example.com www.example.com;

        location /static {
                alias /home/ubuntu/myapp-backend/myapp/static;
        }

        location / {
                proxy_pass http://localhost:8000;
                include /etc/nginx/proxy_params;
                proxy_redirect off;
        }
}
[program:myapp]
directory=/home/ubuntu/myapp-backend
command=/home/ubuntu/myapp-backend/venv/bin/gunicorn -w 5 run:app
user=ubuntu
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
stderr_logfile=/var/log/myapp/myapp.err.log
stdout_logfile=/var/log/myapp/myapp.out.log

当我在侦听端口80和443时将Nginx配置更改为包括LetsEncrypt支持时,该网站没有显示。它显示了无限的301重定向请求。

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://www.example.com$request_uri;
}

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    return 301 https://www.example.com$request_uri;
}

server {
    listen 443 ssl;
    server_name www.example.com;

    ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location /static {
            alias /home/ubuntu/myapp-backend/myapp/static;
    }

    location / {
            proxy_pass http://localhost:8000;
            include /etc/nginx/proxy_params;
            proxy_redirect off;
    }
}

当我加载网站example.com时,它重定向到https:\\www.example.com。但是,网站主页无法加载或显示来自服务器/ Nginx的任何响应。当我登录到服务器并运行curl -v localhost:8000时,古尼corn正常工作。

curl -v localhost:8000
* Rebuilt URL to: localhost:8000/
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8000 (#0)
> GET / HTTP/1.1
> Host: localhost:8000
> User-Agent: curl/7.58.0
> Accept: */*
>
< HTTP/1.1 500 INTERNAL SERVER ERROR
< Server: gunicorn/19.9.0
< Date: Sat, 28 Sep 2019 14:14:47 GMT
< Connection: close
< Content-Type: text/html; charset=utf-8
< Content-Length: 27911
<
<!doctype html>
...

gunicorn上的supervisor上的Stackoverflow question较早,而ssl parameters的ssl可以添加到Nginx配置中。 我相信该错误必定是端口443上的Gunicorn配置或supervisor <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>netstandard2.1; netstandard2.0</TargetFrameworks> </PropertyGroup> </Project> 的配置信息。如果您可以看一下,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

您有太多server个区块

使用SSL配置的第二个块,捕获到443的连接,并将它们重定向到https:// URL。从而导致无限循环:

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    return 301 https://www.example.com$request_uri;
}

仅当用户在端口301上访问服务器时,才应返回此80。这就是该配置文件中第一个server块的实际作用。

删除整个块,它应该可以工作。您已经将第三个服务器块配置为(正确)捕获到443的流量并将其代理到gunicorn。

  

之前有关于带有ssl参数的ssl上的gunicorn的Stackoverflow问题,可以将其添加到超级用户配置中。我相信该错误一定与Nginx配置有关。

您要在nginx处终止SSL,然后以纯HTTP代理到gunicorn(这是在涉及nginx时进行操作的正确方法)。您所链接的问题是关于向gunicorn添加本机SSL支持,以便gunicorn终止SSL。仅当您的基于Internet的用户直接连接到gunicorn服务器时,才需要这样做。