【发布时间】:2017-01-27 03:00:43
【问题描述】:
我有一个这样设置的站点:nginx 作为代理服务器,代理请求 tu 一个 gunicorn 实例通过 UNIX 套接字为 Django 站点提供服务。
这是我的 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_name 参数进行匹配,如果匹配,则提供服务。但是,nginx 似乎正在尝试使用与 api.mysite.com 不同的 Host 标头来服务(将请求传递给我的 Django 服务器)请求。 Django 有一个名为ALLOWED_HOSTS 的设置(在我的情况下设置为['api.mysite.com']),它执行进一步检查Host 标头并在请求Host 标头不匹配时引发错误,这不应该发生,因为据说 nginx 已经过滤了这个。问题是我看到 Django 引发的错误如下所示:
- HTTP_HOST 标头无效:'/webapps/mysite/mysite.sock:'。根据 RFC 1034/1035,提供的域名无效。
- HTTP_HOST 标头无效:'testp1.piwo.pila.pl'。您可能需要将“testp1.piwo.pila.pl”添加到 ALLOWED_HOSTS。
- 无效的 HTTP_HOST 标头:'xxx.xxx.xxx.xxx' (我的服务器的真实 IP)。您可能需要将“xxx.xxx.xxx.xxx”添加到 ALLOWED_HOSTS。
有几点:
- 我知道请求是通过 nginx 发出的,因为它们显示在 nginx 日志中,而且无论如何直接访问 gunicorn 服务器都是不可能的,因为我通过 UNIX 套接字而不是通过 HTTP 进行代理。
- 我知道这些请求来自一个寻找免费代理的机器人,但我对此并不在意。我真正感兴趣的是带有
Host标头的请求设置为我的 gunicorn/nignx UNIX 套接字的本地文件系统上的路径。
有什么线索吗?
【问题讨论】:
-
你有 nginx 的默认站点吗?过去我遇到过一个问题,当主机与任何 server_names 不匹配时,它会提供按字母顺序找到的第一个。
-
@cdvv7788 我没有默认服务器,所以我想可能就是这样。我下午去看看。
-
@AlexeyTen 我已经阅读了该文档,但由于某种原因错过了默认服务器的部分。
-
不过,我对带有“/webapps/mysite/mysite.sock:”主机标头的请求感到好奇。
标签: django unix nginx proxy gunicorn