Flask – установка веб framework-а на Ubuntu 22.04 с nginx и Gunicorn. Прикрепление домена и установка SSL Let’s Encrypt
Flask framework: https://palletsprojects.com/p/flask/
Установка дополнительного ПО (в том числе nginx и ssl let’s encrypt генератор python3-certbot-nginx):
# apt update # apt install python3-pip python3-dev build-essential libssl-dev libffi-dev python3-setuptools net-tools htop nginx python3-certbot-nginx -y
Дать права sudo пользователю Ubuntu user1.
# sudo adduser $user1 admin,
где $user1 - имя пользователя.
Создаем Виртуальное Окружение Python – myenv1:
# apt install python3-venv # adduser user1 # chmod 755 /home/user1/ # su user1 $ mkdir ~/myproject $ cd ~/myproject $ python3 -m venv myenv1 $ source myenv1/bin/activate
Создаем простой проект – импортируем Flask и экземпляр обьекта Flask:
# vi ~/myproject/myapp.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "<h1 style='color:blue'>Hello IPHOSTER!</h1>"
if __name__ == "__main__":
app.run(host='0.0.0.0')
Запускаем и проверяем через 5000 порт:
$ python ~/myproject/myapp.py
заходим на
http://Server_IP:5000/
Создаем WSGI Entry Point чтобы – сообщит Gunicorn как взаимодействовать с приложением:
$ vi ~/myproject/wsgi.py
from myapp import app
if __name__ == "__main__":
app.run()
Конфигурация Gunicorn:
$ cd ~/myproject $ gunicorn --bind 0.0.0.0:5000 wsgi:app
Проверяем вход через 5000 порт:
http://Server_IP:5000/
Выходим CTRL+C и CTRL+D
Создаем systemd service unit file для нашего приложения чтобы автоматически запускать его
# vi /etc/systemd/system/myproject.service
[Unit]
Description=Gunicorn instance
After=network.target
[Service]
User=user1
Group=www-data
WorkingDirectory=/home/user1/myproject
Environment="PATH=/home/user1/myproject/myenv1/bin"
ExecStart=/home/user1/myproject/myenv1/bin/gunicorn --workers 3 --bind unix:myapp.sock -m 007 wsgi:app
[Install]
WantedBy=multi-user.target
Запускаем юнит, добавляем в автозагрузку и проверяем статус:
# systemctl start myproject # systemctl enable myproject # systemctl status myproject
Настраиваем проксирование для нашего домена через nginx на наш unix:myapp.sock:
# vi /etc/nginx/sites-available/myapp server { listen 80; server_name site.ru www.site.ru; location / { include proxy_params; proxy_pass http://unix:/home/user1/myproject/myapp.sock; } }
# ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
Ставим SSL Let’s Encrypt и делаем редирект http –> https:
# certbot --nginx -d site.ru -d www.site.ru
Конфиг меняется автоматом в
/etc/nginx/sites-enabled/myapp
Строки, которые отвечаю за редирект http –> https:
if ($host =site.ru) { return 301 https://$host$request_uri; } # managed by Certbot
В конце рестарнуть nginx:
# sudo systemctl restart nginx
# sudo systemctl restart myproject
Крон задача по обновлению сертификатов через certbot прописана в файле /etc/cron.d/certbot
/etc/cron.d/certbot 0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew
Домен по “A” записи можно направить через ДНС сервера Cloudflare.
👍🏼👍🏼👍🏼