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

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

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

我确定这是与以下nginxconfiguration有关:

 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 bug报告中找到了我的问题的答案。

  proxy_set_header Host $http_host; 

必须替换为:

  proxy_set_header Host $host; 

使nginx通过正确的头,而不是在gunicorn套接字请求的页面是在Django警报。

这个人基于这个相同的职位来解释一下更多的事情。 这是他/她的解释:

…当向服务器发出请求并且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”指令的值。 这是一个有效的域名,是应该使用的。