跨服务器连接数据库遭权限拒绝,需修改php.ini或cnf等配置吗?
解决跨服务器MySQL连接"Cannot connect permission denied"问题
先给你吃个定心丸:大部分情况下不需要修改php.ini,这个错误的根源通常不在PHP配置里,咱们一步步排查:
1. 先排查网络层面的拦截(最常见原因)
RHEL 7.5默认启用了firewalld防火墙和SELinux,这俩是远程连接失败的头号嫌疑人:
- 测试端口连通性:在Web服务器上执行以下命令,看看能不能通数据库的3306端口:
如果显示"Connection refused"或超时,说明端口被挡了。nc -zv 172.xx.xx.xx 3306 # 或者用telnet telnet 172.xx.xx.xx 3306 - 开放防火墙端口:在数据库服务器上,给Web服务器的IP单独开放3306端口(比开放所有IP更安全):
firewall-cmd --add-source=你的Web服务器IP --port=3306/tcp --permanent firewall-cmd --reload - 检查SELinux限制:临时关闭SELinux测试(别担心,只是临时生效):
如果关闭后能连接了,就给SELinux加永久规则允许MySQL远程连接:setenforce 0setsebool -P mysqld_can_network_connect 1
2. 确认MySQL的绑定地址配置(需要改cnf的情况)
检查数据库服务器上的MySQL配置文件(通常是/etc/my.cnf或/etc/mysql/my.cnf)里的bind-address参数:
- 如果它被设为
127.0.0.1,MySQL只会监听本地请求,远程连接肯定失败。 - 改成数据库服务器的内网IP(比如
172.xx.xx.xx)或者0.0.0.0(允许所有IP访问),然后重启MySQL服务:systemctl restart mysqld
3. 再次确认MySQL用户权限(别光看表面设置)
你说已经把root的允许主机设为%,但最好登录数据库服务器的MySQL里验证一下:
SELECT user, host, authentication_string FROM mysql.user WHERE user='root';
- 确保存在
root@%的条目 - 确认
authentication_string对应的密码和你代码里的db_pass完全一致(注意大小写、特殊字符) - 如果权限不对,重新创建用户并授权:
CREATE USER 'root'@'%' IDENTIFIED BY 'passwrd'; GRANT ALL PRIVILEGES ON some_db.* TO 'root'@'%'; FLUSH PRIVILEGES;
关于php.ini的说明
除非你的PHP环境禁用了mysqli扩展(但你的代码能触发连接错误,说明扩展是正常加载的),否则不需要修改php.ini。像open_basedir这类PHP安全配置,不会导致数据库连接的"permission denied"错误。
按上面的步骤排查,基本能解决问题。
内容的提问来源于stack exchange,提问作者Mohammed Shoaib




