Как получить 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
. Ух... Я не совсем уверен, что еще я мог бы попробовать. Любая помощь будет принята с благодарностью. Спасибо.
Ответы
Ответ 1
Вероятно, легче начать заново. Учебное пособие https://www.digitalocean.com/community/articles/how-to-install-and-configure-django-with-postgres-nginx-and-gunicorn.
Я запустил его на новой капельке ubuntu 14.04. Установите python3 и django, а затем просто следуйте инструкциям. Однако не делали посты или виртуальные биты.
Ответ 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())