【问题标题】:ERROR: Invalid HTTP_HOST header: '/webapps/../gunicorn.sock'错误:无效的 HTTP_HOST 标头:'/webapps/../gunicorn.sock'
【发布时间】:2014-03-25 02:40:33
【问题描述】:

昨晚我部署了我的 Django 应用程序后,我收到了大量奇怪的电子邮件:

ERROR: Invalid HTTP_HOST header: '/webapps/example_com/run/gunicorn.sock

我确定这与以下 nginx 配置有某种关系:

upstream example_app_server {
  server unix:/webapps/example_com/run/gunicorn.sock fail_timeout=0;
}

server {

    listen   80;
    server_name example.com;

    client_max_body_size 4G;

    access_log /webapps/example_com/logs/nginx-access.log;
    error_log /webapps/example_com/logs/nginx-error.log;


    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_set_header Host $http_host;

        proxy_redirect off;

        if (!-f $request_filename) {
            proxy_pass http://example_app_server;
            break;
        }
    }
}

【问题讨论】:

    标签: django sockets nginx gunicorn


    【解决方案1】:

    This person 在同一篇文章的基础上进一步解释了正在发生的事情。这是他/她的解释:

    ...当向服务器发出请求并且 HTTP 主机为空时,nginx 将 HTTP 主机设置为 gunicorn sock。

    我可以使用 curl 生成此错误:

    curl -H "HOST:" MY_DOMAIN_NAME -0 -v
    

    这会在没有 HTTP 主机的情况下发送请求。 -0 使 curl 使用 HTTP 版本 1.0。如果不设置,请求将使用 HTTP 1.1 版本,这会导致请求立即被拒绝,不会产生错误。

    解决方案是将 $http_host 替换为 $host(正如 Stackoverflow 上所指出的)。当 HTTP 主机丢失时,$host 将采用“server_name”指令的值。这是一个有效的域名,应该使用它。

    【讨论】:

      【解决方案2】:

      我在 django 错误报告中找到了我的问题的答案。

          proxy_set_header Host $http_host;
      

      必须替换为:

          proxy_set_header Host $host;
      

      为了让 nginx 传递正确的标头而不是 gunicorn 套接字,请求的页面在 django 警报中。

      【讨论】:

      • 能否请您链接对错误报告的引用以及关于为什么第一个导致问题的任何可能的额外信息?我一直在多个网站上使用第一种方法,从来没有遇到过问题。然而,我最近的一个网站受到了影响。
      • @Andre,我通过search.aol.com/aol/… 进行了搜索。还有code.djangoproject.com/ticket/19867好像是那个,注意最后一条评论。
      • 谢谢@flyingfoxlee,我将在下一次迭代中对此进行测试。 :)
      猜你喜欢
      • 2014-10-11
      • 2017-03-27
      • 2021-01-20
      • 2016-01-10
      • 2013-07-22
      • 1970-01-01
      • 2013-02-20
      • 2019-09-29
      相关资源
      最近更新 更多