Как получить Gunicorn для использования Python 3 вместо Python 2 (502 Bad Gateway)

Я пытаюсь заставить Gunicorn использовать Python3 для приложения Django, которое я хочу сделать. Я использую Digital Ocean Django для начала работы. Он поставляется с установленными и настроенными Django, Gunicorn и Nginx. По умолчанию проект Django, который поставляется с этим изображением, отлично подходит для Python 2.

У меня есть apt-get 'эти пакеты.

  • python3
  • python3-psycopg2
  • python3-DEV
  • python3-пип

Чтобы избежать каких-либо проблем, я также сделал это.

  • pip удалить django
  • pip3 установить django

I 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.

Хорошо, тогда я подумал, что смогу установить Gunicorn через pip для Python 3, поэтому я это делаю.

  • pip uninstall gunicorn
  • pip3 install gunicorn

Но тогда я просто заканчиваю 502 Bad Gateway. Когда я делаю service gunicorn status, я получаю gunicorn stop/waiting. Я попробовал service gunicorn restart, но он все еще говорит gunicorn stop/waiting.

Я сделал which gunicorn и установил его в /usr/local/bin/gunicorn. Ух... Я не совсем уверен, что еще я мог бы попробовать. Любая помощь будет принята с благодарностью. Спасибо.

Ответы

Ответ 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 для перезапуска.

Ответ 3

мой путь:

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

Ответ 4

Написал следующий script, чтобы переключиться на 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

Если вы посмотрите на исполняемый файл gunicorn, это всего лишь небольшой python script:

$ 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 и выполняется как script.

Используя питон на ваш выбор:

$ /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.

Ответ 6

У меня была такая же проблема в Digital Ocean, используя капельу "Ubuntu Django on 14.04".

Я понял, что рабочий тип "gevent" был проблемой для меня при использовании Python 3. Даже если я проверил с python3 -m pip freeze, что был установлен gevent, это не сработало. Я изменил его на "sync" в /etc/gunicorn.d/gunicorn.py:

...
worker_class = 'sync'
...

Я перезапустил стрельбу:

sudo service gunicorn restart

Я проверил, что служба gunicorn запущена с помощью service gunicorn status, и я смог увидеть приветствие на странице django, достигнув моего ip-адреса капли.

Я надеюсь, что это работает для других людей.

Ответ 7

Установите виртуальную среду python3 в папку вашего проекта

$ pipenv --three

Затем запустите Gunicorn в активированной среде

$ gunicorn [PROJECT].wgsi

Ответ 8

Вот как я сделал это, чтобы работать на меня. Я установил gunicorn как с pip2, так и с pip3. Мне нужны обе версии. По умолчанию используется Gunicorn с pip2.

Я установил gunicorn с помощью virtualenv с помощью pip3 и просмотрел содержимое файла gunicorn под bin в папке virtualenv, где указано, что

#!/********/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 gunicorn, после установки pip3 gunicorn установит gunicron с версией python3 (переопределяя версию python2) в каталог 'usr/local/bin' (ubuntu), а затем вы можете получить там содержимое файла gunicron. Это поможет вам избежать использования virtualenv.

Если это не сработает в первый раз, выполните unicall gunicorn для pip3, а затем установите gunicorn для pip3.

Счастливого единорога;)

Ответ 9

Я сделал так, чтобы удалить Gunicorn отовсюду:

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

А затем установка gunicorn из источника.

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

Теперь все работает без проблем.

Ответ 10

Кажется, что есть пакет для этого называется gunicorn3 (это было проверено на Ubuntu)

sudo apt-get install gunicorn3

тогда выполнение следующей команды должно работать и запустить gunicorn с python3:

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

Ответ 11

Я думаю, что лучший способ сделать это - перейти в /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())