J'ai une application Django et j'essaye de la configurer avec gunicorn en premier et plus tard avec supervisor et nginx.
L'application est en cours d'exécution avec la commande normale Django parfaitement comme python manage.py runserver
J'ai installé le gunicorn à l'aide de pip like pip install gunicorn
et Django est 1.5.3
quand je lance la commande ci-dessous à l'intérieur de l'env virtuel comme ci-dessous
gunicorn hello.wsgi:application -b xx.xxx.xxx.xx:8000
et a fait face à l'erreur
Traceback (most recent call last):
File "/root/Envs/proj/bin/gunicorn", line 9, in <module>
load_entry_point('gunicorn==19.0.0', 'console_scripts', 'gunicorn')()
File "/root/Envs/proj/local/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 74, in run
WSGIApplication("%(prog)s [OPTIONS] [APP_MODULE]").run()
File "/root/Envs/proj/local/lib/python2.7/site-packages/gunicorn/app/base.py", line 166, in run
super(Application, self).run()
File "/root/Envs/proj/local/lib/python2.7/site-packages/gunicorn/app/base.py", line 71, in run
Arbiter(self).run()
File "/root/Envs/proj/local/lib/python2.7/site-packages/gunicorn/arbiter.py", line 169, in run
self.manage_workers()
File "/root/Envs/proj/local/lib/python2.7/site-packages/gunicorn/arbiter.py", line 477, in manage_workers
self.spawn_workers()
File "/root/Envs/proj/local/lib/python2.7/site-packages/gunicorn/arbiter.py", line 537, in spawn_workers
time.sleep(0.1 * random.random())
File "/root/Envs/proj/local/lib/python2.7/site-packages/gunicorn/arbiter.py", line 209, in handle_chld
self.reap_workers()
File "/root/Envs/proj/local/lib/python2.7/site-packages/gunicorn/arbiter.py", line 459, in reap_workers
raise HaltServer(reason, self.WORKER_BOOT_ERROR)
gunicorn.errors.HaltServer: <HaltServer 'Worker failed to boot.' 3>
Alors pourquoi réellement l'erreur ci-dessus est rencontrée et quelle est la solution?
En fait, le problème ici était le fichier wsgi lui-même, auparavant auparavant Django 1.3. Le fichier wsgi était nommé avec une extension de .wsgi
, mais dans les versions récentes, il sera créé avec et extension de .py
le fichier wsgi doit être un module python
le fichier doit donc être hello_wsgi.py
et la commande devrait être
gunicorn hello:application -b xx.xxx.xxx.xx:8000
Vous n'avez pas montré une sortie complète. Ça ressemble probablement à
$ gunicorn elcarweb.wsgi
[2015-10-27 21:01:47 +0000] [5429] [INFO] Starting gunicorn 19.2.1
[2015-10-27 21:01:47 +0000] [5429] [INFO] Listening at: http://127.0.0.1:8000 (5429)
[2015-10-27 21:01:47 +0000] [5429] [INFO] Using worker: sync
[2015-10-27 21:01:47 +0000] [5434] [INFO] Booting worker with pid: 5434
[2015-10-27 21:01:47 +0000] [5434] [ERROR] Exception in worker process:
Traceback (most recent call last):
File "/home/tomek/Elcar/elcarweb/env/lib/python2.7/site-packages/gunicorn/arbiter.py", line 503, in spawn_worker
worker.init_process()
File "/home/tomek/Elcar/elcarweb/env/lib/python2.7/site-packages/gunicorn/workers/base.py", line 116, in init_process
self.wsgi = self.app.wsgi()
File "/home/tomek/Elcar/elcarweb/env/lib/python2.7/site-packages/gunicorn/app/base.py", line 67, in wsgi
self.callable = self.load()
File "/home/tomek/Elcar/elcarweb/env/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 65, in load
return self.load_wsgiapp()
File "/home/tomek/Elcar/elcarweb/env/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
return util.import_app(self.app_uri)
File "/home/tomek/Elcar/elcarweb/env/lib/python2.7/site-packages/gunicorn/util.py", line 355, in import_app
__import__(module)
ImportError: No module named elcarweb.wsgi
Traceback (most recent call last):
File "/home/tomek/Elcar/elcarweb/env/lib/python2.7/site-packages/gunicorn/arbiter.py", line 503, in spawn_worker
worker.init_process()
File "/home/tomek/Elcar/elcarweb/env/lib/python2.7/site-packages/gunicorn/workers/base.py", line 116, in init_process
self.wsgi = self.app.wsgi()
File "/home/tomek/Elcar/elcarweb/env/lib/python2.7/site-packages/gunicorn/app/base.py", line 67, in wsgi
self.callable = self.load()
File "/home/tomek/Elcar/elcarweb/env/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 65, in load
return self.load_wsgiapp()
File "/home/tomek/Elcar/elcarweb/env/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
return util.import_app(self.app_uri)
File "/home/tomek/Elcar/elcarweb/env/lib/python2.7/site-packages/gunicorn/util.py", line 355, in import_app
__import__(module)
ImportError: No module named elcarweb.wsgi
[2015-10-27 21:01:47 +0000] [5434] [INFO] Worker exiting (pid: 5434)
Traceback (most recent call last):
File "/home/tomek/Elcar/elcarweb/env/bin/gunicorn", line 11, in <module>
sys.exit(run())
File "/home/tomek/Elcar/elcarweb/env/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 74, in run
WSGIApplication("%(prog)s [OPTIONS] [APP_MODULE]").run()
File "/home/tomek/Elcar/elcarweb/env/lib/python2.7/site-packages/gunicorn/app/base.py", line 189, in run
super(Application, self).run()
File "/home/tomek/Elcar/elcarweb/env/lib/python2.7/site-packages/gunicorn/app/base.py", line 72, in run
Arbiter(self).run()
File "/home/tomek/Elcar/elcarweb/env/lib/python2.7/site-packages/gunicorn/arbiter.py", line 170, in run
self.manage_workers()
File "/home/tomek/Elcar/elcarweb/env/lib/python2.7/site-packages/gunicorn/arbiter.py", line 473, in manage_workers
self.spawn_workers()
File "/home/tomek/Elcar/elcarweb/env/lib/python2.7/site-packages/gunicorn/arbiter.py", line 537, in spawn_workers
time.sleep(0.1 * random.random())
File "/home/tomek/Elcar/elcarweb/env/lib/python2.7/site-packages/gunicorn/arbiter.py", line 210, in handle_chld
self.reap_workers()
File "/home/tomek/Elcar/elcarweb/env/lib/python2.7/site-packages/gunicorn/arbiter.py", line 455, in reap_workers
raise HaltServer(reason, self.WORKER_BOOT_ERROR)
gunicorn.errors.HaltServer: <HaltServer 'Worker failed to boot.' 3>
Le dernier trackback est presque identique, mais avant de voir les informations requises:
ImportError: No module named elcarweb.wsgi
Si vous voyez cette erreur, alors la solution est exécutée gunicorn avec --chdir=/your/app/dir
paramètre.
lancer guncorn avec --preload peut voir le journal des erreurs, comme ceci
gunicorn app:application --preload -b 0.0.0.0:5000
Cela vous donnera généralement un message d'erreur plus détaillé.
J'ai également eu une erreur similaire dans Ubuntu 16.04, Django 1.11, en utilisant systemd.
Mon problème était que j'avais divisé mes paramètres en fichiers séparés; c'est-à-dire qu'au lieu d'avoir tous les paramètres dans project/settings.py, j'ai quelques fichiers de paramètres comme project/settings/dev.py.
J'ai dû mettre à jour Django_SETTINGS_MODULE dans le fichier project/wsgi.py à partir de:
os.environ.setdefault("Django_SETTINGS_MODULE", "project.settings")
à
os.environ.setdefault("Django_SETTINGS_MODULE", "project.settings.dev")
alors gunicorn a fonctionné.
J'ai la même erreur. Gunicorn fonctionnait lorsqu'il était exécuté en tant que root, mais échouait de cette façon lorsqu'il était exécuté en tant qu'utilisateur non privilégié. Dans mon cas, j'installe le 'dataset' python avec 'pip install dataset') et il a vissé les permissions sur /usr/lib/python2.7/site-packages/dataset
ne doit être lisible que par le compte root. Sur un autre module installé en tant que dépendance, c'était la normalité.
Réparer :
chmod -R a+rX /usr/lib/python2.7/site-packages/dataset*
chmod -R a+rX /usr/lib/python2.7/site-packages/normality*
Le paquet yaml a été installé automatiquement par pip, mais je n’ai pas trouvé quoi au juste. Le correctif était de réinstaller à partir du paquet Fedora:
dnf -y install python-yaml
Pour ceux qui font face au même problème, le problème est généralement lié à Django lui-même. Activez votre venv et exécutez ./manage.py runserver.
Cela vous donnera généralement un message d'erreur plus détaillé.