让 uwsgi 在重新启动时创建“/run/uwsgi”文件夹的最佳方法是什么?

让 uwsgi 在重新启动时创建“/run/uwsgi”文件夹的最佳方法是什么?

我已经设置了一个 Django 项目来与 uwsgi 和 nginx 一起运行,并且一切都按预期运行,除了当我重新启动时,uwsgi 将无法正确启动,直到在 fs 上重新创建 /run/ 文件夹。 /run 映射到“tmpfs”,因此需要在每次启动时重新创建。

我有一个为 uwsgi 创建的 systemd 服务文件:

[Unit]
Description=uWSGI Module
After=syslog.target

[Service]
ExecStart=/usr/bin/uwsgi --ini /etc/uwsgi.ini
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=main

[Install]
WantedBy=multi-user.target

/etc/uwsgi.ini文件如下所示:

[uwsgi]
uid = uwsgi
gid = uwsgi
pidfile = /run/uwsgi/uwsgi.pid
stats = /run/uwsgi/stats.sock
socket = /run/uwsgi/uwsgi.sock
master = true
processes = 1
chdir = /path/to/our/django/app
module = icscada
max-requests = 100
daemonize = /var/log/uwsgi.log

/run/uwsgi每次启动时重新创建文件夹的建议方法是什么?

答案1

来自 tmpfiles.d(5):

系统守护程序经常需要 /run 下面的私有运行时目录来放置通信套接字和类似的目录。对于这些,请考虑使用 RuntimeDirectory= 在其单元文件中声明它们(有关详细信息,请参阅 systemd.exec(5))(如果可行)。

并来自 systemd.exec(5):

运行时目录=,运行时目录模式=

获取目录名称列表。如果设置,则当设备启动时,将在 /run(对于系统服务)或 $XDG_RUNTIME_DIR(对于用户服务)下创建一个或多个指定名称的目录,并在设备停止时删除。这些目录将具有 RuntimeDirectoryMode= 中指定的访问模式,并且由 User= 和 Group= 中指定的用户和组拥有。使用它来管理单元的一个或多个运行时目录,并将它们的生命周期绑定到守护程序运行时。

换句话说,在使用 tmpfiles.d 来实现此“工作”时,官方推荐的方法是添加

RuntimeDirectory=uwsgi

[Service]您的单元文件的部分。

这样做的优点是更简短,保证它是使用正确的用户/组所有权创建的,并在守护程序停止时清理目录。

答案2

您需要创建一个配置文件,/etc/tmpfiles.d/定义该目录应在引导/启动期间由 systemd 创建。

例子

$ more /etc/tmpfiles.d/uwsgi.conf 
D /run/uwsgi 0770 uwsgi uwsgi -

将其设置为您认为适合您情况的任何所有权/权限。

笔记:如果您使用我上面提供的设置,那么您可能需要将该组添加uwsgi到 Nginx 的用户nginx

$ sudo usermod -a nginx -G uwsgi

参考

答案3

我最终解决这个问题的方法是使用最新的发行版。 Fedora 20 并yum install uwsgi构建了一个环境,所有这些细节都为我自动处理,而我之前试图将其伪造到 Fedora17 系统上,而它在 yum 存储库中不可用。

Fedora 20 解决这个问题的方法是在它的 uwsgi 服务单元中加入这个:

ExecStartPre=/bin/mkdir -p /run/uwsgi 
ExecStartPre=/bin/chown uwsgi:uwsgi /run/uwsgi

答案4

我正在安装的软件包uwsgi(CentOS 7 上的默认软件包)已经包含正确的/usr/lib/tmpfiles.d/uwsgi.conf文件。但目录仍然不存在。重新启动可能会导致它在systemd-tmpfiles重新启动时被创建,但就我而言 -

我需要跑

systemd-tmpfiles --create

安装包后以便立即创建目录。

相关内容