Docker部署Django项目ALLOWED_HOSTS配置问题排查
解决Django部署在DigitalOcean Droplet时ALLOWED_HOSTS不生效的问题
嘿,我之前在DigitalOcean上部署Docker化的Django项目时也踩过这个一模一样的坑!明明加了IP到ALLOWED_HOSTS还是报错,大概率是配置没真正落地,给你梳理几个排查方向和解决方法:
1. 先确认:你的配置真的被Django读到了吗?
如果你是直接拉取DockerHub上的现成镜像,千万别直接改Droplet主机上的文件——镜像里的配置是打包好的,主机上的修改根本传不到容器里!
- 先进入容器内部查看真实的配置:
找到settings.py,看看ALLOWED_HOSTS里是不是真的有docker exec -it <你的容器名/ID> /bin/bash'167.99.106.66',比如应该是这样:ALLOWED_HOSTS = ['167.99.106.66', 'localhost', '127.0.0.1'] - 如果容器里的配置没改,要么手动在容器里修改后重启,要么更规范的是用环境变量传递配置(推荐!):
启动容器时加环境变量参数:
前提是你的Django配置已经支持读取环境变量,settings.py里要这么写:docker run -e "ALLOWED_HOSTS=167.99.106.66,localhost" -p 8000:8000 <你的镜像名>import os ALLOWED_HOSTS = os.environ.get("ALLOWED_HOSTS", "").split(",")
2. 别忘重启容器!
不管你是手动改了容器里的配置,还是用环境变量传递,一定要重启容器才能让新配置生效:
docker restart <容器名/ID>
重启后可以再进容器确认配置,或者看日志docker logs <容器名>,确保Django启动时加载的是正确的ALLOWED_HOSTS。
3. 反向代理的坑(如果用了Nginx)
要是你在Droplet上搭了Nginx做反向代理,那HTTP_HOST可能是Nginx传给Django的,这时候要注意:
- 检查Nginx配置里的
proxy_set_header,确保传递的Host是正确的,比如:location / { proxy_pass http://localhost:8000; proxy_set_header Host 167.99.106.66; proxy_set_header X-Real-IP $remote_addr; } - 同时Django的ALLOWED_HOSTS要包含Nginx传过来的这个Host值,测试环境可以临时用
ALLOWED_HOSTS = ['*']快速验证。
4. 顺便检查Droplet的防火墙
虽然报错是HTTP_HOST,但也有可能是端口没开放导致请求根本没到Django:
- 去DigitalOcean控制台看Droplet的防火墙规则,确保允许HTTP(80)或你用的端口(比如8000)的入站流量。
- 也可以在Droplet上用
ufw status查看本地防火墙,开放端口:ufw allow 8000/tcp ufw reload
额外的配置建议
- 测试环境可以先用
ALLOWED_HOSTS = ['*']快速排除是不是这个配置的问题,没问题再改成具体的IP或域名。 - 生产环境建议用域名代替IP,把域名解析到Droplet后,ALLOWED_HOSTS里加
['yourdomain.com', 'www.yourdomain.com']。 - 如果用Docker Compose部署,在docker-compose.yml里配置环境变量更方便:
services: web: image: your-django-image environment: - ALLOWED_HOSTS=167.99.106.66,yourdomain.com ports: - "8000:8000"
内容的提问来源于stack exchange,提问作者Omar Jandali
相关产品推荐
相关产品推荐

