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