如何阻止Django收到大量陌生站点的Invalid HTTP_HOST报错告警?
Nginx配置未生效的核心原因
你添加的默认拦截server块缺少default_server标识和端口监听规则,Nginx无法识别这是处理未匹配域名请求的默认块,因此所有未知Host头的请求还是会落到你后续配置的站点server块中,转发给Django后触发ALLOWED_HOSTS校验报错。
解决方案
1. 修复Nginx默认拦截配置(根源解决报错)
将你顶部的server块替换为以下配置,覆盖HTTP和HTTPS的默认请求拦截:
# 拦截HTTP未匹配域名请求 server { listen 80 default_server; listen [::]:80 default_server; server_name _; return 444; } # 若你配置了HTTPS服务,需额外添加以下块拦截HTTPS未匹配请求 server { listen 443 ssl default_server; listen [::]:443 ssl default_server; server_name _; # 随便填一个自签证书路径即可,仅用于完成SSL握手后返回444 ssl_certificate /etc/nginx/ssl/default.crt; ssl_certificate_key /etc/nginx/ssl/default.key; return 444; }
修改完成后执行命令验证配置合法性并重载Nginx生效:sudo nginx -t && sudo systemctl reload nginx
2. 可选:停止发送该类告警邮件
如果无需接收这类Invalid HTTP_HOST报错告警,可在Django的settings.py中修改日志配置过滤这类日志:
LOGGING = { # 保留你原有LOGGING的其他配置,仅新增/修改以下部分 'filters': { 'skip_invalid_host': { '()': 'django.utils.log.CallbackFilter', 'callback': lambda record: 'Invalid HTTP_HOST header' not in record.getMessage(), } }, 'handlers': { 'mail_admins': { # 保留原有mail_admins的其他配置,新增以下过滤规则 'filters': ['skip_invalid_host'], } } }
修改后重启Django服务即可生效。
3. 常规配置校验
确认你的Djangosettings.py中ALLOWED_HOSTS仅填写你实际使用的站点域名,不要设置为['*']避免安全风险:
ALLOWED_HOSTS = ["你的正式域名.com", "www.你的正式域名.com"]
常见疑问说明
大量陌生域名请求属于公网服务器的正常现象,是网络上的批量扫描器试探服务导致,不属于你的服务器配置错误,配置Nginx默认拦截后即可完全屏蔽这类请求。
内容的提问来源于stack exchange,提问作者Darren
相关产品推荐
相关产品推荐

