You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lightsail部署Django遇HTTP_HOST错误:EC2域名跳转与配置疑问

Django部署问题解答

问题背景

我在Amazon Lightsail VPS上部署了Django应用,通过域名xxxxx.com访问一切正常,但使用IP地址访问时出现以下错误:

Invalid HTTP_HOST header: 'ec2-MY-IP-ADDR-Here.compute-1.amazonaws.com'. 
You may need to add 'ec2-MY-IP-ADDR-Here.compute-1.amazonaws.com' to ALLOWED_HOSTS.
DisallowedHost at /

Invalid HTTP_HOST header: 'ec2-MY-IP-ADDR-Here.compute-1.amazonaws.com'. 
You may need to add 'ec2-MY-IP-ADDR-Here.compute-1.amazonaws.com' to  ALLOWED_HOSTS.
Request Method: GET
Request URL: https://ec2-MY-IP-ADDR-Here.compute-1.amazonaws.com/

其中MY-IP-ADDR-Here为实际IP地址。我有以下疑问:

  1. 为何Lightsail会将请求URL从MY.IP.Addr.Here转为ec2-MY-IP-ADDR-Here.compute-1.amazonaws.com?
  2. 为何Nginx会将该请求代理至Django,而非直接丢弃?
  3. 将ec2-MY-IP-ADDR-Here.compute-1.amazonaws.com添加至ALLOWED_HOSTS是否安全?
  4. 从settings.py中移除MY-IP-ADDR-Here是否合理?

相关配置

Nginx配置(/etc/nginx/sites-enabled/mysite)

server {
    listen 80;
    server_name xxxxx.com MY.IP.ADDr.Here;
    location / {
        include proxy_params;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_redirect off;
        proxy_pass http://unix:/run/gunicorn.sock;        
    }
}
# many lines created by certbot  
#
# I added the following block to tell nginx to discard any request that doesn't match the xxxxx.com MY.IP.ADDr.Here;
# https://docs.djangoproject.com/en/5.0/howto/deployment/checklist/#allowed-hosts

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    return 444;
}

Django配置(myproject/settings.py)

ALLOWED_HOSTS = ["xxxxx.com", "MY-IP-ADDR-Here"]

问题解答

1. 为何Lightsail会将请求URL从IP转为ec2域名?

这是Amazon Lightsail(本质是EC2简化版)的默认机制——所有实例都会被分配专属的ec2-[IP]-compute-1.amazonaws.com格式反向DNS记录。当你直接通过IP访问时,DNS解析或Lightsail网络层会自动把IP映射到这个AWS生成的域名,导致请求的Host头被替换成该域名。

2. 为何Nginx会代理该请求到Django?

你贴的配置里只给80端口设置了默认拒绝规则(return 444),但报错里的请求是https://开头的443端口请求。Certbot生成的HTTPS服务器块你没贴全,当用HTTPS访问那个AWS域名时,Nginx找不到匹配server_name的443服务器块,就会用第一个存在的443服务器块(也就是为xxxxx.com生成的那个)处理请求,自然就把请求转发给了Django。

3. 添加这个AWS域名到ALLOWED_HOSTS是否安全?

安全。这个域名是绑定到你Lightsail实例IP的专属域名,只有你的实例在使用,不会被其他用户占用。只要你控制着这个实例,就不用担心第三方通过该域名访问应用带来安全风险。哪怕后续销毁实例,AWS会回收这个域名,那时应用也已不存在,不会有遗留问题。

4. 从settings.py移除IP地址是否合理?

分两种情况:

  • 如果你不需要用户直接通过IP访问应用,只保留域名访问,那移除IP是合理的,能缩小ALLOWED_HOSTS范围,降低潜在攻击面。
  • 如果你还需要保留IP访问功能,那不能移除IP,同时得把那个AWS生成的域名也加入ALLOWED_HOSTS,避免再次触发DisallowedHost错误。

内容的提问来源于stack exchange,提问作者tabebqena

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 16:30:11