在尝试将我的应用程序部署到Digital ocean时,我根据本教程做了一切:如何将本地Django应用程序部署在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"';
}
在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应用程序之间的交互如下:
nginx是所有HTTP请求的入口点。它在
95.85.34.87:80
上侦听。当请求一个应该转发到您的应用程序的URL时,nginx通过连接
localhost:8001
(与127.0.0.1:8001
相同)来转发它。您的Django应用程序正在侦听
localhost:8001
以接收来自nginx的转发。
顺便说一句,gunicorn_django
已被弃用。
还有一件事:不要将ALLOWED_HOSTS
设置为服务于所有域。如果你这样做的话,你就是在向缓存中毒敞开大门。只将其设置为Django项目要服务的域列表。有关详细信息,请参阅文档。