我已经在Gunicorn
应用服务器上运行了带有Python Flask框架的EC2 Ubuntu 18.04服务器,并在端口80和443上侦听了Nginx
反向代理。我为域添加了LetsEncrypt
使用certbot。
没有ssl,该网站可以正常运行。使用LetsEncrypt
上的Nginx
ssl配置,服务器无法加载页面。
我以前的不支持ssl的supervisor
和Nginx
的配置如下,Nginx
与gunicorn
可以正常使用。
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>
的配置信息。如果您可以看一下,我将不胜感激。
答案 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服务器时,才需要这样做。