Django 为什么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 / {

我有一个站点是这样设置的:nginx作为代理服务器,通过UNIX套接字代理请求到为Django站点服务的gunicorn实例

这是我的nginx配置:

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代理的
  • 我知道这些请求来自一个寻找免费代理的机器人,但我并不太在意。我真正感兴趣的是将
    Host
    头设置为我的gunicorn/nignx UNIX套接字的本地文件系统上的路径的请求

有什么线索吗?

发现如果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