Godaddy DNS指向AWS EC2后,Django+Gunicorn+Nginx配置400错误求助
解决域名访问返回Bad Request (400) 的方案
看起来你遇到的是Django部署中很常见的域名权限问题,结合你的配置信息,我整理了分步解决办法:
1. 首先修正Django的ALLOWED_HOSTS配置
Bad Request 400最直接的原因就是Django没有把你的域名加入允许访问的主机列表。你当前的settings.py里只加了EC2的IP,必须把域名也加进去:
打开你的settings.py文件,修改ALLOWED_HOSTS这一行:
ALLOWED_HOSTS = ['11.222.33.444', 'domainname.com', 'www.domainname.com']
修改完成后,一定要重启Gunicorn让配置生效,比如用systemd管理的话执行:
sudo systemctl restart gunicorn
2. 补全并验证Nginx配置
你提供的Nginx配置片段不完整,确保配置包含反向代理到Gunicorn的核心部分,完整配置示例如下:
server { listen 80; server_name 11.222.33.444 domainname.com www.domainname.com; # 处理favicon,避免日志冗余 location = /favicon.ico { access_log off; log_not_found off; } # 处理静态文件(如果你的Django项目有静态资源的话) location /static/ { root /path/to/your/django/project; # 替换成你的Django项目根目录路径 } # 核心反向代理配置,把请求转发给Gunicorn location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://127.0.0.1:8000; # 这里要和Gunicorn监听的地址端口一致 } }
配置写完后,先测试Nginx配置是否合法:
sudo nginx -t
如果输出test is successful,就重启Nginx:
sudo systemctl restart nginx
3. 确认DNS解析完全生效
虽然你说DNS工具显示IP正确,但本地设备可能还缓存着旧的解析记录。可以在本地终端用命令再验证一遍:
nslookup domainname.com nslookup www.domainname.com
确保两次返回的IP都是你的EC2实例IP。如果本地还是不对,清空本地DNS缓存:
- Windows:
ipconfig /flushdns - macOS:
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder - Linux:根据发行版不同,比如Ubuntu用
sudo systemd-resolve --flush-caches
4. 检查Gunicorn的监听设置
确保Gunicorn是监听在本地回环地址(比如127.0.0.1:8000),而不是只绑定EC2的公网IP。启动Gunicorn的命令应该类似:
gunicorn --bind 127.0.0.1:8000 your_project.wsgi:application
如果是用systemd服务管理Gunicorn,也要检查服务配置文件里的ExecStart行,确保绑定地址和Nginx的proxy_pass一致。
5. 查看日志定位细节
如果以上步骤都做完还是有问题,就去看日志找线索:
- Django日志:看你项目里配置的日志文件,或者
settings.py中LOGGING指定的路径 - Gunicorn日志:用
journalctl -u gunicorn查看(如果是systemd管理的话) - Nginx错误日志:一般在
/var/log/nginx/error.log
日志里会有更具体的错误信息,帮你精准排查。
内容的提问来源于stack exchange,提问作者Daniel Yanez
相关产品推荐
相关产品推荐

