在Digital Ocean服务器部署Cookiecutter Django遇ALLOWED_HOSTS错误求助
针对你遇到的ALLOWED_HOSTS报错,以及需要的极简DigitalOcean部署方案,我整理了以下步骤,帮你快速解决问题:
一、先搞定ALLOWED_HOSTS错误:确认生产环境配置真的生效了
Cookiecutter Django是靠环境变量来切换settings的,你只改了production.py但可能没让服务器用这个配置,这大概率是问题根源:
- 检查环境变量
DJANGO_SETTINGS_MODULE
终端里执行:echo $DJANGO_SETTINGS_MODULE
如果输出不是config.settings.production,说明服务器还是在用默认的开发配置。- 临时生效:
export DJANGO_SETTINGS_MODULE=config.settings.production - 永久生效(每次登录都生效):编辑
~/.bashrc或~/.profile,把上面的命令加进去,然后执行source ~/.bashrc刷新。
- 临时生效:
- 帮Gunicorn指定生产配置
如果你用Gunicorn启动服务,要确保启动命令里明确指定生产环境,比如:
要是你用systemd管理Gunicorn服务,记得在服务文件的gunicorn --bind 0.0.0.0:8000 config.wsgi:application --env DJANGO_SETTINGS_MODULE=config.settings.production[Service]段加上环境变量配置:Environment="DJANGO_SETTINGS_MODULE=config.settings.production" - 验证ALLOWED_HOSTS的真实值
有时候环境变量会覆盖production.py里的默认值,你可以直接进Django生产环境shell确认:
激活虚拟环境后执行:
然后在shell里输入:python manage.py shell --settings=config.settings.production
如果输出不是from django.conf import settings print(settings.ALLOWED_HOSTS)['128.199.100.100'],说明DJANGO_ALLOWED_HOSTS环境变量被设成了其他值,执行echo $DJANGO_ALLOWED_HOSTS看看,要是不对就设置:
同样可以把这个命令加到export DJANGO_ALLOWED_HOSTS="128.199.100.100"~/.bashrc里永久生效。
二、DigitalOcean无Docker部署Cookiecutter Django的极简步骤
结合你参考的Django+Postgres+Gunicorn教程,补充Cookiecutter特有的配置细节:
- 服务器基础配置
- 更新系统:
sudo apt-get update && sudo apt-get upgrade -y - 装依赖:
sudo apt-get install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx curl
- 更新系统:
- 虚拟环境与项目代码
- 装virtualenv:
pip3 install virtualenv - 到项目目录,创建并激活虚拟环境:
virtualenv venv && source venv/bin/activate - 上传你的Cookiecutter项目代码(用git克隆或scp上传都行)
- 装生产依赖:
pip install -r requirements/production.txt
- 装virtualenv:
- PostgreSQL配置
- 按照教程创建数据库和用户,然后在项目根目录的
.env文件里设置数据库连接:DATABASE_URL=postgres://你的数据库用户名:密码@localhost/数据库名
- 按照教程创建数据库和用户,然后在项目根目录的
- 生产环境初始化
- 设置关键环境变量(可以把这些加到
~/.bashrc里):export DJANGO_SETTINGS_MODULE=config.settings.production export DJANGO_ALLOWED_HOSTS="128.199.100.100" export SECRET_KEY="你的生产环境密钥(别用开发环境的!)" - 执行迁移:
python manage.py migrate --settings=config.settings.production - 收集静态文件:
python manage.py collectstatic --settings=config.settings.production
- 设置关键环境变量(可以把这些加到
- Gunicorn与Nginx配置
- 测试Gunicorn启动:
gunicorn --bind 0.0.0.0:8000 config.wsgi:application,能正常启动就没问题 - 按照教程创建systemd服务管理Gunicorn,记得把环境变量加到服务文件里(前面提过)
- 配置Nginx反向代理到Gunicorn的8000端口,确保Nginx配置里有
proxy_set_header Host $host;(这个会影响Django获取的HTTP_HOST) - 重启Nginx:
sudo systemctl restart nginx
- 测试Gunicorn启动:
- 防火墙配置
- 开放Nginx端口:
sudo ufw allow 'Nginx Full'
- 开放Nginx端口:
三、最后排查小技巧
如果还是报ALLOWED_HOSTS错误,检查:
- Nginx的
proxy_set_header Host $host;是否存在,有没有写错 - 服务器的防火墙是不是没开80端口,导致请求走了其他路径
- 有没有重启Gunicorn和Nginx,确保配置生效
内容的提问来源于stack exchange,提问作者diogenes
相关产品推荐
相关产品推荐

