Nginx和Gunicorn'err_conn_refused',但是nginx没有logging错误

我一直在Django Cookie Cutter的地方项目中玩耍,想把它作为一个半生产阶段环境放在我的DO Droplet上。

服务器设置Nginx的反向代理到各种项目,一些服务与Gunicorn,一个裸瓶,一个与uWSGI。 每个项目都有自己的virtualenv。

在部署这个项目并进行设置时,我有以下一系列的错误。

Nginx的conf如下(这反映在这个液滴上的其他网站):

server { server_name test.myserver.com; access_log off; location /static/ { alias /var/www/myproject/static/; } location / { proxy_pass http://127.0.0.1:8085; 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"'; } } 

在第一个例子中,重置nginx并且不设置Gunicorn后,这个“工作”/做我所期望的:抛出一个502错误的网关错误和nginx日志注意:

 2016/02/25 11:27:25 [error] 21217#0: *275 connect() failed (111: Connection refused) while connecting to upstream, client: my.ip.address, server: test.myserver.com, request: "GET / HTTP/1.1", upstream:$ 

好吧,从Gunicorn开始:

 /var/www/test.myserver.com/env/bin/gunicorn -b 127.0.0.1:8085 myproject.wsgi:application & 

(从具有manage.py的文件夹中运行) – 这会在浏览器中抛出一个400错误的请求; gunicorn服务器注意到(当我ssh'd进入,可以看到):

 [Django] ERROR: Invalid HTTP_HOST header: u'127.0.0.1:8085'.You may need to add u'127.0.0.1' to ALLOWED_HOSTS. 

有道理:django-cookiecutter将大部分敏感configuration放在环境variables中。 我的.env文件(我已经检查,它在shell中可用)看起来像这样:

 TERM=xterm-256color SHELL=/bin/bash SSH_CLIENT=my.ip.address 57044 22 OLDPWD=/var/www/myproject/env SSH_TTY=/dev/pts/0 USER=root VIRTUAL_ENV=/var/www/myproject/env MAIL=/var/mail/root PATH=/var/www/treatout/env/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PWD=/var/www/treatout/env/bin LANG=en_US.UTF-8 PS1=(env)${debian_chroot:+($debian_chroot)}\u@\h:\w\$ SHLVL=1 HOME=/root LOGNAME=root SSH_CONNECTION=82.23.204.106 57044 178.62.47.176 22 _=/usr/bin/env 

如果我导出DJANGO_ALLOWED_HOSTS=127.0.0.1 (在Django的设置映射到ALLOWED_HOSTS的envvariables)或其他任何东西(string,而不是string,通配符,列表),它似乎完全破坏的东西 ,我得到一个'ERR_CONN_REF'错误浏览器和浏览器URL从test.myserver.com切换到127.0.0.1:8085(显然,它不能连接,我没有在我的本地主机上运行服务器端口)。

Nginx的日志里没有任何东西(我预计这里基本上是一个上游错误),而Gunicorn从来没有看到这个请求。 它(似乎并不奇怪)显示在nginx访问日志中。

我也尝试将包含所有variables的env.example重命名为.env,但似乎没有太大区别。

我显然错过了一些东西,但是不知道是什么,并且努力去debugging。 其他网站运行良好,并且nginx通常是不受支持的。 尝试未unset DJANGO_ALLOWED_HOSTS已从unset DJANGO_ALLOWED_HOSTS中删除它,但我仍然有问题,重置nginx后。

编辑:我回到了最后的'工作'configuration(即抛出400错误的请求和东西被logging)只删除和重buildvirtualenv; 我真的不想多次这样做,因为有很多的依赖关系,它需要相当长的一段时间!

第二次编辑:在使用django-environ检查环境设置时,它看起来像export命令已经搞乱了格式:

 env('DJANGO_ALLOWED_HOSTS') 'my.server.ip.address:127.0.0.1' 

这看起来不对,不应该用逗号分隔吗? 我觉得这是之前input的正确命令,因此不知如何在这里继续…

在这种情况下,答案与production.py设置文件和环境设置之间没有联接,当你不使用Heroku或者Docker的时候。 ( 从第490期起 )

我的问题是双重的:允许的主机的格式错误,由不正确地连接string引起的,需要放置:

“在您的设置文件(例如common.py )中,您可以像这样读取它: env.read_env(ROOT_DIR('.env') ),取决于您放置副本的位置。

这样做立即使shell和程序都可以使用(以前设置的)环境variables。 我不会陷入由于无休止的折磨而产生的连锁错误,这是另一回事。 🙂

编辑一段时间后:有一个相关的问题 – 在该网站的nginx conf文件(在sites-available ),我不得不添加

proxy_set_header Host $http_host; 确保传递正确的主机名称; 这可以防止在某些情况下redirect到本地主机。

我的整个网站文件现在是:

 server { server_name myservernamehere.com; access_log off; location /static/ { alias /var/www/mysitename/mysitename/mysitename/static/; } location / { proxy_pass http://127.0.0.1:8085; client_max_body_size 20M; proxy_set_header Host $http_host; 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"'; } }