Can';t通过AWS EC2实例上的Gunicorn访问Django默认应用程序

Can';t通过AWS EC2实例上的Gunicorn访问Django默认应用程序,django,nginx,gunicorn,Django,Nginx,Gunicorn,我已经为这个问题挣扎了两天,但都没有成功。我已经创建了一个名为“testdj”的默认Django(1.6.1)应用程序实例,安装在运行Ubuntu服务器13.10的Amazon AWS EC2 t1.micro实例上,我正试图通过Gunicorn(第18节)访问默认的Django“it worked!”页面。从命令行启动gunicorn时: gunicorn testdj.wsgi:application --bind [ec2-public-dns]:8001 当我输入此URL时,我可以看到

我已经为这个问题挣扎了两天,但都没有成功。我已经创建了一个名为“testdj”的默认Django(1.6.1)应用程序实例,安装在运行Ubuntu服务器13.10的Amazon AWS EC2 t1.micro实例上,我正试图通过Gunicorn(第18节)访问默认的Django“it worked!”页面。从命令行启动gunicorn时:

gunicorn testdj.wsgi:application --bind [ec2-public-dns]:8001
当我输入此URL时,我可以看到该页面:

http://[ec2-public-dns]:8001
然而,如果我使用在阅读Karzynski的“使用Nginx、gunicorn、virtualenv、supervisor和PostgreSQL设置Django”之后创建的“启动gunicorn”bash脚本,我总是会得到一个错误。当我输入此URL时

http://[ec2-public-dns]
。。。我得到这个错误:

Error 502 - Bad Request
The server could not resolve your request for uri: http://[ec2-public-dns]
以下是启动gunicorn脚本:

#!/bin/bash

NAME="testdj"
DJANGODIR=/usr/share/nginx/html/testdj
SOCKFILE=/usr/share/nginx/html/testdj/run/gunicorn.sock
USER=testdj
GROUP=testdj
NUM_WORKERS=3
DJANGO_SETTINGS_MODULE=testdj.settings
DJANGO_WSGI_MODULE=testdj.wsgi

WORKON_HOME=/home/testdj/venv
source `which virtualenvwrapper.sh`
workon $NAME
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGO_DIR:$PYTHONPATH

RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR

exec gunicorn ${DJANGO_WSGI_MODULE}:application \
  --name $NAME \
  --workers $NUM_WORKERS \
  --user=$USER --group=$GROUP \
  --access-logfile /tmp/gunicorn-access.log \
  --error-logfile /tmp/gunicorn-error.log \
  --log-level=debug \
  --bind=unix:$SOCKFILE
如你所见,我在我的服务器上创建了一个名为“testdj”的特殊帐户来运行应用程序。我正在虚拟环境中运行Django应用程序。我根本没有更改Django wsgi.py文件。由于我最终希望使用nginx作为反向代理,我安装了nginx并将Django应用程序放在nginx的默认根目录/usr/share/nginx/html中。User/group www data拥有/usr/share/nginx和下面的所有内容,但User/group“testdj”拥有/usr/share/nginx/html/testdj和下面的所有内容除外/usr/share/nginx/html/testdj及其所有子目录都有perms 775,我已经将www数据添加到testdj组中

我确实安装了nginx,但没有运行nginx服务。我确实尝试过使用以下配置文件启动它并启用nginx虚拟服务器,但仍然出现了错误

upstream testdj_app_server {
    server unix:/usr/share/nginx/html/testdj/run/gunicorn.sock fail_timeout=0;
}
server {
    listen 80;
    server_name ec2-[my-public-dns-ip].us-west-2.compute.amazonaws.com;
    client_max_body_size 4G;
    access_log /var/log/nginx/testdj-access.log;
    error_log /var/log/nginx/testdj-error.log;

    location /static/ {
        alias /usr/share/nginx/html/testdj/static/;
    }
    location /media/ {
        alias /usr/share/nginx/html/testdj/media/;
    }
    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;   
        if (!-f $request_filename) {
            # This must match "upstream" directive above
            proxy_pass http://testdj_app_server;
            break;
        }
    }
    error_page 500 502 503 504 /500.html;
    location = /500.html {
        root /usr/share/nginx/html/testdj/static/;
    }
}
问题似乎出在gunicorn上,因为如果我将启动gunicorn脚本中的“-bind=unix:$SOCKFILE”替换为“-bind--[ec2 public dns]:8000”,我可以看到Django默认页面。但是,我不想绑定到端口8000上的公共DNS名称,我想在端口80上运行,并使用nginx作为前端反向代理

我最初有AWS入站安全组规则,将对站点的访问限制在笔记本电脑端口80、8000和8001上的HTTP,但即使我删除这些规则并保持站点完全打开,我仍然会收到502错误消息

我的gunicorn访问日志没有显示任何活动,我在gunicorn错误日志中唯一看到的是gunicorn启动。当我访问默认的Django页面时,错误日志中没有错误:

2014-02-03 18:41:01 [19023] [INFO] Starting gunicorn 18.0
2014-02-03 18:41:01 [19023] [DEBUG] Arbiter booted
2014-02-03 18:41:01 [19023] [INFO] Listening at: unix:/usr/share/nginx/html/testdj/run/gunicorn.sock (19023)
2014-02-03 18:41:01 [19023] [INFO] Using worker: sync
2014-02-03 18:41:01 [19068] [INFO] Booting worker with pid: 19068
2014-02-03 18:41:01 [19069] [INFO] Booting worker with pid: 19069
2014-02-03 18:41:01 [19070] [INFO] Booting worker with pid: 19070

有人知道这里发生了什么吗?看起来我连gunicorn都没有。我为这篇长篇大论道歉,但这个问题似乎有很多“活动部分”。我将非常感谢任何帮助,因为我尝试了许多不同的事情,但都无济于事。我还研究了其他问题,其他人也有类似的问题,但我没有看到任何与这个问题相关的东西。谢谢

我在Linode服务器上一行一行地重复配置过程,没有任何问题。我必须假设这个问题与AWS EC2实例的配置方式有关,可能与安全性有关。

我今天遇到了同样的问题。在评论中向我解释:

端口8000默认不对外开放;你要么需要 修改负载平衡器/防火墙设置以打开或运行它 端口80上的gunicorn(这意味着杀死nginx并启动 gunicorn作为超级用户)。只需获得nginx设置就容易多了 正确的;gunicorn上有一个完全可用的配置


似乎可以直接运行Gunicorn,但默认情况下EC2没有设置为这样做。

unix权限允许nginx与Gunicorn
SOCKFILE
对话吗?我相信是这样。以下是目录、其权限设置及其用户/组所有者:/usr/share/nginx/html/testdj 775 testdj:testdj/usr/share/nginx/html/testdj/run 775 testdj:testdj/usr/share/nginx/html/testdj/run/gunicorn.sock s777 testdj:testdjwww-data,默认nginx用户是testdj组的成员。