Развертывание приложения Flask с помощью UWSGI,Nginx,direnv и systemd
Я создал API с помощью FLASK, который я пытаюсь развернуть на сервере Linux, создав службу systemd.
Я использовал direnv для настройки входных параметров приложения, таких как соединения с базой данных. Ниже показано, как выглядит файл:
Конфигурация uwsgi выглядит следующим образом:
Файл systemd содержит следующие записи:
Я получаю следующую ошибку в своих журналах uwsgi всякий раз, когда пытаюсь обратиться к службе в своем браузере:
--- приложение Python не найдено, проверьте журналы запуска на наличие ошибок --- [pid: 23791|app: -1|req: -1/3] 192.168.9.180 () {44 переменной в 719 байтах} [Чт 11 октября 14:35:09 2018] GET / => сгенерировал 21 байт в 0 мсек (HTTP/1.1 500) 2 заголовка в 83 байта (1 переключается на ядро 0)
Насколько я понимаю, команда ExecStart в файле systemd не может вызвать переменные набора direnv, поэтому я добавил запись ExecStartPre, но даже, похоже, не работает.
Любые намеки / идеи приветствуются.
Примечание: приложение доступно без ошибок, когда я запускаю uwsgi через командную строку из моей виртуальной среды python:
uwsgi --socket 0.0.0.0:5000 --protocol = http -w app: app
1 ответ
У меня есть несколько советов, которые могут вам помочь, вероятно, только первый - тот, который вам нужен...
1) Переместите всю вашу переменную env, определенную в direnv, в системный модуль как Environment
или переместите их в специальный файл (похожий на тот, который у вас уже есть) без строки "исходная активация" и экспорт, а затем передайте этот файл как EnvironmentFile
это документ для этого https://www.freedesktop.org/software/systemd/man/systemd.exec.html
2) Ваш ExecStartPre ничего не делает на самом деле, даже если вы делаете "CD" на пути, который потерян и не является постоянным. Вы должны удалить это.
3) Установив для своего PATH только этот путь, вы ограничиваете себя, я бы порекомендовал посмотреть значение вашего текущего PATH, а затем установить его на это значение. но по крайней мере добавьте "/ usr / local / bin: / bin: / usr / bin: / usr / local / sbin: / usr / sbin". Теперь спойлер оповещения, вам, вероятно, не нужно устанавливать его.
4) поместите сокет в каталог /run//socket.socket и позвольте systemd управлять вашим /run/<yourapp>
с директивой RuntimeDirectory.
удачи!