使用UWSGI,Nginx,direnv和systemd部署Flask APP

时间:2018-10-11 03:55:48

标签: python-3.x flask uwsgi systemd direnv

我已经使用FLASK创建了一个API,我正试图通过创建systemd服务将其部署在linux服务器上。

我已经使用direnv设置了应用程序的输入参数,例如数据库连接。该文件如下所示: enter image description here

uwsgi配置如下:

enter image description here

systemd文件具有以下条目:

enter image description here

每当我尝试在浏览器上访问服务时,都会在uwsgi日志中出现以下错误:

---未找到python应用程序,请检查启动日志中的错误- [pid:23791 | app:-1 | req:-1/3] 192.168.9.180(){719字节中的44个变量} [2018年10月11日星期四14:35:09] GET / =>在0毫秒内生成21个字节(HTTP / 1.1 500)2个标头,共83个字节(核心0上有1个开关)

我的理解是systemd文件中的ExecStart命令无法调用direnv设置变量,因此我添加了ExecStartPre条目,但似乎不起作用。

感谢任何提示/想法。

注意:当我从python虚拟环境通过命令行运行uwsgi时,该应用程序可以无错误访问:

uwsgi --socket 0.0.0.0:5000 --protocol = http -w app:app

1 个答案:

答案 0 :(得分:1)

我有一些建议可能会对您有所帮助,可能只有第一个是您需要的...

1)将direnv中定义的所有env变量作为Environment移至systemd单元,或将其移至特殊文件(与您已有的文件类似),而无需使用“源激活”行和导出,然后将该文件作为EnvironmentFile传递,这就是该https://www.freedesktop.org/software/systemd/man/systemd.exec.html#Environment

的文档

2)您的ExecStartPre实际上什么也没做,即使您对路径进行“ cd”操作,这也是丢失的并且不是持久的。您应该将其删除。

3)通过将PATH设置为仅该路径,就限制了自己,我建议您查看当前PATH的值,然后将其设置为该值。但是至少要添加“ / usr / local / bin:/ bin:/ usr / bin:/ usr / local / sbin:/ usr / sbin”。现在扰流板​​警报,您可能不需要设置它。

4)将套接字放在/run//socket.socket目录中,并让Systemd使用RuntimeDirectory指令管理您的/run/<yourapp>

祝你好运!