在AWS EC2部署Django网站时遭遇DATABASE_URL环境变量未设置错误
AWS EC2部署Django网站时DATABASE_URL环境变量未加载问题
错误提示
No DATABASE_URL environment variable set, and so no databases setup.
现有配置说明
production.py数据库配置
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'lighthousemediadb', 'USER': "postgres", 'PASSWORD': os.environ.get('DB_PASSWORD'), # 生产环境不硬编码密码 'HOST': os.environ.get('DB_HOST'), 'PORT': '5432', # 小幅提升性能的配置 'client_encoding': 'UTF8', 'default_transaction_isolation': 'read committed', 'timezone': 'UTC' } } import dj_database_url db_from_env = dj_database_url.config() DATABASES['default'].update(db_from_env) DATABASES['default']['CONN_MAX_AGE'] = 500
gunicorn.service配置
[Unit] Description=gunicorn daemon Requires=gunicorn.socket After=network.target [Service] User=ubuntu Group=www-data EnvironmentFile=/home/ubuntu/lighthousemedia/LightHouseMediaAgency/.env WorkingDirectory=/home/ubuntu/lighthousemedia/LightHouseMediaAgency ExecStart=/home/ubuntu/lighthousemedia/.venv/bin/gunicorn \ --access-logfile - \ --workers 3 \ --bind unix:/run/gunicorn.sock \ BE.wsgi:application [Install] WantedBy=multi-user.target
.env文件内容
SECRET_KEY = 'epmxxxxxxxxxxxxu$0' DEBUG = True ALLOWED_HOSTS = '3.196.58.181', 'abc.com', 'localhost', '127.0.0.1' DB_PASSWORD = 'password' DB_HOST = 'lighthousemediadb.crte3456.ap-south-1.rds.amazonaws.com' DATABASE_URL = postgresql://postgres:password@lighthousemediadb.crte3456.ap-south-1.rds.amazonaws.com:5432/dbname
问题原因与解决步骤
1. .env文件格式错误(核心问题)
systemd的EnvironmentFile不支持环境变量赋值时等号两边加空格,当前.env文件中所有变量的等号前后都有空格,导致systemd无法正确解析变量。
修正后的.env文件:
SECRET_KEY='epmxxxxxxxxxxxxu$0' DEBUG=True ALLOWED_HOSTS='3.196.58.181', 'abc.com', 'localhost', '127.0.0.1' DB_PASSWORD='password' DB_HOST='lighthousemediadb.crte3456.ap-south-1.rds.amazonaws.com' DATABASE_URL=postgresql://postgres:password@lighthousemediadb.crte3456.ap-south-1.rds.amazonaws.com:5432/dbname
2. 重启gunicorn服务使配置生效
执行以下命令重载systemd配置并重启gunicorn:
sudo systemctl daemon-reload sudo systemctl restart gunicorn.service
3. 验证环境变量是否加载成功
找到gunicorn进程ID,然后查看进程环境变量:
# 查找gunicorn进程PID ps aux | grep gunicorn # 替换<PID>为实际进程ID,查看DATABASE_URL是否存在 cat /proc/<PID>/environ | tr '\0' '\n' | grep DATABASE_URL
如果输出包含正确的DATABASE_URL值,说明变量加载成功。
4. 额外检查项
- 确认
.env文件权限:确保ubuntu用户拥有读取权限,执行ls -l /home/ubuntu/lighthousemedia/LightHouseMediaAgency/.env,权限应包含r(可读)。 - 确认DATABASE_URL格式正确:确保URL中的数据库名称、密码、主机地址与AWS RDS实例信息完全匹配。
内容的提问来源于stack exchange,提问作者Rahul Verma
相关产品推荐
相关产品推荐

