在尝试将我的应用部署到Digital ocean时,我根据本教程做了所有事情:How To Deploy a Local Django App to a VPS。
虽然Gunicorn工作正常且http://95.85.34.87:8001/
打开了我的应用,但Nginx无效,http://95.85.34.87
或http://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),一切正常。我不确定它是否是一个很好的决定。
答案 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应用程序之间的交互是这样的:
nginx是所有HTTP请求的入口点。它会监听95.85.34.87:80
。
当请求转发到您的应用程序的网址时,nginx会通过localhost:8001
(与127.0.0.1:8001
相同)进行转发。
您的Django应用程序正在监听localhost:8001
以接收来自nginx的转发。
顺便说一下,gunicorn_django
是deprecated。
另一件事:不要设置ALLOWED_HOSTS
来服务所有域名。如果你这样做,你就是在打开中毒来缓解中毒。仅将其设置为Django项目要提供的域列表。有关详细信息,请参阅documentation。