Djangoプロジェクトをuwsgiとnginxで実行するように設定しましたが、すべて再起動したときに、fsで/ run /フォルダーが再作成されるまでuwsgiが正しく起動しません。/ 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
フォルダを再作成するための推奨される方法は何ですか?
最終的にこの問題を解決した方法は、最新のディストリビューションを使用することでした。 Fedora 20とyum install uwsgi
これらの詳細すべてが自動的に処理される環境を構築しましたが、以前は、yumリポジトリで利用できないFedora17システムにこれをあざけようとしていました。
Fedora 20がこれを解決する方法は、これをuwsgiサービスユニットに含めることです。
ExecStartPre=/bin/mkdir -p /run/uwsgi
ExecStartPre=/bin/chown uwsgi:uwsgi /run/uwsgi
Tmpfiles.d(5)から:
システムデーモンは、通信ソケットなどを配置するために/ runの下にプライベートランタイムディレクトリを必要とすることがよくあります。これが可能であれば、RuntimeDirectory =(詳細についてはsystemd.exec(5)を参照)を使用して、ユニットファイルで宣言することを検討してください。
そしてsystemd.exec(5)から:
RuntimeDirectory =、RuntimeDirectoryMode =
ディレクトリ名のリストを取ります。設定すると、指定した名前の1つ以上のディレクトリが、ユニットの起動時に/ run(システムサービスの場合)または$ XDG_RUNTIME_DIR(ユーザーサービスの場合)の下に作成され、ユニットの停止時に削除されます。ディレクトリは、RuntimeDirectoryMode =で指定されたアクセスモードを持ち、User =およびGroup =で指定されたユーザーとグループによって所有されます。これを使用して、ユニットの1つ以上のランタイムディレクトリを管理し、それらのライフタイムをデーモンランタイムにバインドします。
言い換えれば、この「動作する」ためにtmpfiles.dを使用している間、公式に推奨される方法は、
RuntimeDirectory=uwsgi
ユニットファイルの[Service]
セクションに追加します。
これには、簡潔で、適切なユーザー/グループの所有権で作成されることが保証され、デーモンが停止したときにディレクトリがクリーンアップされるという利点があります。
/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
インストールしたuwsgi
パッケージ(CentOS 7のデフォルトパッケージ)には、すでに正しい/usr/lib/tmpfiles.d/uwsgi.conf
ファイルが含まれています。しかし、ディレクトリはまだありませんでした。再起動すると、systemd-tmpfiles
が新しく起動したときに作成された可能性がありますが、私の場合—
走る必要があった
systemd-tmpfiles --create
すぐにディレクトリを作成するためにパッケージをインストールした後。
複数のExecStartPreのコマンドは、.serviceファイルにリストされているのと同じ順序で実行されるとは限りません。
機能するのは、次のようにすべてのコマンドを1つのsh呼び出しに結合することです。
ExecStartPre=/bin/sh -c 'mkdir -p /run/uwsgi ; chown uwsgi:uwsgi /run/uwsgi'