我已经设置了一个 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
安装包后以便立即创建目录。