Gunicornに、作成したいDjangoアプリにPython3を使用させようとしています。はじめにDigital OceanのDjangoイメージを使用しています。 Django、Gunicorn、およびNginxがインストールおよび構成されています。この画像に付属するデフォルトのDjangoプロジェクトは、Python 2で正常に動作するようです。
これらのパッケージをapt-get
'しました。
問題を回避するために、これも実行しました。
ストックプロジェクトをrm -rf
'し、Django-admin.py startproject Django_project
で新しいプロジェクトを作成しました。 Django-admin.py
はPython 3を使用します(Shebangによる)。後で、python3 manage.py startapp Django_app
を使用して新しいアプリを作成します。
この時点で、すべてが正常に機能します。デフォルトのアプリと同じです。それから、Django_app/views.py
でこれを行うと壊れます。
from Django.shortcuts import render
from Django.http import HttpResponse
def index(request):
# Python 2 and 3 - works fine
# print('PRINTING')
# Python 3 only - crashes
print(1, 2, end=' ')
return HttpResponse("Hello, world! This is my first view.")
エラーページには、Python 2.7.6を使用しています。
さて、Python 3のpipでGunicornをインストールできると思ったので、これを行います。
しかし、その後、502 Bad Gatewayになります。 service gunicorn status
を実行すると、gunicorn stop/waiting
を取得します。 service gunicorn restart
を試しましたが、それでもgunicorn stop/waiting
と表示されます。
which gunicorn
を実行し、/usr/local/bin/gunicorn
にインストールしました。うーん...私は私が他に何を試すことができるか本当にわかりません。どんな助けも大歓迎です。ありがとう。
おそらく最初からやり直す方が簡単でしょう。 https://www.digitalocean.com/community/articles/how-to-install-and-configure-Django-with-postgres-nginx-and-gunicorn のチュートリアル。
私はそれを新鮮なubuntu 14.04の液滴で走らせました。 python3とDjangoをインストールしてから、単にチュートリアルに従ってください。postgresやvirtualenvビットは実行しませんでした。
2つのリンクがいつか壊れた場合に備えて、ここで機能させました。
これらの命令を実行した後に開始します。
pip uninstall gunicorn
pip3 install gunicorn
supervisor
、Sudo apt-get install supervisor
をインストールします。
次に、これを含むプロジェクトディレクトリのルートにgunicorn_config.py
を作成する必要がありました。
command = '/usr/local/bin/gunicorn'
pythonpath = '/home/Django/django_project'
bind = '127.0.0.1:9000'
workers = 3
user = 'nobody'
次に、supervisor
の構成ファイルを作成しました。 vim /etc/supervisor/conf.d/gunicorn.conf
、これらのコンテンツ。
[program:gunicorn]
command=/usr/local/bin/gunicorn -c /home/Django/django_project/gunicorn_config.py Django_project.wsgi
user=nobody
autostart=true
autorestart=true
stderr_logfile=/var/log/gunicorn3.err.log
stdout_logfile=/var/log/gunicorn3.out.log
その後、supervisorctl reread
とsupervisorctl update
を実行すると、すべてが機能し始めました。
supervisorctl status gunicorn
を使用して、gunicorn
が実行されているかどうかを確認できます。 supervisorctl restart gunicorn
を使用して再起動できます。
これにはgunicorn3
と呼ばれるパッケージがあるようです(これはUbuntuでテストされました)
Sudo apt-get install gunicorn3
その後、次のコマンドを実行すると動作し、python3でgunicornを実行するはずです:
gunicorn3 --log-level debug --bind 0.0.0.0:30443 server:app
私のやり方:
virtualenv -p /usr/bin/python3 /home/py3env
source /home/py3env/bin/activate
pip3 install gunicorn
/home/py3env/bin/gunicorn -w4 -b0.0.0.0:8000 [projectname].wsgi
次のスクリプトを書き、Python 3.4でDigitalOceanの14.04 Djangoイメージ、素敵なワンステップセットアップにしたかったので... https://Gist.github.com/tr00st/190ab4de62f9b23bea69 で維持される
私にとってセットアップの主な問題はgeventにあり、労働者の竜巻への切り替えはうまくいきました。
#!/bin/bash
# Python 3 Upgrade for Django Droplet
# Will update the "Django on 14.04" Digital Ocean image.
# Run as root.
# Grab psycopg2 and pip
apt-get install python3-pip python3-psycopg2
# Remove the Python 2.7 version of gunicorn, so we can...
pip uninstall gunicorn
# Install the Python 3 version of gunicorn, and a couple of dependencies.
pip3 install gunicorn tornado Django
# Sadly, at time of writing, gevent isn't Python 3 compatible... But tornado is!
# So, switch them out with a little sed magic
sed 's/worker_class = '\''gevent'\''/worker_class='\''tornado'\''/' /etc/gunicorn.d/gunicorn.py -i.orig
# Restart gunicorn to make the changes take effect...
service gunicorn restart
# And we're good!
私がそれを実現する方法は、どこからでもgunicornをアンインストールすることでした:
Sudo apt-get remove gunicorn
pip uninstall gunicorn
pip3 uninstall gunicorn
そして、gunicorn
ソースから をインストールします。
pip3 install git+https://github.com/benoitc/gunicorn.git
これですべてが問題なく実行されました。
gunicorn
実行可能ファイルを見ると、それは小さなpythonスクリプト:
$ cat gunicorn
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import re
import sys
from gunicorn.app.wsgiapp import run
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(run())
重要なビットはfrom gunicorn.app.wsgiapp import run
行。アプリを実行するためのモジュールの責任の場所を示します。 gunicornが高品質のコード(実際)である場合、そのモジュールをコマンドラインから直接インポートして、アプリを実行できるはずです。
「コマンドラインからモジュールを直接インポートする」とは、 -m
コマンドラインスイッチ 。
-m module-nameを指定して呼び出すと、指定されたモジュールはPythonモジュールパス上にあり、スクリプトとして実行されます。
選択したpythonを使用:
$ /path/to/your/python -m gunicorn.app.wsgiapp {{ gunicorn command line args go here }} server:app
そして、それは十分に実行されます!
[2017-12-04 02:05:27 +0000] [24] [INFO] Starting gunicorn 19.7.1
[2017-12-04 02:05:27 +0000] [24] [INFO] Listening at: http://127.0.0.1:5000 (24)
[2017-12-04 02:05:27 +0000] [24] [INFO] Using worker: sync
[2017-12-04 02:05:27 +0000] [28] [INFO] Booting worker with pid: 28
[2017-12-04 02:05:27 +0000] [29] [INFO] Booting worker with pid: 29
この動作は非常に便利です。たとえば、Dockerfileのような場所からgunicornを実行する場合です。
プロジェクトフォルダーにpython3仮想環境をインストールする
$ pipenv --three
次に、アクティブ化された環境でgunicornを実行します
$ gunicorn [PROJECT].wgsi
ここに私が私のために働いた方法があります。 pip2とpip3の両方でgunicornをインストールしました。両方のバージョンが必要です。デフォルトは、pip2を使用したgunicornです。
私がやったことは、pip3を使用してvirtualenvでgunicornをインストールし、virtualenvフォルダのbinの下にあるgunicornファイルの内容を見ました
#!/********/virtualenv/gunicorn3/corto/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from gunicorn.app.wsgiapp import run
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(run())
このファイルをコピーして別の場所に置いてから、変更しました
#!/********/virtualenv/gunicorn3/corto/bin/python3
に
#!/usr/bin/python3
これで、ファイルgunicornをコピーしたディレクトリに移動した後、このようにgunicornを簡単に実行できます。
python3 gunicorn -c /your_config_file.py class_app:app
注:pip3 uninstall gunicornを実行してからpip3 install gunicornを実行すると、dir'usr/local/bin '(ubuntu)にpython3バージョン(python2バージョンを上書き)でgunicronがインストールされ、そこにgunicronのファイルの内容を取得できます。これにより、virtualenvの使用を回避できます。
これが最初にうまくいかない場合は、pip3 unistall gunicornを実行してから、pip3 install gunicornを実行します。
ハッピーユニコーン;)
「Ubuntu Django on 14.04」」というドロップレットを使用して、デジタルオーシャンでも同じ問題が発生しました。
Python 3を使用する場合、 'gevent'ワーカータイプが問題であることに気付きました。python3 -m pip freeze
で 'gevent'がインストールされていることを確認しても、機能しませんでした。 /etc/gunicorn.d/gunicorn.pyで 'sync'に変更しました:
...
worker_class = 'sync'
...
Gunicornを再起動しました:
Sudo service gunicorn restart
service gunicorn status
を使用してgunicornサービスが実行されていることを確認し、ドロップレットのIPアドレスに到達することでDjangoページへようこそ)を確認できました。
それが他の人にも役立つことを願っています。
これを行う最善の方法は、/ usr/local/bin/gunicornに移動し、最初の行であるShebang行を#!/ usr/bin/python-versionに変更することだと思います
例:私のgunicornはpython3.5インタープリターで実行されます
#!/usr/bin/python3.5
# -*- coding: utf-8 -*-
import re
import sys
from gunicorn.app.wsgiapp import run
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(run())