【发布时间】: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的文件?