web-dev-qa-db-ja.com

GunicornにPython 2(502 Bad Gateway)の代わりにPython 3を使用させる方法)

Gunicornに、作成したいDjangoアプリにPython3を使用させようとしています。はじめにDigital OceanのDjangoイメージを使用しています。 Django、Gunicorn、およびNginxがインストールおよび構成されています。この画像に付属するデフォルトのDjangoプロジェクトは、Python 2で正常に動作するようです。

これらのパッケージをapt-get 'しました。

  • python3
  • python3-psycopg2
  • python3-dev
  • python3-pip

問題を回避するために、これも実行しました。

  • pipアンインストールDjango
  • pip3はDjangoをインストールします

ストックプロジェクトを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をインストールできると思ったので、これを行います。

  • pipアンインストールgunicorn
  • pip3はgunicornをインストールします

しかし、その後、502 Bad Gatewayになります。 service gunicorn statusを実行すると、gunicorn stop/waitingを取得します。 service gunicorn restartを試しましたが、それでもgunicorn stop/waitingと表示されます。

which gunicornを実行し、/usr/local/bin/gunicornにインストールしました。うーん...私は私が他に何を試すことができるか本当にわかりません。どんな助けも大歓迎です。ありがとう。

29
425nesp

おそらく最初からやり直す方が簡単でしょう。 https://www.digitalocean.com/community/articles/how-to-install-and-configure-Django-with-postgres-nginx-and-gunicorn のチュートリアル。

私はそれを新鮮なubuntu 14.04の液滴で走らせました。 python3とDjangoをインストールしてから、単にチュートリアルに従ってください。postgresやvirtualenvビットは実行しませんでした。

8
wardk

2つのリンクがいつか壊れた場合に備えて、ここで機能させました。

これらの命令を実行した後に開始します。

  • pip uninstall gunicorn
  • pip3 install gunicorn

supervisorSudo 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 rereadsupervisorctl updateを実行すると、すべてが機能し始めました。

supervisorctl status gunicornを使用して、gunicornが実行されているかどうかを確認できます。 supervisorctl restart gunicornを使用して再起動できます。

20
425nesp

これにはgunicorn3と呼ばれるパッケージがあるようです(これはUbuntuでテストされました)

Sudo apt-get install gunicorn3

その後、次のコマンドを実行すると動作し、python3でgunicornを実行するはずです:

gunicorn3 --log-level debug --bind 0.0.0.0:30443 server:app

16
papadp

私のやり方:

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
7
snow

次のスクリプトを書き、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!
5
tr00st

私がそれを実現する方法は、どこからでもgunicornをアンインストールすることでした:

Sudo apt-get remove gunicorn
pip uninstall gunicorn
pip3 uninstall gunicorn

そして、gunicornソースから をインストールします。

pip3 install git+https://github.com/benoitc/gunicorn.git

これですべてが問題なく実行されました。

2
Alex Jolig

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を実行する場合です。

1
bcattle

プロジェクトフォルダーにpython3仮想環境をインストールする

$ pipenv --three

次に、アクティブ化された環境でgunicornを実行します

$ gunicorn [PROJECT].wgsi
1
Chris Dare

ここに私が私のために働いた方法があります。 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を実行します。

ハッピーユニコーン;)

0
eddys

「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ページへようこそ)を確認できました。

それが他の人にも役立つことを願っています。

0
Yves

これを行う最善の方法は、/ 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())
0
RVndra Singh