Flask - установка web framework-а на Ubuntu 22.04 с nginx и Gunicorn: различия между версиями

Материал из Wiki - Iphoster - the best ever hosting and support. 2005 - 2023
Перейти к:навигация, поиск
 
(не показано 14 промежуточных версий этого же участника)
Строка 1: Строка 1:
=== Flask - установка веб framework-а на Ubuntu 22.04 с nginx и Gunicorn ===
+
[[Файл: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
+
from flask import Flask
app = Flask(__name__)
+
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
  
@app.route("/")
+
[Install]
def hello():
+
WantedBy=multi-user.target
    return "<h1 style='color:blue'>Hello IPHOSTER!</h1>"
 
if __name__ == "__main__":
 
    app.run(host='0.0.0.0')
 
 
</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.