昨天我发布了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的大量文章,都无济于事。我已经被困在这个问题上三天了。任何帮助都将非常赞赏。谢谢!
答案 0 :(得分:0)
我在Linode服务器上逐行重复配置过程,完全没有问题。我必须假设这个问题与AWS EC2实例的配置方式有关,可能与安全性有关。我做的唯一更改是绑定到端口127.0.0.1:8000。我必须为我的文件创建一个要点,以便向其他人展示我是如何做到这一点的,以防任何人感兴趣。