【问题标题】:Django and Gunicorn not talkingDjango 和 Gunicorn 不说话
【发布时间】:2014-02-28 20:47:08
【问题描述】:

昨天我发布了这个question,没有人能够回答,所以我继续努力,并决定设置最简单的场景。我现在正在尝试使用 Gunicorn (v. 18) 作为我的 HTTP 服务器和 Nginx (v. 1.4.1) 作为我的反向代理来运行默认的 Django (1.6) 应用程序(显示“它工作!”)。它们在 AWS EC2 实例 (Ubuntu Server 13.10) 上运行。当我尝试启动 Gunicorn 时,出现此错误:

Starting testdj as ubuntu
Traceback (most recent call last):
  File "/home/ubuntu/venv/testdj/bin/gunicorn", line 9, in <module>
    load_entry_point('gunicorn==18.0', 'console_scripts', 'gunicorn')()
  File "/home/ubuntu/venv/testdj/local/lib/python2.7/site-packages/pkg_resources.py", line 353, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/home/ubuntu/venv/testdj/local/lib/python2.7/site-packages/pkg_resources.py", line 2302, in load_entry_point
    return ep.load()
  File "/home/ubuntu/venv/testdj/local/lib/python2.7/site-packages/pkg_resources.py", line 2029, in load
    entry = __import__(self.module_name, globals(),globals(), ['__name__'])
ImportError: No module named app.wsgiapp

我使用 APT 安装了 nginx 和 gunicorn。我还安装了 virtualenv 和 virtualenvwrapper,并在虚拟环境中运行 Django。我以默认 EC2 用户“ubuntu”的身份运行该应用程序。 Django 应用程序“testdj”位于 /usr/share/nginx/html/testdj 中,并且 ubuntu 拥有目录树。我没有更改 Django 的默认 wsgi.py 文件。

这是我的“start-gunicorn”脚本:

#!/bin/bash
NAME="testdj"
DJANGODIR=/usr/share/nginx/html/testdj
USER=ubuntu
GROUP=ubuntu
NUM_WORKERS=3
DJANGO_SETTINGS_MODULE=testdj.settings
DJANGO_WSGI_MODULE=testdj.wsgi
WORKON_HOME=/home/ubuntu/venv
source `which virtualenvwrapper.sh`
workon $NAME
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGO_DIR:$PYTHONPATH
exec gunicorn ${DJANGO_WSGI_MODULE}:application \
  --name $NAME \
  --workers $NUM_WORKERS \
  --user=$USER --group=$GROUP \
  --access-logfile /var/log/gunicorn/access.log \
  --error-logfile /var/log/gunicorn/error.log \
  --log-level=debug \
  --bind=0.0.0.0:8000

这是我的 nginx 虚拟主机配置文件:

upstream app_server {
    # For a TCP configuration:
    server 0.0.0.0:8000 fail_timeout=0;
}
server {
    listen 80 default;
    server_name _;
    client_max_body_size 4G;
    keepalive_timeout 5;
    root /usr/share/nginx/html/testdj/static;
    location / {
        # checks for static file, if not found proxy to app
        try_files $uri @proxy_to_app;
    }
    location @proxy_to_app {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass http://app_server;
    }
    error_page 500 502 503 504 /500.html;
    location = /500.html {
        root /usr/share/nginx/html/testdj/static;
    }
}

现在有趣的是,我创建了这个 test.py 文件并将其放在我的 Django 应用目录的顶层:

# -*- coding: utf-8 -
def app(environ, start_response):
    """Simplest possible application object"""
    data = 'Hello, world!!\n'
    status = '200 OK'
    response_headers = [
        ('Content-type', 'text/plain'),
        ('Content-Length', str(len(data)))
    ]
    start_response(status, response_headers)
    return iter([data])

然后我运行命令“gunicorn --bind=0.0.0.0:8000 test:app”,我可以看到“Hello, world”输出,所以我知道 nginx 和 gunicorn 以及 Python 文件正在交谈。只是 gunicorn 没有和 Django 说话。我认为问题可能是我已经全局安装了 gunicorn(使用 APT),这导致它无法找到 app.wsgiapp 文件,所以我还将 gunicorn 安装到虚拟环境中。然而,这并没有解决问题。我的 PYTHONPATH 变量中没有任何内容(我的其他 Django 应用程序从来不需要在其中包含任何内容。

有谁知道我做错了什么?必须有成千上万的网站使用 nginx 和 Gunicorn 运行 Django,并且它们可以正常工作。我究竟做错了什么???我已经阅读了所有的 Gunicorn 文档、WSGI 上的 Django 文档以及关于 Gunicorn 和 nginx 的大量文章,但均无济于事。我已经被这个问题困扰了三天了。任何帮助将不胜感激非常。谢谢!

【问题讨论】:

  • 什么是目录布局,模块中是否存在名为wsgiapp 的文件?

标签: django nginx gunicorn


【解决方案1】:

我在我的 Linode 服务器上逐行重复了我的配置过程,完全没有问题。我不得不假设这个问题与 AWS EC2 实例的配置方式有关,可能与安全性有关。我所做的唯一更改是绑定到端口 127.0.0.1:8000。我必须为我的文件创建一个要点,以向其他人展示我是如何做到的,以防万一有人感兴趣。

【讨论】:

    猜你喜欢
    • 2012-08-17
    • 2015-02-26
    • 2014-09-14
    • 2021-07-08
    • 2015-06-29
    • 2012-06-24
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多