Как сделать приложение Flask с https на цифровом океане - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть приложение фляги, работающее на порте 8000 капель цифрового океана.Мне нужно было реализовать https на этом сервере, и я следовал этому уроку

https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-16-04

. На этом мой mydomain.com имеет https, а mydomain.com:8000 - нет.«т.Я пытался поместить

    listen 8000 ssl;
    listen [::]:8000 ssl;
    server_name funders-api.ninja www.funders-api.ninja;
    ssl_certificate /etc/letsencrypt/live/funders-api.ninja/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/funders-api.ninja/privkey.pem; # managed by Certbot
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
} 

на мой nginx congif, но все равно не работает.С помощью приведенного выше кода я не могу запустить мое приложение фляги, потому что порт 8000 уже используется из процесса nginx

Мой полный файл конфигурации выглядит так:

server {

    # SSL configuration
    #
    # listen 443 ssl default_server;
    # listen [::]:443 ssl default_server;
    #
    # Note: You should disable gzip for SSL traffic.
    # See: https://bugs.debian.org/773332
    #
    # Read up on ssl_ciphers to ensure a secure configuration.
    # See: https://bugs.debian.org/765782
    #
    # Self signed certs generated by the ssl-cert package
    # Don't use them in a production server!
    #
    # include snippets/snakeoil.conf;

    root /var/www/html;

    # Add index.php to the list if you are using PHP
    index index.html index.htm index.nginx-debian.html;

    server_name funders-api.ninja www.funders-api.ninja;

    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        try_files $uri $uri/ =404;
    }

    # pass PHP scripts to FastCGI server
    #
    #location ~ \.php$ {
    #   include snippets/fastcgi-php.conf;
    #
    #   # With php-fpm (or other unix sockets):
    #   fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
    #   # With php-cgi (or other tcp sockets):
    #   fastcgi_pass 127.0.0.1:9000;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #   deny all;
    #}

    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/funders-api.ninja/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/funders-api.ninja/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot


}
server {
    listen 8000 ssl;
    listen [::]:8000 ssl;
    server_name funders-api.ninja www.funders-api.ninja;
    ssl_certificate /etc/letsencrypt/live/funders-api.ninja/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/funders-api.ninja/privkey.pem; # managed by Certbot
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
}

# Virtual Host configuration for example.com
#
# You can move that to a different file under sites-available/ and symlink that
# to sites-enabled/ to enable it.
#
#server {
#   listen 80;
#   listen [::]:80;
#
#   server_name example.com;
#
#   root /var/www/example.com;
#   index index.html;
#
#   location / {
#       try_files $uri $uri/ =404;
#   }
#}

server {
    if ($host = www.funders-api.ninja) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    if ($host = funders-api.ninja) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80 default_server;
    listen [::]:80 default_server;

    server_name funders-api.ninja www.funders-api.ninja;
    return 404; # managed by Certbot

}

1 Ответ

1 голос
/ 23 сентября 2019

Только 1 приложение / служба могут прослушивать 1 конкретный порт.

Если ваше приложение фляги уже прослушивает порт 8000, nginx не может.

Обычные соединения https входят через порт 443.

Я бы изменил конфигурацию на:

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name funders-api.ninja www.funders-api.ninja;
    ssl_certificate /etc/letsencrypt/live/funders-api.ninja/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/funders-api.ninja/privkey.pem; # managed by Certbot
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
    location / {
        include proxy_params;
        proxy_pass http://127.0.0.1:8000;
    }

}

Таким образом, безопасное соединение входит через порт 443, проверяется с помощью nginx с сертификатами

    ssl_certificate /etc/letsencrypt/live/funders-api.ninja/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/funders-api.ninja/privkey.pem; # managed by Certbot

И затем вы делаете прокси на порт, который слушает ваше приложение фляги(как только соединение будет установлено).

Это пример того, как я это сделаю.Если nginx - это тот, кто обрабатывает соединение с сертификатом, то nginx должен прослушивать порт, через который вы устанавливаете соединение, и затем прокси-соединение к вашему приложению фляги.

Если ваш запрос сделан непосредственноприложение фляги, nginx ничего не делает, так как соединение не прошло через него.

Если у вас есть какие-либо вопросы, не сомневайтесь, спрашивая меня.

...