Flask - установка web framework-а на Ubuntu 22.04 с nginx и Gunicorn: различия между версиями
Admin iph (обсуждение | вклад) |
Admin iph (обсуждение | вклад) |
||
(не показано 14 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
− | = | + | [[Файл:B_1.gif |link=https://bit.ly/3tbFsd6| Доступная цена]] |
+ | === Flask - установка веб framework-а на Ubuntu 22.04 с nginx и Gunicorn. Прикрепление домена и установка SSL Let's Encrypt === | ||
+ | |||
+ | Видео инструкция: <br> | ||
+ | <youtube>B8MSIpep2bw</youtube> | ||
+ | <br> | ||
'''Flask framework''': https://palletsprojects.com/p/flask/ <br> | '''Flask framework''': https://palletsprojects.com/p/flask/ <br> | ||
− | Установка дополнительного ПО: | + | Установка дополнительного ПО (в том числе '''nginx''' и ssl let's encrypt генератор '''python3-certbot-nginx'''): |
# apt update | # apt update | ||
− | # apt install python3-pip python3-dev build-essential libssl-dev libffi-dev python3-setuptools -y | + | # apt install python3-pip python3-dev build-essential libssl-dev libffi-dev python3-setuptools net-tools htop nginx python3-certbot-nginx -y |
− | Создаем Виртуальное Окружение Python: | + | Создаем Виртуальное Окружение Python - '''myenv1''': |
# apt install python3-venv | # apt install python3-venv | ||
# adduser user1 | # adduser user1 | ||
+ | # chmod 755 /home/user1/ | ||
# su user1 | # su user1 | ||
$ mkdir ~/myproject | $ mkdir ~/myproject | ||
Строка 18: | Строка 24: | ||
$ source myenv1/bin/activate | $ source myenv1/bin/activate | ||
− | Ставим пакеты через pip: '''wheel''', '''gunicorn''', '''flask''' | + | Ставим пакеты через менеджер pip: '''wheel''', '''gunicorn''', '''flask''' |
$ pip install wheel gunicorn flask | $ pip install wheel gunicorn flask | ||
Successfully installed Jinja2-3.1.2 MarkupSafe-2.1.1 Werkzeug-2.1.2 click-8.1.3 flask-2.1.2 gunicorn-20.1.0 itsdangerous-2.1.2 wheel-0.37.1 | Successfully installed Jinja2-3.1.2 MarkupSafe-2.1.1 Werkzeug-2.1.2 click-8.1.3 flask-2.1.2 gunicorn-20.1.0 itsdangerous-2.1.2 wheel-0.37.1 | ||
Строка 26: | Строка 32: | ||
<source lang='python'> | <source lang='python'> | ||
− | + | 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') | ||
+ | </source> | ||
+ | |||
+ | Запускаем и проверяем через '''5000 порт''': | ||
+ | $ python ~/myproject/myapp.py | ||
+ | |||
+ | заходим на | ||
+ | http://Server_IP:5000/ | ||
+ | |||
+ | |||
+ | Создаем '''WSGI Entry Point''' чтобы - сообщит '''Gunicorn''' как взаимодействовать с приложением: | ||
+ | $ vi ~/myproject/wsgi.py | ||
+ | <source lang='python'> | ||
+ | from myapp import app | ||
+ | |||
+ | if __name__ == "__main__": | ||
+ | app.run() | ||
+ | </source> | ||
+ | |||
+ | Конфигурация '''Gunicorn''': | ||
+ | $ cd ~/myproject | ||
+ | $ gunicorn --bind 0.0.0.0:5000 wsgi:app | ||
+ | |||
+ | Проверяем вход через 5000 порт: | ||
+ | http://Server_IP:5000/ | ||
+ | |||
+ | Выходим CTRL+C и CTRL+D <br> | ||
+ | |||
+ | Создаем '''systemd service unit file''' для нашего приложения чтобы автоматически запускать его | ||
+ | <source lang='bash'> | ||
+ | # 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 | |
− | |||
− | |||
− | |||
</source> | </source> | ||
+ | |||
+ | Запускаем юнит, добавляем в автозагрузку и проверяем статус: | ||
+ | # 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: | ||
+ | # systemctl restart nginx | ||
+ | |||
+ | Крон задача по обновлению сертификатов через 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. |
Текущая версия на 19:59, 29 мая 2022
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
Создаем Виртуальное Окружение 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
Ставим пакеты через менеджер pip: wheel, gunicorn, flask
$ pip install wheel gunicorn flask Successfully installed Jinja2-3.1.2 MarkupSafe-2.1.1 Werkzeug-2.1.2 click-8.1.3 flask-2.1.2 gunicorn-20.1.0 itsdangerous-2.1.2 wheel-0.37.1
Создаем простой проект - импортируем 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:
# systemctl restart nginx
Крон задача по обновлению сертификатов через 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.