DjangoアプリケーションをElastic Beanstalkにデプロイしようとしています。ページにアクセスするとロードされません。ログには次のように記録されています。
Script timed out before returning headers: wsgi.py
サーバーにsshしてmanage.py runserver
その後 curl 127.0.0.1:8000
別の端末から。ページを正常に返します。したがって、Elastic Beanstalkの一部としてセットアップされたApache構成の問題である必要があると思います。
ログの詳細は次のとおりです。
[pid 15880] AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[so:warn] [pid 15880] AH01574: module wsgi_module is already loaded, skipping
[auth_digest:notice] [pid 15880] AH01757: generating secret for digest authentication ...
[lbmethod_heartbeat:notice] [pid 15880] AH02282: No slotmem from mod_heartmonitor
[mpm_prefork:notice] [pid 15880] AH00163: Apache/2.4.9 (Amazon) mod_wsgi/3.4 Python/2.7.5 configured -- resuming normal operations
[core:notice] [pid 15880] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND'
[:error] [pid 15881] /opt/python/run/venv/lib/python2.7/site-packages/numpy/oldnumeric/__init__.py:11: ModuleDeprecationWarning: The oldnumeric module will be dropped in Numpy 1.9
[:error] [pid 15881] warnings.warn(_msg, ModuleDeprecationWarning)
[:error] [pid 15881]
[core:error] [pid 15884] [client 10.248.110.45:58996] Script timed out before returning headers: wsgi.py
そして私のwsgi.pyファイル:
import os
os.environ.setdefault("Django_SETTINGS_MODULE", "aurora.settings")
from Django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
これを引き起こしている可能性があるものについての手がかりはありますか?
更新:
私は環境を再構築し、この問題に再度遭遇しました。更新しました/etc/httpd/conf.d/wsgi.conf
含める WSGIApplicationGroup %{GLOBAL}
ここで述べたように 。私はScipy、Numpy、およびGeoDjango(GDALを使用)を使用しています。 GDALは完全にスレッドセーフではないことを知っています。他のスレッドについてはよくわかりませんが、スレッドセーフの問題であると思います。
2017年2月8日更新
以前、私のwsgi.conf
は1つのプロセスしか使用していませんでした:
WSGIDaemonProcess wsgi processes = 1 threads = 15 display-name =%{GROUP}
私はプロセスをより合理的なものに上げ、何の問題もありませんでした:
WSGIDaemonProcess wsgi processes = 6 threads = 15 display-name =%{GROUP}
この変更と元のWSGIApplicationGroup %{GLOBAL}
の追加により、トリックが完了したようです。
2015年9月17日更新
私はまだ時々この問題に遭遇しています。通常、eb deploy
を使用して再デプロイすると問題が解決します。根本的な問題が何であるかを言うのは難しいです。
元の回答
私は最終的にプロジェクトを機能させましたが、その後、新しいインスタンスに使用するイメージを作成しようとしましたが、問題が再び発生しました。なぜ機能してから機能しなくなったのかはわかりませんが、カスタムAMIをゼロから再構築してプロジェクトを再プッシュしました。 wsgi.py
の問題でした。実際に投稿したバージョンは、デプロイされているバージョンとは異なりました。何らかの理由で、別の開発者がこれをwsgi.py
に入れました:
path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if path not in sys.path:
sys.path.append(path)
これを削除して問題を修正しました。
持っている人への私のアドバイス
Script timed out before returning headers: wsgi.py
wsgi.pyファイルを確認します。
私たちのための修正は Meistroの答え に従ってWSGIApplicationGroup %{GLOBAL}
設定を追加することでした。
.ebextensions/foobar.config
ファイルを使用してwsgi
構成を編集し、変更が永続的になるようにする必要があります。 。ebextensions構成ドキュメントを参照 。
以下を.ebextensions/foobar.config
ファイルに追加します。
files:
"/etc/httpd/conf.d/wsgi_custom.conf":
mode: "000644"
owner: root
group: root
content: |
WSGIApplicationGroup %{GLOBAL}
これにより、/etc/httpd/conf.d/wsgi_custom.conf
ファイルの内容がWSGIApplicationGroup %{GLOBAL}
で作成(または上書き)されます
私が直面した同様の問題についてちょうど2セント。
同様の問題がありました。 Django=アプリケーションから実行されているスクリプト(DB挿入/更新/削除呼び出しを行う)がデッドロック状態でテーブルのロックが解放されるのを待っていたことがわかりました。コードがリリースされると、コードはこのエラーなしで通過し、EBアプリケーションを再デプロイする必要がなくなりました。
あなたが言ったように、それは確かにWSGIとApacheの問題のように見えます。再確認する必要があるのは、ソースディレクトリにある.ebextensionsファイルです。
そこには、アプリケーションの場所などのWSGI情報を指定する構成があるはずです。 Django設定を確認し、WSGIを使用してApacheセットアップでローカルに実行することもできます。
おそらくWSGIとDjangoの公式ドキュメントをすでに読んでいることでしょうが、これは見逃していた単純化されたいくつかのことをキャッチするかもしれません: http://docs.aws.Amazon.com/elasticbeanstalk/latest/dg/create_deploy_Python_Django .html#create_deploy_Python_Django_update
一時的に問題を解決できる上記の手順を試しました。次に、次の手順を実行しました。
「.ebextensions」フォルダの下に「packages.config」ファイルを作成し、次の行を追加します
WSGIApplicationGroup: command: grep -rnw 'WSGIApplicationGroup' config.py || sed -i.bak '/LogFormat/ a WSGIApplicationGroup %%{GLOBAL}' config.py cwd: /opt/elasticbeanstalk/hooks
このタイプのエラーの提案をした人にこれを作成するのを助けてくれてありがとう
ようやく修正しました。 Apache mpmロードモジュールのコンセプトについて読む
Osに依存するApache preforker(my case)モジュールからデフォルトのロードモードが変更されました。
場所の下で見つける
場所:/etc/httpd/conf.module.d/00-mpm*.
ケースに依存するワーカーモジュールを有効にする
LoadModule mpm_worker_module lib64/httpd/modules/mod_mpm_worker.so
もう一度私を助けてくれた人に感謝します。
別のPython=バージョンを使用していることに気付きました。これについて説明させてください。CentOS7を使用していました。デフォルトのPythonバージョンCentOS 7ではPython 2.7ですが、私のコードはPython 3.6なので、同じマシンにPython 3.6をインストールしましたこれを行うことにより:
Sudo yum install centos-release-scl
Sudo yum install rh-python36 rh-python36-python-pip rh-python36-python-virtualenv
scl enable rh-python36 bash
次に、仮想環境を作成し、それをWSGIで使用しました。
WSGIScriptAlias / /var/www/myproject/myproject/wsgi.py
WSGIDaemonProcess myproject python-home=/var/www/myproject python-path=/var/www/myproject:/var/www/myproject/lib/python3.6/site-packages
WSGIProcessGroup myproject
そして、「スクリプトがタイムアウトしました」問題が発生しました。次に、mod_wsgi.soがlibpython2.7.so.1.0に対してコンパイルされていることに気付きました。
# ldd /usr/lib64/httpd/modules/mod_wsgi.so
linux-vdso.so.1 => (0x00007ffd3fcae000)
libpython2.7.so.1.0 => /lib64/libpython2.7.so.1.0 (0x00007f1240cd4000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f1240ab8000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f12408b3000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007f12406b0000)
libm.so.6 => /lib64/libm.so.6 (0x00007f12403ae000)
libc.so.6 => /lib64/libc.so.6 (0x00007f123ffe0000)
/lib64/ld-linux-x86-64.so.2 (0x00005598a5aac000)
解決策は、mod_wsgiパッケージを削除し、rh-python36-mod_wsgiパッケージをインストールすることでした。
宜しくお願いします!