web-dev-qa-db-ja.com

uWSGIがリロード、再起動、またはサービスの実行を許可しません

かなり大きな問題があります。

私はuwsgiが初めてで、この問題をデバッグする方法について100%確信が持てませんが、現在の場所に関する情報を提供します。

  • 以前にこの構成で作業しているサイトがありましたが、突然機能しなくなりました。
  • Emperorモードを実行しています。
  • コマンドラインを使用して実行すると、iniファイルは問題ありませんが、自動的に開始されないようです

uwsgi reloadを実行すると

Sudo service uwsgi reload

このエラーが表示されます

* Reloading app server(s) uwsgi
...fail!

それでおしまい。他に何も得られません。

私は何時間もスタックオーバーフローを探していましたが、この問題を正確に概説するものは何も見つかりませんでした。人々の.iniファイルに多くのことを見つけましたが、uwsgi --ini MYINI.iniを介して手動でサイトを実行してからアクセスするため、それが私の問題ではないことを知っていますそれは完全に正常に動作し、問題はuWSGIにあり、この解決策を見つける方法がわかりません。私はドキュメントを調べましたが、この特定のエラーについては何も見つかりません。

これが誰かに興味があるなら、私のuwsgi-server.confファイル

description     "uWSGI Emperor"

start on runlevel [2345]
stop on runlevel [!2345]

respawn

env LOGTO=/var/log/uwsgi.log
env BINPATH=/usr/local/bin/uwsgi

exec $BINPATH --emperor /etc/uwsgi/vassals --logto $LOGTO

どんな洞察もいただければ幸いです。私は何かを見逃しているように感じますが、uWSGIがあまりにも新しいので、それが何であるかを推測することさえできません。

私の設定についてさらに情報が必要な場合は、お問い合わせください。

24
Daniel Tate

Uwsgiを正しい方法で使用する

Uwsgiを使用してDjango ubuntuサーバー上のサイトを作成するのは非常に簡単ですが、間違いを犯す前に知っておくべきことがまだあります。

インストール

Ubuntuにuwsgiをインストールするには、apt-getまたはpipの2つの方法があります。

apt-get

apt-getを使用する場合、pythonプラグインをインストールする必要があります。

Sudo apt-get install uwsgi-plugin-python
Sudo apt-get install uwsgi

そして、あなたのサイトのuwsgi iniファイルで、これを追加する必要があります:

plugins=python

ピップ

pipを使用する場合、最初にpython-devをインストールする必要があります。

Sudo apt-get install python-dev
Sudo pip install uwsgi

そして、plugins=python in iniファイルはもう必要ありません。

Pipの前にSudoを見る?はい、uwsgiはグローバルシステムにインストールする必要があります。ここでSudoを逃した場合、virtualenvにインストールできます。意味がなく、実行に問題があるかもしれません。

uwsgiをデーモン化する

デーモン化とは、システムのブート時およびバックグラウンドでuwsgiを実行することを意味します。 uwsgiのインストール方法に応じて、2つの方法があります。

apt-get

Ubuntuでapt-get install uwsgiすると、サービスとして自動的にインストールされます。魔法はこのファイルにあります:

/etc/init.d/uwsgi

/etc/init.dのファイルはsysvinitによってロードされます。次に、次のようにuwsgiサービスを管理できます。

Sudo /etc/init.d/uwsgi start|stop|restart|reload

または:

Sudo service uwsgi start|stop|restart|reload

serviceコマンドは、sysvinitによって管理されるサービスを見つけることができます

ピップ

Uwsgiがpipによってインストールされている場合、実行ファイルは/usr/local/bin/uwsgiにしかありません。自分でデーモン化する必要があります。

/etc/init.d/のファイルの一部を開くと、悲しく感じるかもしれません。単にuwsgiをサービスとして登録したいのですが、なぜ他のスクリプトと似た長いスクリプトを書く必要があるのですか?意味がありません。

幸いなことに、sysvinitに代わるUpstartを使用すると、非常に簡単です。 /etc/init/の代わりに/etc/init.d/を使用します。

次の内容のファイル/etc/init/uwsgi.confを作成するだけです:

description "uWSGI Emperor"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
exec /usr/local/bin/uwsgi --emperor /etc/uwsgi/vassals/ --logto /var/log/uwsgi.log

その後、次のようにuwsgiプロセスを管理できます。

Sudo initctl start|stop|restart|reload| uwsgi

または、まだこれ:

Sudo service uwsgi start|stop|restart|reload

はい、ご覧のとおり、serviceコマンドはスマートで、sysvinitとUpstartの両方から同じコマンドでサービスを管理できます。

また、/etc/init.d/uwsgi/etc/init/uwsgi.confの両方がある場合、次のように言うと:

Sudo service uwsgi restart

Upstartファイル/etc/init/uwsgi.confを再起動します。 sysvinitの1つは無視されるか、類似したものになります。

サイトのuwsgi構成

みんなにpipとUpstartの方法を使用することをお勧めします。

その場合、uwsgiの皇帝モードを使用しています。これは非常に便利で強力です。

これで、次のように/etc/uwsgi/vassals/にiniファイルを作成できます。

[uwsgi]
virtualenv=/path/to/venv/
chdir=/path/to/proj/root
module=wsgi:application
env=Django_SETTINGS_MODULE=settings
master=True
vacuum=True
socket=/tmp/%n.sock
pidfile=/tmp/%n.pid
daemonize=/var/log/uwsgi/%n.log

%nはファイル名を意味します。たとえば、私のプロジェクト名は 'example'で、example.iniファイルを作成します。 %nは「例」を意味します。実際の名前に置き換える必要はありません。 uwsgiがこれを行います。

次に、uwsgiを再起動またはリロードします。

Sudo service uwsgi restart

ソケットファイルを確認します。

ll /tmp/*.sock

そこにあれば、今すぐuwsgiで成功しています:)

サイトのnginx設定

ドメインexample.comを例にとります。

server {
    listen          80;
    server_name     www.example.com;
    return          301 $scheme://example.com$request_uri;
}

server {
    listen 80;
    charset utf-8;
    server_name example.com;

    location  /static/ {
        alias  /path/to/static/;
    }

    location  /media/ {
        alias /path/to/media/;
    }

    location / {
        try_files $uri @Django;
    }

    location @Django {
       uwsgi_pass unix:///tmp/example.sock;
       include uwsgi_params;
    }
}

nginxを再起動すると、サイトが表示されます!

あなたの質問に答えます

Uwsgiの設定ファイルは/etc/init/uwsgi-server.confですので、使用する名前はuwsgiではなくuwsgi-serverです。

次のようにuwsgi emperorインスタンスを再起動する必要があります。

Sudo initctl restart uwsgi-server

または:

Sudo service uwsgi-server restart

それで全部です!

74
guoqiao