You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu EC2部署Django连接AWS RDS MySQL时pymysql错误连接localhost问题求助

解决Django+Apache/mod_wsgi部署时pymysql错误连接localhost的问题

你遇到的核心问题是Apache/mod_wsgi的运行环境没有加载到你的数据库连接环境变量,导致os.environ.get('DB_HOST')返回None——而pymysql在host参数为空时会默认尝试连接localhost,这就引发了ConnectionRefusedError。

开发环境(runserver)能正常工作,是因为它运行在你的终端会话里,继承了终端加载的环境变量;但Apache启动时不会读取用户的bash配置(比如~/.bashrc、~/.profile),所以mod_wsgi进程拿不到这些变量。

下面是几个可行的解决方案:

方案1:在Apache虚拟主机配置中直接设置环境变量

这是最直接的方法,让Apache进程主动加载所需的环境变量:

  1. 打开你的Apache虚拟主机配置文件,通常路径是/etc/apache2/sites-available/your-site-name.conf
  2. 在<VirtualHost *:80>(或HTTPS的<VirtualHost *:443>)块内添加以下配置,替换成你的RDS实际信息:
    SetEnv DB_HOST "your-rds-instance-endpoint.rds.amazonaws.com"
    SetEnv DB_USER "your-db-username"
    SetEnv DB_PASS "your-db-password"
    
  3. 保存文件后,重启Apache服务生效:
    sudo systemctl restart apache2
    

方案2:通过.env文件加载环境变量(更推荐,便于管理)

如果你习惯用.env文件统一管理环境变量,可以让wsgi.py主动加载这个文件:

  1. 在你的项目根目录创建.env文件,写入数据库连接信息:
    DB_HOST=your-rds-instance-endpoint.rds.amazonaws.com
    DB_USER=your-db-username
    DB_PASS=your-db-password
    
  2. 安装python-dotenv包(确保在虚拟环境中安装):
    source /home/ubuntu/mysite/mysite_venv/bin/activate
    pip install python-dotenv
    deactivate
    
  3. 修改项目根目录下的wsgi.py文件,在开头添加加载.env的代码:
    import os
    from dotenv import load_dotenv
    
    # 指向你的项目根目录,替换成实际路径
    project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    load_dotenv(os.path.join(project_root, '.env'))
    
    # 原来的wsgi代码...
    import os
    from django.core.wsgi import get_wsgi_application
    
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
    application = get_wsgi_application()
    
  4. 重启Apache服务生效:
    sudo systemctl restart apache2
    

额外验证步骤

为了确认问题是否解决,你可以临时在views.py里添加日志输出,查看环境变量是否正确加载:

import logging
logger = logging.getLogger(__name__)

# 在数据库连接前添加
db_host = os.environ.get('DB_HOST')
logger.info(f"Loaded DB_HOST: {db_host}")

然后查看Apache的错误日志:

sudo tail -f /var/log/apache2/error.log

如果日志里显示的是你的RDS端点,说明环境变量加载成功。

另外,虽然你已经开放了RDS的安全组,但也要确认EC2实例的安全组允许出站访问RDS的3306端口(MySQL默认端口),避免网络层面的连接问题。

内容的提问来源于stack exchange,提问作者felixjrd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 01:43:12