Django和Gunicorn不说话

时间:2014-02-04 18:03:51

标签: django nginx gunicorn

昨天我发布了question这个没有人能回答的内容,所以我继续努力,决定设置最简单的方案。我现在正在尝试使用Gunicorn(第18节)作为我的HTTP服务器和Nginx(v.1.4.1)作为我的反向代理来运行默认的Django(1.6)应用程序(显示“It working!”)。它们运行在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文件正在谈论。只是那个枪手不跟Django说话。我想也许问题是我在全球安装了gunicorn(使用APT),这导致它无法找到app.wsgiapp文件,因此我也将gunicorn安装到虚拟环境中。但是,这并没有解决问题。我的PYTHONPATH变量中没有任何内容(我从未需要在其他Django应用程序中包含任何内容。

有谁知道我做错了什么?必须有成千上万的网站运行Django与nginx和Gunicorn,他们的工作。我究竟做错了什么???我已经阅读了所有的Gunicorn文档,关于WSGI的Django文档,以及关于Gunicorn和nginx的大量文章,都无济于事。我已经被困在这个问题上三天了。任何帮助都将非常赞赏。谢谢!

1 个答案:

答案 0 :(得分:0)

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