Обратный прокси-сервер Nginx не работает с Gunicorn через SSL-соединение LetsEncrypt - PullRequest
0 голосов
/ 28 сентября 2019

У меня EC2 Ubuntu 18.04 Server с платформой Python Flask, работающей на Gunicorn сервере приложений с Nginx обратным прокси-сервером, прослушивающим порты 80 и 443. Я добавил LetsEncrypt для домена с помощью certbot.

Сайт отлично работает без ssl.При конфигурации LetsEncrypt ssl на Nginx сервер не может загрузить страницу.Моя предыдущая конфигурация supervisor и Nginx без поддержки ssl выглядит следующим образом, и 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

Когда я изменяю конфигурацию Nginx навключить поддержку LetsEncrypt при прослушивании через порты 80 и 443, веб-сайт не появляется .. Он показывает неопределенные 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>
...

Ранее был Stackoverflow вопрос о gunicorn поверх ssl с параметрами ssl, который можно добавить в supervisor config.Я считаю, что ошибка должна быть в конфигурации Nginx на порту 443 или Gunicorn supervisor config config.Если бы вы могли взглянуть, я был бы признателен.

1 Ответ

0 голосов
/ 30 сентября 2019

У вас слишком много 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.

Ранее был вопрос Stackoverflow о gunicorn over ssl с параметрами ssl, которые можно добавить вконфиг супервизораЯ полагаю, что ошибка должна быть в конфигурации Nginx.

Вы завершаете SSL на nginx, а затем переходите к gunicorn в обычном HTTP (что является правильным способом работы с задействованным nginx).Вопрос, который вы связали, связан с добавлением нативной поддержки SSL в gunicorn, чтобы gunicorn прекратил SSL.Это потребуется только в том случае, если ваши интернет-пользователи подключаются напрямую к серверу gunicorn.

...