Apache服务器中Flask应用远程调用MySQL连接失败求助
解决远程调用Flask接口无法连接MySQL的问题
针对你遇到的Database error: 2003 (HY000): Can't connect to MySQL server on 'localhost:3306' (13)错误,以下是具体排查和解决步骤:
核心原因分析
错误码13表示权限被拒绝,并非MySQL服务未启动或端口不可达——你在服务器本地运行代码能正常连接,说明MySQL本身没问题,问题出在Apache/Flask运行的进程没有访问MySQL的权限(Alma Linux默认开启SELinux,这是最常见的诱因)。
1. 临时关闭SELinux验证问题
先确认是否是SELinux限制:
# 查看SELinux状态 sestatus # 如果输出为Enforcing,临时关闭 setenforce 0
关闭后再次远程调用/db_test接口,如果能正常连接,说明就是SELinux的问题,继续下一步永久配置。
2. 永久允许Apache连接数据库
执行以下命令开启Apache连接数据库的SELinux规则(-P参数确保重启后依然生效):
setsebool -P httpd_can_network_connect_db on
3. 验证数据库用户的连接权限
确保你的数据库用户允许从localhost(或socket)连接:
- 登录MySQL:
mysql -u root -p
- 查询用户权限:
SELECT user, host FROM mysql.user;
如果你的应用使用的数据库用户host字段不是localhost或%,需要修改权限:
GRANT ALL PRIVILEGES ON your_database.* TO 'your_user'@'localhost' IDENTIFIED BY 'your_password'; FLUSH PRIVILEGES;
4. 检查MySQL Socket文件权限(可选)
如果你的Flask应用通过Unix Socket而非TCP连接MySQL,需确保Apache进程能访问socket文件:
- 查看MySQL配置中的socket路径(通常在
/etc/my.cnf或/etc/mysql/my.cnf):
[mysqld] socket = /var/lib/mysql/mysql.sock
- 检查socket文件权限:
ls -l /var/lib/mysql/mysql.sock
- 如果权限不足,可调整SELinux上下文:
chcon -t httpd_var_run_t /var/lib/mysql/mysql.sock
内容的提问来源于stack exchange,提问作者Yash Khasgiwala
相关产品推荐
相关产品推荐

