404

Подключение SLL для Flask сервера с помощью Gunicorn и NGINX

Через ssh от ROOT пользователя устанавливаем nginx и python3:

apt update
apt upgrade -y
apt install nginx python3 python3-pip python3-venv

Если залочен порт 8080 разблокируем:

iptables -A INPUT -p tcp --destination-port 8080 -j DROP

Настройка Flask

Создаем каталоги и устанавливаем Flask

mkdir -p /var/www/flask
cd /var/www/flask
python3 -m venv hello-world
source hello-world/bin/activate
cd hello-world
pip3 install gunicorn flask

Создаем приложение app.py:

nano app.py

с содержимым:

from flask import Flask

app = Flask( __name__ ) 
@app.route('/')
    def index():
        return "Hello from Flask!"

Тестируем Gunicorn

Простая команда для теста:

gunicorn -b 127.0.0.1:8080 app:app

Теперь приложение запустилось в локальной сети. Для поддержки мультипроцесинга набираем:

gunicorn -w 2 -b 127.0.0.1:8080 app:app

Создадим службу для Flask

nano /lib/systemd/system/flask.service

с содержимым:

[Unit]
Description=Gunicorn Flask Application
After=network.target
After=systemd-user-sessions.service
After=network-online.target

[Service]
User=root
Type=simple
ExecStart=/var/www/flask/hello-world/start.sh
TimeoutSec=30
Restart=on-failure
RestartSec=15
StartLimitInterval=350
StartLimitBurst=10

[Install]
WantedBy=multi-user.target

для службы создадим start.sh:

nano /var/www/flask/hello-world/start.sh

с содержимым:

#!/bin/bash
echo Starting Flask example app.
cd /var/www/flask
source hello-world/bin/activate
cd hello-world
gunicorn -w 2 -b 127.0.0.1:8080 app:app

Делаем файл исполняемым:

chmod +x /var/www/flask/hello-world/start.sh

Запускаем службу

systemctl enable flask

Настраиваем NGINX

Для теста стандартного соединения 8080 Удаляем старые настройки:

rm /etc/nginx/sites-enabled/default
cd /etc/nginx/sites-enabled
nano reverse-proxy.conf

И вводим новые:

server {
listen 80;
listen [::]:80;
server_name _;
access_log /var/log/nginx/reverse-access.log;
error_log /var/log/nginx/reverse-error.log;

location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header HOST $http_host;
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
}
}

Перезапускаем службу:

systemctl restart nginx

Включаем поддержку HTTPS:

Копируем сертификат в директорию: ssl_certificate /etc/ssl/certs/ И ключ от сертификата в директорию ssl_certificate_key /etc/ssl/private/

Если сертификата нет, то создаем самопистный:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/selfsigned.key -out /etc/ssl/certs/selfsigned.crt

Затем нам нужно создать группу Диффи-Хеллмана, которая используется для дополнительной безопасности. На сервере это займет около 20 минут.

openssl dhparam -out /etc/nginx/dhparam.pem 4096

Добавляем эти настройки в NGINX:

rm /etc/nginx/sites-enabled/reverse-proxy.conf
nano /etc/nginx/sites-enabled/reverse-proxy.conf

с содержимым:

server {
listen 80;
listen [::]:80;
server_name example.com;

return 302 https://$server_name$request_uri;
}

server {
listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate /etc/ssl/certs/selfsigned.crt;
ssl_certificate_key /etc/ssl/private/selfsigned.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;

location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header HOST $http_host;
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
}
}

для самописного сертификата меняем:

ssl_certificate /etc/ssl/certs/selfsigned.crt;
ssl_certificate_key /etc/ssl/private/selfsigned.key;
ssl_dhparam /etc/nginx/dhparam.pem;

Не забываем заменить selfsigned.crt; selfsigned.key; example.com; на свои параметры:

Перезапускаем службу:

systemctl restart nginx