Nginx响应502错误



在尝试将我的应用程序部署到Digital ocean时,我根据本教程做了一切:如何将本地Django应用程序部署在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"'; 
}

在Djang.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。。。

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

我看到说明告诉你使用它来启动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. 当请求一个应该转发到您的应用程序的URL时,nginx通过连接localhost:8001(与127.0.0.1:8001相同)来转发它。

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

顺便说一句,gunicorn_django已被弃用。

还有一件事:不要将ALLOWED_HOSTS设置为服务于所有域。如果你这样做的话,你就是在向缓存中毒敞开大门。只将其设置为Django项目要服务的域列表。有关详细信息,请参阅文档。

最新更新