Gunicorn,没有名为'myproject的模块

时间:2016-09-13 01:19:39

标签: python django nginx gunicorn

我正在新服务器上安装以前构建的网站。我不是原始开发者。

我过去曾经使用过Gunicorn + nginx让应用程序保持活力(基本上跟随enter image description here),但是我在这里遇到了问题。

./manage.py runserver 0.0.0.0:8000,然后gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application效果很好,一切都按预期运行。我将其关闭并运行[2016-09-13 01:11:47 +0000] [15259] [INFO] Starting gunicorn 19.6.0 [2016-09-13 01:11:47 +0000] [15259] [INFO] Listening at: http://0.0.0.0:8000 (15259) [2016-09-13 01:11:47 +0000] [15259] [INFO] Using worker: sync [2016-09-13 01:11:47 +0000] [15262] [INFO] Booting worker with pid: 15262 [2016-09-13 01:11:47 +0000] [15262] [ERROR] Exception in worker process Traceback (most recent call last): File "/var/www/myproject/venv/lib/python3.5/site-packages/gunicorn/arbiter.py", line 557, in spawn_worker worker.init_process() File "/var/www/myproject/venv/lib/python3.5/site-packages/gunicorn/workers/base.py", line 126, in init_process self.load_wsgi() File "/var/www/myproject/venv/lib/python3.5/site-packages/gunicorn/workers/base.py", line 136, in load_wsgi self.wsgi = self.app.wsgi() File "/var/www/myproject/venv/lib/python3.5/site-packages/gunicorn/app/base.py", line 67, in wsgi self.callable = self.load() File "/var/www/myproject/venv/lib/python3.5/site-packages/gunicorn/app/wsgiapp.py", line 65, in load return self.load_wsgiapp() File "/var/www/myproject/venv/lib/python3.5/site-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp return util.import_app(self.app_uri) File "/var/www/myproject/venv/lib/python3.5/site-packages/gunicorn/util.py", line 357, in import_app __import__(module) ImportError: No module named 'myproject.wsgi' [2016-09-13 01:11:47 +0000] [15262] [INFO] Worker exiting (pid: 15262) [2016-09-13 01:11:47 +0000] [15259] [INFO] Shutting down: Master [2016-09-13 01:11:47 +0000] [15259] [INFO] Reason: Worker failed to boot. ,然后获取以下内容:

myproject
├── manage.py
├── myproject
│   ├── urls.py
│   ├── views.py
│   ├── component1
│   │   ├── urls.py
│   │   └── views.py
│   ├── component2
│   │   ├── urls.py
│   │   └── views.py
├── venv
│   ├── bin
│   └── ...

我认为它与整个应用程序的结构有关。之前,我已经构建了具有以下基本结构的应用程序:

myproject
├── apps
│   ├── blog
│   │   ├── urls.py
│   │   ├── views.py
│   │     └── ...
│   ├── catalogue
│   │   ├── urls.py
│   │   ├── views.py
│   │     └── ...
│   ├── checkout
│   │   ├── urls.py
│   │   ├── views.py
│   │     └── ...
│   ├── core
│   │   ├── urls.py
│   │   ├── views.py
│   │     └── ...
│   ├── customer
│   ├── dashboard
│   └──  __init__.py
├── __init__.py
├── manage.py
├── project_static
│   ├── assets
│   ├── bower_components
│   └── js
├── public
│   ├── emails
│   ├── media
│   └── static
├── settings
│   ├── base.py
│   ├── dev.py
│   ├── __init__.py
│   ├── local.py
│   └── production.py
├── templates
│   ├── base.html
│   ├── basket
│   ├── blog
│   └── ....
├── urls.py
├── venv
│   ├── bin
│   ├── include
│   ├── lib
│   ├── pip-selfcheck.json
│   └── share
└── wsgi.py

相反,这个结构如下:

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")

application = get_wsgi_application()

所以,没有'主'模块运行这个节目,这是我所期待的gunicorn正在寻找的。

有什么想法吗?

wsgi.py

promise.then()

4 个答案:

答案 0 :(得分:44)

您的错误消息是

ImportError: No module named 'myproject.wsgi'

您使用

运行了该应用
gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application

wsgi.py有一行

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")

这是断开连接。为了将项目识别为myproject.wsgi目录必须位于python路径上...正在运行

cd .. && gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application

将消除该错误。但是,您会收到不同的错误,因为wsgi.py文件引用settings而不是myproject.settings。这意味着该应用程序旨在从根目录而不是一个目录运行。您可以通过查看代码来确定这一点 - 如果它使用绝对导入,他们通常会说from myproject.app import ...from app import ...。如果猜测正确,那么您的正确命令是

gunicorn --bind 0.0.0.0:8000 wsgi:application

如果应用确实在所有路径中使用myproject,则必须修改PYTHONPATH才能正常运行...

PYTHONPATH=`pwd`/.. gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application

答案 1 :(得分:0)

在替换python工作目录路径后运行这些命令。

# Go to your current working directory
cd /path/to/folder

# Activate your virtual environment. Ignore if already in activated mode
source /path/to/virtualenv/bin/activate

# Install gunicorn in virtualenv
pip3 install gunicorn

# Run this command. Replace PORT and app name accordingly
gunicorn --bind 0.0.0.0:5000 wsgi:app

答案 2 :(得分:0)

如果您使用的是supervisor,则必须在主管配置文件中将environment设置为波纹管。

environment=HOME="/home/to/your/project/root"

答案 3 :(得分:0)

对我来说, 我的项目结构是

myproject
├── manage.py
├── myproject
│   ├── wsgi.py
│   ├── ..
Dockerfile
docker-composer.yml

所以在 docker-composer.yml 中,当命令时

<块引用>

gunicorn myproject.wsgi:application --bind 0.0.0.0:8000

出现以下错误

<块引用>

ModuleNotFoundError: 没有名为“myproject.wsgi”的模块

我们要做的是,我们必须在文件夹中运行gunicorn命令,而不是项目根目录。这是工作代码

sh -c "cd ./myproject && gunicorn myproject.wsgi:application --bind 0.0.0.0:8000"

在使用 gunicorn 命令之前,我们必须使用“cd ./project”更改目录。在“myproject”目录下,gunicorn 可以清楚地识别我们的项目。