在我昨晚部署我的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”指令的值。 这是一个有效的域名,是应该使用的。