Nginx响应502错误

时间:2014-04-19 07:32:42

标签: django nginx

在尝试将我的应用部署到Digital ocean时,我根据本教程做了所有事情:How To Deploy a Local Django App to a VPS

虽然Gunicorn工作正常且http://95.85.34.87:8001/打开了我的应用,但Nginx无效,http://95.85.34.87http://95.85.34.87/static会导致502错误。

Nginx日志说:

2014/04/19 02:43:52 [error] 896#0: *62 connect() failed (111: Connection refused) while connecting to upstream, client: 78.62.163.9, server: 95.85.34.87, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8001/", host: "95.85.34.87"

我的nginx配置文件如下所示:

server { 
listen 80 default_server; 
listen [::]:80 default_server ipv6only=on; 
server_name 95.85.34.87;

access_log off;

location /static/ { 
alias /opt/myenv/static/; 
}

location / { 
proxy_pass http://127.0.0.1:8001; 
proxy_set_header X-Forwarded-Host $server_name; 
proxy_set_header X-Real-IP $remote_addr; 
add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"'; 
}

在Django.settings中,我将ALLOWED_HOSTS设置为'[*]'

Nginx正在侦听端口80:

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      894/nginx

tcp6       0      0 :::80                   :::*                    LISTEN      894/nginx 

我认为重点是Nginx没有将用户指向Gunicorn ......

编辑:我将proxy_pass http://127.0.0.1:8001;下的location /行更改为我的服务器IP地址(而不是loccalhost),一切正常。我不确定它是否是一个很好的决定。

1 个答案:

答案 0 :(得分:0)

我看到说明书告诉你使用它来启动Gunicorn:

$ gunicorn_django --bind yourdomainorip.com:8001

如果你这样开始,那么Gunicorn只会监听绑定到yourdomainorip.com的界面。因此,它不会收听环回界面,也不会收到发送给127.0.0.1的任何内容。不像你在编辑中提到的那样改变nginx的配置,你应该这样做:

$ gunicorn_django --bind localhost:8001

这会导致Gunicorn听环回。 这是首选因为如果你将Gunicorn绑定到外部接口,人们可以在不通过nginx的情况下访问它。

通过这个设置,nginx和你的Django应用程序之间的交互是这样的:

  1. nginx是所有HTTP请求的入口点。它会监听95.85.34.87:80

  2. 当请求转发到您的应用程序的网址时,nginx会通过localhost:8001(与127.0.0.1:8001相同)进行转发。

  3. 您的Django应用程序正在监听localhost:8001以接收来自nginx的转发。

  4. 顺便说一下,gunicorn_djangodeprecated

    另一件事:不要设置ALLOWED_HOSTS来服务所有域名。如果你这样做,你就是在打开中毒来缓解中毒。仅将其设置为Django项目要提供的域列表。有关详细信息,请参阅documentation