私のDjango Webfactionでホストされている本番サーバー上のアプリは、settings.pyファイルへの変更をプッシュした後、再起動しようとするまで正常に機能していました。実行しました
Apache2/bin/restart
いつものように。次に、ブラウザーでアプリにアクセスしようとすると、504ゲートウェイのタイムアウトが発生しました。私はmod_wsgiログを調べて、これを見ました:
[Thu Nov 03 23:46:53.605625 2016] [wsgi:error] [pid 8027:tid 139641332168448]
[client 127.0.0.1:34570] Timeout when reading response headers from daemon
process 'myapp' : /home/<me>/webapps/<myapp>/<ProjectName>/<myapp>/wsgi.py
これはどういう意味ですか、どうすれば修正できますか? settings.pyファイルで私が変更した唯一のことは、いくつかの変数名を移動することでした。私はまだアプリと正常に対話することができます
python2.7 manage.py Shell
しかし、私はWebでそれを取得することも、APIを使用することもできません。
編集:これが私のwsgi.pyファイルです:
import os
from Django.core.wsgi import get_wsgi_application
os.environ.setdefault("Django_SETTINGS_MODULE", "<myapp>.settings")
application = get_wsgi_application()
NumpyなどのPython C拡張モジュールは、mod_wsgiで使用するとタイムアウトを引き起こすことが知られています。 https://serverfault.com/a/514251/109598 で利用可能な問題の明確な説明(mod_wsgiの作成者から直接)があります。
それが問題の原因であると思われる場合、解決策はおそらく単純です-httpd.confに以下を追加します。
WSGIApplicationGroup %{GLOBAL}
変更後は、Apacheインスタンスを必ず再起動してください。
httpd.conf
の- Timeout
ディレクティブを増やしてみてください。Apache2.4ではデフォルトで60秒に設定されています。例えば:
TimeOut 600
これが私の問題の根本的な原因を見つけることができた方法です。
python manage.py showmigrations
アプリがデータベースサーバーに到達できなかったため、最終的にタイムアウトしました。 manage.pyを実行すると、コンソールにエラーメッセージが表示されます。
私の場合(Python 3.6)、mimetypesモジュールがこの問題の原因です。これについては詳しく調査しませんでしたが、mimetypes.guess_type
の呼び出しを削除することで問題は解決しました。呼び出しは関連するDjangoビュー関数で行われました。