我有一个以这种方式设置的站点: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_name参数进行匹配,如果匹配,则为其提供服务。但是,nginx似乎试图使用与api.mysite.com不同的Host
标头服务(将请求传递给我的Django服务器)请求。 Django有一个名为ALLOWED_HOSTS
的设置(在我的情况下设置为['api.mysite.com']
),它执行进一步检查Host
标头,如果请求Host
标头没有,则会引发错误匹配,这不应该发生,因为nginx应该已经过滤了这个。问题是我看到Django引发的错误如下:
有几件事:
Host
标头设置为gunicorn / nignx UNIX套接字的本地文件系统上的路径的请求。有任何线索吗?
答案 0 :(得分:1)
事实证明,如果nginx没有遇到匹配的服务器块,它会将请求发送到第一个服务器块。所以解决方案是设置一个默认的服务器块,它会丢弃这样的每个请求:
server {
listen 80 default_server;
return 444;
}