私はユーザーDjango 1.10 with uWSGI and nginx on ubuntu 16.04 and deploy with my app with ansible。私のプロジェクトにはデフォルトの構造はありませんが、かなり一般的です(これについては2つのスクープに感謝します:)。私はsplitdevを使用します。代わりに「name」プロジェクトフォルダの本番設定とconfigフォルダ。次のようになります。
|-- config
| |-- __init__.py
| |-- settings
| | |-- __init__.py
| | |-- base.py
| | `-- dev.py
| |-- urls.py
| |-- wsgi_dev.py
| `-- wsgi_production.py
|-- manage.py
`-- requirements.txt
僕の production.py
セキュリティ暗号化を使用してansibleから生成し、config/settingsで検索します。
この設定では、「no python application found check yourstartuplogs」が表示されます。Uwsgiにアプリケーションが表示されません。
({{}}これはansibleのjinja2構文です)
/etc/uwsgi/sites/{{ project_name }}
[uwsgi]
chdir = {{ Django_root }}
home = /home/{{ project_user }}/venvs/{{ project_name }}
module = config.wsgi_production:application
master = true
processes = 5
socket = /run/uwsgi/{{ project_name }}.sock
chown-socket = {{ project_user }}:www-data
chmod-socket = 660
vacuum = true
数週間後、wsgi.py
に問題が見つかりました。一般的な解決策は、os.environ['ENV']
にDjango_SETTINGS_MODULE
を使用しますが、ユーザーと権限が異なると、機能しません。
wsgi.py
ファイルで次のようなものを使用する場合:
os.environ["Django_SETTINGS_MODULE"] = "config.settings." + os.environ["ENV"]
そして、no python application found
に問題があります-wsgiファイルを分割します。 os.environ["ENV"]
が空の文字列を返すことをキャッチできます。私はすべてのユーザーのためにそれを追加し、ソースなどを使用します。しかし、エンペリアモードのuwsgiはそれを表示しません。 wsgi_dev.py
とwsgi_production.py
を使用して、このos.environ["Django_SETTINGS_MODULE"] = "config.settings.production"
のような何かを書くことができます。それほどエレガントではありませんが、この問題をうまく解決します。
分割wsgiを使用するには、wsgi.py
に次のように記述できます。
import os
from Django.core.wsgi import get_wsgi_application
if os.environ.get('DEV') is True:
os.environ.setdefault("Django_SETTINGS_MODULE", "config.settings.dev")
else:
os.environ.setdefault("Django_SETTINGS_MODULE",
"config.settings.production")
application = get_wsgi_application()