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进程主动加载所需的环境变量:
- 打开你的Apache虚拟主机配置文件,通常路径是
/etc/apache2/sites-available/your-site-name.conf - 在
<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" - 保存文件后,重启Apache服务生效:
sudo systemctl restart apache2
方案2:通过.env文件加载环境变量(更推荐,便于管理)
如果你习惯用.env文件统一管理环境变量,可以让wsgi.py主动加载这个文件:
- 在你的项目根目录创建
.env文件,写入数据库连接信息:DB_HOST=your-rds-instance-endpoint.rds.amazonaws.com DB_USER=your-db-username DB_PASS=your-db-password - 安装
python-dotenv包(确保在虚拟环境中安装):source /home/ubuntu/mysite/mysite_venv/bin/activate pip install python-dotenv deactivate - 修改项目根目录下的
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() - 重启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
相关产品推荐
相关产品推荐

