Kamal部署Rails应用遇MySQL用户访问拒绝问题求助
问题排查:Kamal部署Rails应用时MySQL连接权限错误
核心问题
执行kamal setup时触发数据库连接错误:
Access denied for user 'root'@'1.1.1.79'
排查步骤
1. 验证MySQL用户远程访问权限
MySQL默认root用户仅允许本地(localhost)访问,需确认root用户是否授权从应用服务器IP(1.1.1.79)连接:
- 登录数据库服务器的MySQL控制台:
mysql -u root -p - 查看当前用户权限:
SELECT user, host FROM mysql.user WHERE user = 'root'; - 若没有
root@1.1.1.79或root@%(允许所有IP)的条目,执行授权命令:
注:无密码访问可去掉GRANT ALL PRIVILEGES ON *.* TO 'root'@'1.1.1.79' IDENTIFIED BY '你的数据库密码' WITH GRANT OPTION; FLUSH PRIVILEGES;IDENTIFIED BY '你的数据库密码',但生产环境不建议这么做。
2. 检查MySQL绑定地址
Ubuntu上的MySQL默认可能绑定到127.0.0.1,仅允许本地连接,需修改配置:
- 编辑MySQL配置文件(通常为
/etc/mysql/mysql.conf.d/mysqld.cnf):sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf - 找到
bind-address项,修改为数据库服务器公网IP或0.0.0.0(允许所有IP,生产环境建议指定应用服务器IP段):bind-address = 0.0.0.0 - 重启MySQL服务:
sudo systemctl restart mysql
3. 核对配置文件参数
deploy.yml
确保数据库连接配置指向正确的数据库服务器IP,密码与MySQL授权一致:
database: host: 数据库服务器IP user: root password: 你的数据库密码 port: 3306
.env
确认环境变量中的数据库参数正确:
DATABASE_URL=mysql2://root:你的数据库密码@数据库服务器IP:3306/应用数据库名
database.yml
Rails生产环境配置需匹配Kamal环境变量:
production: url: <%= ENV['DATABASE_URL'] %>
4. 检查防火墙规则
Linode服务器的ufw防火墙或Linode Cloud Firewall可能阻止3306端口访问:
- 在数据库服务器上允许应用服务器IP访问3306端口:
sudo ufw allow from 1.1.1.79 to any port 3306 sudo ufw reload - 同时检查Linode Cloud Firewall规则,确保已将应用服务器IP加入3306端口的允许列表。
5. 测试基础网络连通性
在应用服务器上直接测试MySQL连接,排除Kamal配置问题:
mysql -u root -p -h 数据库服务器IP
若该命令报错,说明是数据库本身的权限/网络问题;若能成功连接,再检查Kamal配置文件是否存在拼写错误。
额外注意事项
- MySQL 8.0+默认使用
caching_sha2_password认证插件,部分旧客户端可能不兼容,若遇认证错误,可修改root用户的认证插件:ALTER USER 'root'@'1.1.1.79' IDENTIFIED WITH mysql_native_password BY '你的数据库密码'; FLUSH PRIVILEGES; - 生产环境不建议用root用户连接数据库,建议创建专用应用数据库用户,仅授予必要权限。
内容的提问来源于stack exchange,提问作者user502052
相关产品推荐
相关产品推荐

