Через 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
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 -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
Для теста стандартного соединения 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
Копируем сертификат в директорию: 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