错误:HTTP_HOST标头无效:'/ webapps /../gunicorn.sock'

时间:2014-02-23 16:10:40

标签: django sockets nginx gunicorn

昨晚我部署了我的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;
        }
    }
}

2 个答案:

答案 0 :(得分:24)

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

    proxy_set_header Host $http_host;

必须替换为:

    proxy_set_header Host $host;

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

答案 1 :(得分:2)

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,这将导致请求立即被拒绝而不会生成错误。

     

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