解決策
アプリケーションのルートに移動し、pythonインタラクティブシェルから直接wsgi.pyをインポートし詳細なエラー情報を得る。
問題
今回、新たなdjangoアプリケーションのiniファイルを設定・起動した所、ログに以下のエラーが表示されました。
no python application found, check your startup logs for errors
このエラー、詳細が表示されないので、原因がわからず困惑する人が多いようです。私も上記エラーが出て小一時間悩みました。上記エラーが出る原因は様々ですが、詳細が分からない事には対処しようがないので、詳細なエラーを出すことを主眼にします。
障害切り分け
以下のような設定ファイルでdjangoアプリケーションをuwsgiで運用していると仮定します。
必要なところだけかいつまんで記載します。
[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インタラクティブシェルから詳細なエラー情報を取得し、対処するのが良さそうです。