Nginx 和 Gunicorn 'err_conn_refused',但 nginx 不记录错误

Nginx 和 Gunicorn 'err_conn_refused',但 nginx 不记录错误

我一直在本地项目中使用 Django Cookie Cutter,并想将其放在我的 DO Droplet 上作为半生产暂存环境。

该服务器设置了 Nginx 反向代理,用于各种项目,一些项目使用 Gunicorn,一个使用裸 Flask,一个使用 uWSGI。每个项目都有自己的虚拟环境。

在部署和设置项目时,我遇到了以下一系列错误。

Nginx 配置如下(它镜像了这个 droplet 上的其他站点):

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 Bad Gateway 错误并且 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 登录并可以看到):

[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 将大多数敏感配置放在环境变量中。我的 .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 的环境变量)或其他任何内容(字符串,非字符串,通配符,列表),它似乎完全中断某物,然后我'ERR_CONN_REF'在浏览器中收到一个错误,并且浏览器 URL 从 test.myserver.com 切换到 127.0.0.1:8085 (所以显然它没有连接,我没有在本地主机的该端口上运行服务器。)

Nginx 日志中没有任何内容(基本上,我预计这里是上游错误),并且 Gunicorn 从未看到该请求。它似乎也没有(奇怪的是)显示在 nginx 访问日志中。

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

我显然漏掉了一些东西,但不确定是什么,并且很难调试;其他网站运行正常,nginx 通常不受影响。尝试unset DJANGO_ALLOWED_HOSTS 将其从 .env 中删除,但在重置 nginx 后,问题仍然存在。

编辑:我回到了最后一个“工作”配置(即抛出 400 个错误请求和正在记录的内容),仅删除并重建虚拟环境;我真的不想多次这样做,因为有很多依赖关系并且需要相当长的时间!

第二次编辑:使用检查环境设置django 环境看起来导出命令弄乱了格式:

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

这看起来不对,不应该用逗号分隔吗?我觉得这是之前输入的正确命令,所以不太确定这里该怎么做……

答案1

当您不使用 Heroku 或 Docker 时,这种特殊情况下的答案与 production.py 设置文件和环境设置之间缺少连接有关。(摘自第 490 期

我的问题有两个:允许的主机格式错误(由于字符串连接不正确而导致),需要输入:

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

这样做会立即使(之前设置的)环境变量可供 shell 和程序使用。我不会深入讨论我因无休止的捣乱而产生的连锁错误,那是另一个故事了。:)

过了一会儿编辑:有一个与此相关的问题 - 在网站的 nginx conf 文件中(在sites-available)我必须添加

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

因此,我的整个站点文件现在是:

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"';
        }
    }

相关内容