AWS部署代码时遇SQLSTATE[HY000][2002]权限拒绝错误求助
解决SQLSTATE[HY000] [2002] Permission denied问题
1. 排查AppArmor限制(Ubuntu默认启用)
Ubuntu 24.04默认用AppArmor做进程权限管控,可能阻止应用程序访问MySQL连接:
- 查看AppArmor状态:
sudo aa-status - 临时解除MySQL的AppArmor强制规则测试:
sudo aa-complain /etc/apparmor.d/usr.sbin.mysqld - 若测试后问题解决,修改AppArmor规则允许应用进程访问:
编辑/etc/apparmor.d/usr.sbin.mysqld,添加应用运行目录或二进制路径,例如:
重新加载规则:/var/www/your-app/** rw,sudo systemctl reload apparmor
2. 核对应用数据库连接配置
大概率是配置误用本地socket而非TCP远程连接:
- 检查应用配置文件(如Laravel的
.env、Django的settings.py),确认数据库主机为数据库服务器的私有IP/公网IP,而非localhost或127.0.0.1(这两个会调用本地socket,应用服务器无MySQL服务)。 - 示例正确配置(Laravel为例):
DB_HOST=10.0.0.10 # 数据库服务器私有IP DB_PORT=3306 DB_DATABASE=your_db_name DB_USERNAME=your_db_user DB_PASSWORD=your_db_pass
3. 确认MySQL的bind-address设置
确保MySQL允许远程IP连接:
- 编辑MySQL配置文件
/etc/mysql/mysql.conf.d/mysqld.cnf,修改bind-address为0.0.0.0(允许所有IP)或应用服务器的私有IP:bind-address = 0.0.0.0 - 重启MySQL服务:
sudo systemctl restart mysql
4. 检查应用服务器本地防火墙
除AWS安全组外,应用服务器的ufw可能限制出站连接:
- 查看ufw状态:
sudo ufw status - 若3306端口出站被阻,添加规则:
sudo ufw allow out 3306/tcp
5. 验证MySQL用户的主机授权范围
确认授权用户的主机匹配应用服务器IP:
- 在MySQL服务器执行:
SELECT user, host FROM mysql.user WHERE user='your_db_user'; - 确保host为
%(允许所有IP)或应用服务器的具体IP,而非localhost。 - 若范围错误,重新授权:
GRANT ALL PRIVILEGES ON your_db_name.* TO 'your_db_user'@'%' IDENTIFIED BY 'your_db_pass'; FLUSH PRIVILEGES;
内容的提问来源于stack exchange,提问作者user27339248
相关产品推荐
相关产品推荐

