Comment faire pour que Gunicorn utilise Python 3 au lieu de Python 2 (502 Bad Gateway)

J’essaie de faire en sorte que Gunicorn utilise Python3 pour une application Django que je veux créer. J’utilise l’image Django de Digital Ocean pour commencer. Il est livré avec Django, Gunicorn et Nginx installés et configurés. Le projet Django par défaut fourni avec cette image semble fonctionner correctement pour Python 2.

J’ai apt-get ‘ed ces paquets.

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

Pour essayer d’éviter tout problème, j’ai également fait cela.

  • pip désinstaller django
  • pip3 installe django

J’ai rm -rf le projet de stock et en ai créé un nouveau avec django-admin.py startproject django_project . django-admin.py utilise Python 3 (selon le shebang). Plus tard, j’utilise python3 manage.py startapp django_app pour créer une nouvelle application.

À ce stade, tout fonctionne bien. Tout comme l’application par défaut. Ensuite, dans django_app/views.py je le fais et ça casse.

 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.") 

La page d’erreur indique que j’utilise Python 2.7.6.

Bon, alors j’ai pensé que je pourrais installer Gunicorn via pip pour Python 3, alors je le fais.

  • pip désinstaller gunicorn
  • pip3 installer gunicorn

Mais ensuite je me retrouve avec 502 Bad Gateway. Quand je fais le service gunicorn status , je me gunicorn stop/waiting . J’ai essayé de service gunicorn restart , mais on dit toujours que gunicorn stop/waiting .

J’ai fait un which gunicorn et il est installé à /usr/local/bin/gunicorn . Euh … Je ne sais pas vraiment ce que je pourrais essayer d’autre. Toute aide serait grandement appréciée. Merci.

Il est probablement plus facile de recommencer. Tutoriel à l’ adresse https://www.digitalocean.com/community/articles/how-to-install-and-configure-django-with-postgres-nginx-and-gunicorn .

Je l’ai fait fonctionner sur une nouvelle gouttelette Ubuntu 14.04. Installez python3 et django puis suivez simplement le tutoriel. N’a pas fait les bits postgres ou virtualenv bien.

Au cas où les deux liens se briseraient un jour, voici comment ça fonctionne.

Commencer après avoir exécuté ces instructions.

  • pip uninstall gunicorn
  • pip3 install gunicorn

Installez le supervisor , sudo apt-get install supervisor .

Ensuite, je devais créer gunicorn_config.py à la racine du répertoire de mon projet, qui le contient.

 command = '/usr/local/bin/gunicorn' pythonpath = '/home/django/django_project' bind = '127.0.0.1:9000' workers = 3 user = 'nobody' 

Ensuite, j’ai créé un fichier de configuration pour supervisor . vim /etc/supervisor/conf.d/gunicorn.conf , avec ces contenus.

 [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 

Après cela, j’ai effectué une supervisorctl update et une supervisorctl update , puis tout a commencé à fonctionner.

Vous pouvez utiliser le supervisorctl status gunicorn pour vérifier si gunicorn fonctionne ou non. Vous pouvez utiliser supervisorctl restart gunicorn pour redémarrer.

ma façon:

 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 

A écrit le script suivant pour passer à Python 3.4 avec l’image 14.04 de Django de DigitalOcean, car je voulais qu’il s’agisse d’une belle configuration en une seule étape.

Le principal problème avec la configuration pour moi était avec le changement, le passage à la tornade pour les travailleurs a bien fonctionné.

 #!/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! 

Si vous regardez l’exécutable gunicorn , c’est juste un petit script 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()) 

Le bit important est la ligne from gunicorn.app.wsgiapp import run , qui vous indique l’emplacement du module responsibe pour exécuter votre application. Si gunicorn est un code de qualité (ce qui est le cas), vous devriez pouvoir importer ce module directement depuis la ligne de commande et exécuter votre application.

“Importer le module directement depuis la ligne de commande” signifie utiliser le commutateur de ligne de commande -m .

Appelé avec -m nom-module, le module donné est situé sur le chemin du module Python et exécuté en tant que script.

En utilisant le python de votre choix:

 $ /path/to/your/python -m gunicorn.app.wsgiapp {{ gunicorn command line args go here }} server:app 

Et bien sûr ça marche!

 [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 

Ce comportement est très utile, par exemple lorsque vous utilisez gunicorn depuis un fichier Dockerfile.

J’ai eu le même problème sur Digital Ocean en utilisant le droplet “Ubuntu Django on 14.04”.

J’ai réalisé que le type de travail ‘gevent’ était le problème pour moi lors de l’utilisation de Python 3. Même si j’ai vérifié avec python3 -m pip freeze que ‘gevent’ était installé, cela ne fonctionnait pas. Je l’ai changé pour ‘synchroniser’ dans /etc/gunicorn.d/gunicorn.py:

 ... worker_class = 'sync' ... 

J’ai redémarré gunicorn:

 sudo service gunicorn restart 

J’ai vérifié que le service gunicorn fonctionnait en utilisant le service gunicorn status et service gunicorn status pu voir la page de bienvenue sur django en atteignant l’adresse IP de mon droplet.

J’espère que cela fonctionne pour d’autres personnes.

Installer un environnement virtuel python3 dans votre dossier de projet

 $ pipenv --three 

Ensuite, lancez gunicorn dans l’environnement activé

 $ gunicorn [PROJECT].wgsi 

Voici comment j’ai réussi à travailler pour moi. J’ai installé gunicorn à la fois avec pip2 et pip3. J’ai besoin des deux versions. La valeur par défaut est gunicorn avec pip2.

Qu’est-ce que j’ai fait, j’ai installé gunicorn avec virtualenv en utilisant pip3 et regardé le contenu du fichier gunicorn sous bin dans le dossier virtualenv, qui dit

 #!/********/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()) 

J’ai copié ce fichier et l’ai mis ailleurs, puis j’ai changé

 #!/********/virtualenv/gunicorn3/corto/bin/python3 

à

 #!/usr/bin/python3 

Maintenant, vous pouvez facilement lancer gunicorn comme cela après être entré dans le répertoire dans lequel vous avez copié le fichier gunicorn

 python3 gunicorn -c /your_config_file.py class_app:app 

Note: faire pip3 uninstall gunicorn, suivi de pip3 install gunicorn installera gunicron avec la version python3 (remplaçant la version python2) dans le répertoire ‘usr / local / bin’ (ubuntu) et vous pourrez y retrouver le contenu du fichier gunicron. Cela vous aidera à éviter d’utiliser virtualenv.

Si cela ne marche pas la première fois, faites pipeter un gunall, puis pip3 installez gunicorn.

Bonne Licorne;)

La façon dont je le fais était de désinstaller gunicorn de partout:

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

Et puis Installation de gunicorn partir de la source .

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

Maintenant, tout fonctionne sans problème.

Il semble qu’il y ait un paquet appelé gunicorn3 (cela a été testé sur Ubuntu)

sudo apt-get install gunicorn3

alors l’exécution de la commande suivante devrait fonctionner et exécuter gunicorn avec python3:

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