Как можно развернуть Flask на uwsgi с остальными зависимыми python скриптами?

У меня есть сайт на Flask, он сейчас успешно работает на nginx на ubuntu server. Но есть одно, но. Раньше был файл Main.py (он запрашивал кадры у CamDetect.py и раздавал боту и сайту), который в разных демонических потоках запускал Bot.py (бот отсылает кадры, которые ему передал Main.py), Site.py (сайт тоже принимает кадры и выводит их) и CamDetect.py (по запросу мейна генерирует кадры и возвращает ему же)

Main.py

from CamDetect import Detector
import Bot
import Site
import threading

...ЛОГИКА ПЕРЕДАЧИ КАДРОВ...

# Создаю и запускаю потоки
main_thread = threading.Thread(target=main, name='main_thread', daemon=True)
bot_thread = threading.Thread(target=Bot.bot.polling, name='bot_thread', daemon=True)
site_thread = threading.Thread(target=Site.app.run, kwargs={"host":"0.0.0.0"}, name='Site',  daemon=True)
# Запускаю потоки

main_thread.start()
bot_thread.start()
site_thread.start()

# Корректно завершаю потоки
bot_thread.join()
main_thread.join()
site_thread.join()

Site.py

...ЛОГИКА САЙТА...


def gen(camera):
"""Video streaming generator function."""
while True:
    sleep(1 / fps)
    frame = camera.get_frame_obj()
    yield (b'--frame\r\n'
           b'Content-Type: image/jpeg\r\n\r\n' + bytearray(frame) + b'\r\n')


@app.route('/video_feed')
def video_feed():
    """Video streaming route. Put this in the src attribute of an img tag."""
    return Response(gen(Camera),
                    mimetype='multipart/x-mixed-replace; boundary=frame')

Всё это замечательно запускается через демоны (запыскаем Main.py, он в разных потоках запускает остальные модули, и они работают слажено, обмениваются параметами). Но в таком случае я размещаю сайт не на nginx, а на отдельном потоке на фласке. А я хочу чтобы сайт был запущен через nginx, и мог оставаться доступным для Bot.py, Main.py..., чтобы они могли достучаться до сайта. Надо чтобы помимо сайта nginx запускал и остальных или как-то так.

Настройки uwsgi

[uwsgi]
module = wsgi:app

master = true

socket = site.sock
chmod-socket = 660
vacuum = true

die-on-term = true

wsgi.py

from Site import app

if __name__ == "__main__":
    app.run()

Понимаю, что высрал несвязанную информацию, но надеюсь хоть кто-то поймёт, что я хотел и поможет мне =(


Ответы (1 шт):

Автор решения: flask.pro

Я использую цепочку приложений примерно с такими параметрами, возможно чем-то поможет.

Общение между Nginx и uWSGI идёт через сокет.

UWSGI:

[uwsgi]
# Задаем переменную
base = /srv/USERNAME/api.SERVER.DOMEN

# Указания плагина для работы приложения.
plugin = python3

# Имя модуля и приложения, которое запустит uWSGI
module = main:app

# Директория где находится приложение
chdir = %(base)/APP_DIR

# Добавление в переменную окружения PYTHONPATH родительской папки приложения
pythonpath = %(base)

# Путь до директории с виртуальным окружением приложения
virtualenv = %(base)/venv

# enable master process
master = true

# Количество процессов uWSGI
processes = 5

# Указываем пользователя и группу под которым запускать приложение
uid = USERNAME
gid = www-data

# Указываем где создавать файл-сокет
socket = /tmp/api.SERVER.DOMEN.sock

# Удаляем временные файлы uWSGI при выключении
vacuum = true
# Решение для проблемы:
#    SystemError: <built-in function uwsgi_sendfile> returned a result with an error set
wsgi-disable-file-wrapper = true

Nginx:

server {
    listen 80;
    server_tokens off;
    # Скрывать информацию о типе и версии Web-сервера.
    server_name api.SERVER.DOMEN;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:/tmp/api.SERVER.DOMEN.sock;
    }

    access_log  /var/log/nginx/api.SERVER.DOMEN.access.log;
    error_log   /var/log/nginx/api.SERVER.DOMEN.error.log;

    location /static {
        root /srv/USERNAME/api.SERVER.DOMEN;
    }
}

Настройки Nginx сделаны без https, но добавит необходимое не трудно.

→ Ссылка