Python
Django
uwsgi

uwsgiデプロイ時に "no python application found"と出る場合

解決策

アプリケーションのルートに移動し、pythonインタラクティブシェルから直接wsgi.pyをインポートし詳細なエラー情報を得る。

問題

今回、新たなdjangoアプリケーションのiniファイルを設定・起動した所、ログに以下のエラーが表示されました。

uwsg-my_app.log
no python application found, check your startup logs for errors

このエラー、詳細が表示されないので、原因がわからず困惑する人が多いようです。私も上記エラーが出て小一時間悩みました。上記エラーが出る原因は様々ですが、詳細が分からない事には対処しようがないので、詳細なエラーを出すことを主眼にします。

障害切り分け

以下のような設定ファイルでdjangoアプリケーションをuwsgiで運用していると仮定します。
必要なところだけかいつまんで記載します。

uwsgi-my_app.ini
[uwsgi]
chdir = /home/www/my_app
wsgi-file = /home/www/my-app/config/wsgi.py
module = config.wsgi:application
socket = /tmp/uwsgi-my_app.sock
logto = /var/log/uwsgi-my_app.log

大雑把に言うと、

  • アプリケーションルート/home/www/my_appに移動する
  • wsgi.pyからmy_appのアプリケーションをロードする
  • UNIXドメインソケット/tmp/uwsgi-my_app.sockをWebサーバとの通信に用いる
  • /var/log/uwsgi-my_app.logにエラーを出力する

と言った感じです。

ログの表示、及び出力ファイルを見たところ、

  • chdirは正常に行われている
  • ソケットは正常に作られている
  • ログも出力されている

ことを確認しました。

エラーがあるとすればwsgi.pyによるアプリケーションのロードに問題があると思われます。

解析

乱暴に言ってしまえば、uwsgiがやっていることは、アプリケーションルートに移動し指定のwsgi.pyをロードし、その出力をソケットに流すだけです。
それで、手動(pythonのインタラクティブシェル)でwsgi.pyをロードしてみます。

$ cd /home/www/my-app
$ python

>>> import config.wsgi

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "config/wsgi.py", line 16, in <module>
    application = get_wsgi_application()
  File "/usr/local/lib/python2.7/site-packages/django/core/wsgi.py", line 13, in get_wsgi_application
    django.setup(set_prefix=False)
  File "/usr/local/lib/python2.7/site-packages/django/__init__.py", line 27, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/usr/local/lib/python2.7/site-packages/django/apps/registry.py", line 85, in populate
    app_config = AppConfig.create(entry)
  File "/usr/local/lib/python2.7/site-packages/django/apps/config.py", line 90, in create
    module = import_module(entry)
  File "/usr/local/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
ImportError: No module named master
  • 上記を見ると、my_app/masterというモジュールのロードに失敗しているようです。
  • 確認した所、master/以下に__init__.pyがありませんでした。それでpythonモジュールとしてロードすることができず、処理がコケていたようです。
  • master/__init__.pyを作成し、正常にデプロイされました。

結論

上記の例は単なる凡ミスによるエラーでしたが、uwsgiのログで「No python application found」とだけ出る場合、pythonアプリケーションのロード処理が失敗している可能性が高いので、pythonインタラクティブシェルから詳細なエラー情報を取得し、対処するのが良さそうです。