Nginx 反向代理无法通过 LetsEncrypt SSL 连接与 Gunicorn 一起工作



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

该网站在没有 ssl 的情况下运行良好。在NginxLetsEncryptssl 配置时,服务器无法加载页面。 我以前没有 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时,枪角兽工作正常。

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>
...

之前有关于 SSLgunicorn的 Stackoverflow 问题,其中包含可以添加到supervisor配置中的 ssl 参数。 我相信错误一定与端口 443 上的Nginx配置或Gunicornsupervisor配置信息有关。如果你能看一看,我将不胜感激。

你有太多的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;
}

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

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

之前有关于 ssl上的 gunicorn 的 Stackoverflow 问题,其中包含可以添加到主管配置中的 ssl 参数。我相信错误一定与 Nginx 配置有关。

你在nginx上终止SSL,然后在普通HTTP中代理到gunicorn(这是涉及nginx的正确操作方式(。 您在那里链接的问题是关于向 gunicorn 添加本机 SSL 支持,以便 gunicorn 终止 SSL。 仅当您基于互联网的用户直接连接到 gunicorn 服务器时,才需要这样做。

最新更新