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块,直接返回默认页。你误以为流量走的是私网路径,其实是混淆了实例内和本地的解析场景。
修复步骤
- 更新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; } }
- 重启Nginx使配置生效:
sudo systemctl restart nginx
- 验证:在本地电脑执行
nslookup [公网DNS域名],此时会返回公网IPv4地址,访问该域名即可正常获取Django项目内容。
额外建议:如果实例未绑定弹性公网IP(EIP),重启后公网IPv4会随机变化,对应的公网DNS也会改变,建议给实例绑定EIP以保持公网地址稳定。
内容的提问来源于stack exchange,提问作者elliasc04
相关产品推荐
相关产品推荐

