Django 为什么nginx接受的主机头不';与服务器名称不匹配?
我有一个站点是这样设置的:nginx作为代理服务器,通过UNIX套接字代理请求到为Django站点服务的gunicorn实例 这是我的nginx配置:Django 为什么nginx接受的主机头不';与服务器名称不匹配?,django,unix,nginx,proxy,gunicorn,Django,Unix,Nginx,Proxy,Gunicorn,我有一个站点是这样设置的:nginx作为代理服务器,通过UNIX套接字代理请求到为Django站点服务的gunicorn实例 这是我的nginx配置: server { listen 80; server_name api.mysite.com; location /static/ { alias /webapps/mysite/static/; autoindex off; } location / {
server {
listen 80;
server_name api.mysite.com;
location /static/ {
alias /webapps/mysite/static/;
autoindex off;
}
location / {
include proxy_params;
proxy_pass http://unix:/webapps/mysite/mysite.sock;
}
}
据我所知,nginx在接收请求时,会将Host
头与服务器块的server\u name参数相匹配,如果匹配,则提供服务。然而,nginx似乎试图使用与api.mysite.com不同的Host
头来服务(将请求传递给我的Django服务器)请求。Django有一个名为ALLOWED_HOSTS
(在我的例子中设置为['api.mysite.com']
)的设置,它对Host
头执行进一步的检查,如果请求Host
头不匹配,则会引发错误,这不应该发生,因为nginx应该已经对其进行了过滤。问题是,我看到Django提出的错误如下:
server {
listen 80 default_server;
return 444;
}
- 无效的HTTP_主机头:“/webapps/mysite/mysite.sock:”。根据RFC 1034/1035,提供的域名无效
- 无效的HTTP_主机头:'testp1.piwo.pila.pl'。您可能需要将“testp1.piwo.pila.pl”添加到允许的\u主机
- 无效的HTTP_主机头:'xxx.xxx.xxx.xxx'(我的服务器的真实IP)。您可能需要将“xxx.xxx.xxx.xxx”添加到允许的\u主机
- 我知道请求是通过nginx发出的,因为它们显示在nginx日志中,而且无论如何都不可能直接命中gunicorn服务器,因为我是通过UNIX套接字代理的,而不是通过HTTP代理的
- 我知道这些请求来自一个寻找免费代理的机器人,但我并不太在意。我真正感兴趣的是将
头设置为我的gunicorn/nignx UNIX套接字的本地文件系统上的路径的请求Host
有什么线索吗?发现如果nginx没有遇到匹配的服务器块,它会将请求发送到第一个服务器块。因此,解决方案是设置一个默认服务器块,该块将删除每个请求,如下所示:
server {
listen 80 default_server;
return 444;
}
您是否有nginx的默认站点?我以前遇到过一个问题,当主机与它所服务的任何服务器名称不匹配时,它会按照字母顺序找到第一个。@cdvv7788我没有默认服务器,所以我想这可能就是它。今天下午我要检查一下。@AlexeyTen我已经阅读了该文档,但由于某种原因错过了默认服务器的一部分。不过,我还是对带有“/webapps/mysite/mysite.sock:”主机头的请求感到好奇。我已经厌倦了添加上面的配置,作为/etc/nginx/sites中的默认444配置,并启用了“来自站点”的符号链接。我可以看到配置是实时的(因为nginx从123.45.67.89:80改为0.0.0.0:80),但在请求
http://123.45.67.89
。