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

Deploying Flask APP with UWSGI,Nginx,direnv and systemd

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

我已经使用 direnv 设置应用程序的输入参数,例如数据库连接。下面是文件的样子:

uwsgi配置如下:

systemd 文件包含以下条目:

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

--- 未找到 python 应用程序,检查您的启动日志是否有错误 --- [pid: 23791|app: -1|req: -1/3] 192.168.9.180 () {44 vars in 719 bytes} [Thu Oct 11 14:35:09 2018] GET / => 在 0 毫秒内生成 21 个字节(HTTP/1.1 500) 2 headers in 83 bytes (1 switches on core 0)

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

感谢任何hints/ideas。

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

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

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

1) 将 direnv 中定义的所有 env 变量作为 Environment 移动到 systemd 单元,或者将它们移动到一个没有 "source activate" 行的特殊文件(类似于您已经拥有的文件)和导出,然后将该文件作为 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) 将套接字放入 /运行//socket.socket 目录并让 systemd 使用 RuntimeDirectory 指令管理您的 /run/<yourapp>

祝你好运!