web-dev-qa-db-ja.com

uwsgi:アプリがロードされていません。フルダイナミックモードになります

私のuwsgi設定には、次のオプションがあります。

[uwsgi]
chmod-socket = 777
socket = 127.0.0.1:9031
plugins = python
pythonpath = /adminserver/
callable = app
master = True
processes = 4
reload-mercy = 8
cpu-affinity = 1
max-requests = 2000
limit-as = 512
reload-on-as = 256
reload-on-rss = 192
no-orphans
vacuum

私のアプリの構造は次のようになります。

/adminserver
   app.py
   ...

僕の app.pyには次のコードがあります。

app = Flask(__name__)
...

if __name__ == '__main__':
    app.run(Host='0.0.0.0', port=5003, debug=True)

その結果、サーバーをカールさせようとすると、次のエラーが発生します。

Wed Sep 11 23:28:56 2013 - added /adminserver/ to pythonpath.
Wed Sep 11 23:28:56 2013 - *** no app loaded. going in full dynamic mode ***
Wed Sep 11 23:28:56 2013 - *** uWSGI is running in multiple interpreter mode ***

moduleおよびcallableオプションは何をしますか?ドキュメントによると:

モジュール、wsgi引数:文字列

WSGIモジュールをアプリケーションとしてロードします。モジュール(sans .py)はインポート可能である必要があります。 PYTHONPATHにいる。

このオプションは、コマンドラインから-wを使用して設定できます。

呼び出し可能引数:文字列デフォルト:アプリケーション

デフォルトのWSGI呼び出し可能名を設定します。

13
Rose Perrone

モジュール

Pythonのモジュールは、ディスク上のファイルにマップされます-次のようなディレクトリがある場合:

/some-dir
    module1.py
    module2.py

現在の作業ディレクトリが/some-dirのときにpythonインタプリタを起動すると、各モジュールをインポートできるようになります。

some-dir$ python
>>> import module1, module2
# Module1 and Module2 are now imported

Pythonは、インポートしようとしている名前に一致するファイルをsys.path(およびその他のいくつかのこと 詳細についてはimportのドキュメントを参照 )で検索します。 uwsgiは、内部でPythonのインポートプロセスを使用して、WSGIアプリケーションを含むモジュールをロードします。

呼び出し可能

WSGI PEP(および)は、WSGIアプリケーション 2つの引数を取り、バイト文字列を生成する反復可能オブジェクトを返す呼び出し可能オブジェクト を指定します。

# simple_wsgi.py
# The simplest WSGI application
HELLO_WORLD = b"Hello world!\n"

def simple_app(environ, start_response):
    """Simplest possible application object"""
    status = '200 OK'
    response_headers = [('Content-type', 'text/plain')]
    start_response(status, response_headers)
    return [HELLO_WORLD]

uwsgiは、WSGIアプリケーションの呼び出し可能にマップするモジュール内のシンボルの名前を知っている必要があります。これにより、環境とstart_response呼び出し可能に渡すことができます。基本的に、次のことができる必要があります。

wsgi_app = getattr(simple_wsgi, 'simple_app')

TL; PC(長すぎる;コードを優先)

Uwsgiが行っていることの単純な類似点:

# Use `module` to know *what* to import
import simple_wsgi

# construct request environment from user input
# create a callable to pass for start_response
# and then ...

# use `callable` to know what to call
wsgi_app = getattr(simple_wsgi, 'simple_app')

# and then call it to respond to the user
response = wsgi_app(environ, start_response)
9
Sean Vieira

この問題を抱えている他の人の場合、構成が正しいことが確実な場合は、uWSGIのバージョンを確認する必要があります。

Ubuntu 12.04LTSは1.0.3を提供します。それを削除し、pipを使用して2.0.4をインストールすると、問題が解決しました。

6
Austin Wagner

まず、構成が正しいかどうかを確認します。

私のuwsgi.ini構成:

[uwsgi]
chdir=/home/air/repo/Qiy
uid=nobody
gid=nobody
module=Qiy.wsgi:application
socket=/home/air/repo/Qiy/uwsgi.sock
master=true
workers=5
pidfile=/home/air/repo/Qiy/uwsgi.pid
vacuum=true
thunder-lock=true
enable-threads=true
harakiri=30
post-buffering=4096
daemonize=/home/air/repo/Qiy/uwsgi.log

次に、uwsgi --ini uwsgi.iniを使用してuwsgiを実行します。

動作しない場合は、rm -rfvenvディレクトリを作成し、venvを再初期化して、手順を再試行します。

venvを再初期化して問題を解決しました。問題は、pip3 installのいくつかのパッケージをrequirements.txtし、pipをアップグレードしてから、uwsgiパッケージをインストールすることです。そこで、venvを削除し、仮想環境を再初期化します。

0
aircraft