1

我使用 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} [10 月 11 日星期四14:35:09 2018] GET / => 在 0 毫秒内生成 21 个字节(HTTP/1.1 500) 83 个字节中的 2 个标头(1 个在核心 0 上开关)

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

任何提示/想法表示赞赏。

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

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

4

1 回答 1

1

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

1)要么将 direnv 中定义的所有 env 变量移动到 systemd 单元中,Environment要么将它们移动到一个特殊文件中(类似于你已经拥有的),没有“源激活”行和导出,然后将该文件作为 传递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/run/<yourapp>使用 RuntimeDirectory 指令管理您的。

祝你好运!

于 2018-10-20T06:49:27.670 回答