我已经使用FLASK创建了一个API,我正试图通过创建systemd服务将其部署在linux服务器上。
我已经使用direnv设置了应用程序的输入参数,例如数据库连接。该文件如下所示:
uwsgi配置如下:
systemd文件具有以下条目:
每当我尝试在浏览器上访问服务时,都会在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
答案 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>
。
祝你好运!