我一直在努力解决这个问题两天没有成功。我创建了一个名为“testdj”的默认Django(1.6.1)应用程序的实例,将其安装在运行Ubuntu Server 13.10的Amazon AWS EC2 t1.micro实例上,我试图达到默认的Django“它工作了!”通过Gunicorn(第18节)。当我从命令行启动gunicorn时:
gunicorn testdj.wsgi:application --bind [ec2-public-dns]:8001
我输入此网址时可以看到该页面:
http://[ec2-public-dns]:8001
但是,如果我使用“start-gunicorn”bash脚本,我在阅读了Karzynski的blogpost“使用Nginx,Gunicorn,virtualenv,supervisor和PostgreSQL设置Django”之后创建的,我总是会收到错误。当我输入此URL ...
http://[ec2-public-dns]
...我收到此错误:
Error 502 - Bad Request
The server could not resolve your request for uri: http://[ec2-public-dns]
这是start-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中。用户/组www-data拥有/ usr / share / nginx以及下面的所有内容,除了用户/组“testdj”拥有/ usr / share / nginx / html / testdj以及它下面的所有内容。 / usr / share / nginx / html / testdj及其所有子目录都有权限775,我已经将www-data添加到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有关,因为如果我用“--bind - [ec2-public-dns]:8000”替换我的start-gunicorn脚本中的“--bind = unix:$ SOCKFILE”,我可以看到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
有谁知道这里发生了什么?它看起来不像我甚至得到枪炮。我为长篇文章道歉,但似乎有很多“活动部分”来解决这个问题。我会非常感激任何帮助,因为我尝试了很多不同的东西,但都无济于事。我也在这里看了其他问题,其他人有类似的问题,但我没有看到任何与此问题相关的问题。谢谢!
答案 0 :(得分:0)
我在Linode服务器上逐行重复配置过程,完全没有问题。我必须假设这个问题与AWS EC2实例的配置方式有关,可能与安全性有关。
答案 1 :(得分:0)
我今天遇到了同样的问题。 Daniel Roseman在评论here中向我解释了这一点:
端口8000默认不对外开放;你要么需要 调整您的负载均衡器/防火墙设置以打开它或运行 端口80上的gunicorn(这将意味着杀死nginx并开始 gunicorn作为超级用户)。更容易获得nginx设置 对;在gunicorn上有一个完美可用的配置 deploy docs page
似乎可以直接运行Gunicorn,但默认情况下EC2没有设置为这样做。