Как можно развернуть 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 шт):
Я использую цепочку приложений примерно с такими параметрами, возможно чем-то поможет.
Общение между 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, но добавит необходимое не трудно.