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

AWS EC2公网IPv4 DNS指向私网地址及Nginx默认页问题排查

AWS Django部署问题排查与解决

问题背景

在新AWS账户的默认VPC中,基于Ubuntu 22.04实例部署Django项目:

  • 自定义安全组:入站开放IPv6/IPv4的80端口(HTTP)、IPv4的22端口(SSH),出站默认全IPv4全端口
  • 部署组件:Gunicorn + Nginx + Supervisor,sudo nginx -t无报错,Supervisor无错误日志
  • 访问现状:公网IPv4访问API正常(根路径显示Not Found),私网IPv4无响应;通过公网IPv4的DNS地址访问仅返回Nginx默认页,实例内nslookup该DNS返回私网IPv4

Nginx配置:

  • 修改nginx.conf用户为root
  • 在/etc/nginx/sites-available与sites-enabled下创建并关联django.conf,内容如下:
server{
listen 80;
Server_name [公网IPv4地址,而非DNS] ;

location / {
    include proxy_params;
    proxy_pass http://unix:/home/ubuntu/[项目名]/app.sock;
}
}

疑问解答与修复方案

1. 公网DNS指向私网IPv4的原因

AWS的公网DNS域名存在内外解析差异:在VPC内部(比如实例本地)解析时,会返回实例的私网IPv4地址;只有从VPC外部(如本地电脑网络)解析,才会返回公网IPv4地址。你在实例内执行nslookup,属于VPC内部解析场景,所以得到私网地址。

2. 指向私网地址却能返回内容的原因

你在本地访问公网DNS时,本地DNS服务器是从VPC外部解析,返回的是公网IPv4,流量实际走公网路径到达实例。但你的Nginx配置中server_name只配置了公网IPv4,没包含公网DNS域名,导致Nginx匹配不到对应的server块,直接返回默认页。你误以为流量走的是私网路径,其实是混淆了实例内和本地的解析场景。

修复步骤

  1. 更新Nginx配置:将公网DNS域名添加到django.conf的Server_name字段中,示例:
server{
listen 80;
Server_name [公网IPv4地址] [公网DNS域名] ;

location / {
    include proxy_params;
    proxy_pass http://unix:/home/ubuntu/[项目名]/app.sock;
}
}
  1. 重启Nginx使配置生效:
sudo systemctl restart nginx
  1. 验证:在本地电脑执行nslookup [公网DNS域名],此时会返回公网IPv4地址,访问该域名即可正常获取Django项目内容。

额外建议:如果实例未绑定弹性公网IP(EIP),重启后公网IPv4会随机变化,对应的公网DNS也会改变,建议给实例绑定EIP以保持公网地址稳定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 13:05:13