我正在使用 django,现在尝试使用 nginx 和 uwsi 配置服务器。现在我正在运行 nginx+socket+uwsgi_emperor。为了运行 uwsgi,我在终端中使用以下命令:
/usr/local/bin/uwsgi --emperor /etc/uwsgi/vassals --uid www-data --gid www-data
并且它运行得很好。现在我想添加服务,systemctl {start|stop|restart|status} uwsgi.service
这样我就可以轻松使用 uwsgi。这里出现了问题。这里是 /etc/systemd/system/uwsgi.service:
[Unit]
Description=uWSGI Emperor
After=syslog.target
[Service]
# i'm putting code same code of terminal exactly here:
ExecStart=/usr/local/bin/uwsgi --emperor /etc/uwsgi/vassals --uid www-data --gid www-data
# Requires systemd version 211 or newer
RuntimeDirectory=uwsgi
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all
[Install]
WantedBy=multi-user.target
现在,当我启动它并systemctl start uwsgi.service
运行它时,我可以看到systemctl status uwsgi.service
它已很好地加载,但是当我想要访问 ip 时,出现错误,journalctl -b -u uwsgi
显示我的 django 无法访问(读取)环境变量。因为我在 django 的设置中使用了几个环境变量,所以没有它们的值,django 就无法正常工作。为什么会这样?(当我在命令行中运行 uwsgi 时一切都很好,但是当我想在 systemctl 中使用相同的命令时,django 无法读取环境变量并发生错误)。谢谢
答案1
这表明我的 django 无法访问(读取)环境变量
因为 systemd 没有与您的用户、该用户环境和那些变量一起在 shell 中运行。
当我在命令行中运行 uwsgi 时
然后,您就可以使用自己的用户以及该环境和这些变量。
你需要一个
EnvironmentFile=/dir/to/file
在你之前ExecStart
。或者如果没有那么多,你也可以做
Environment={VAR}={VALUE}
(每个变量一行)其中
- {VAR} 是你的环境变量的名称
- {VALUE} 是该 {VAR} 的值
答案2
除了接受的答案之外的另一种方法是将其/bin/bash -lc '<your command>'
用于 ExecStart 或 ExecStop
ExecStart=/bin/bash -lc 'yarn start'
并有一个/etc/profile
与环境变量对应的文件。