You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

跨服务器连接数据库遭权限拒绝,需修改php.ini或cnf等配置吗?

解决跨服务器MySQL连接"Cannot connect permission denied"问题

先给你吃个定心丸:大部分情况下不需要修改php.ini,这个错误的根源通常不在PHP配置里,咱们一步步排查:

1. 先排查网络层面的拦截(最常见原因)

RHEL 7.5默认启用了firewalld防火墙和SELinux,这俩是远程连接失败的头号嫌疑人:

  • 测试端口连通性:在Web服务器上执行以下命令,看看能不能通数据库的3306端口:
    nc -zv 172.xx.xx.xx 3306
    # 或者用telnet
    telnet 172.xx.xx.xx 3306
    
    如果显示"Connection refused"或超时,说明端口被挡了。
  • 开放防火墙端口:在数据库服务器上,给Web服务器的IP单独开放3306端口(比开放所有IP更安全):
    firewall-cmd --add-source=你的Web服务器IP --port=3306/tcp --permanent
    firewall-cmd --reload
    
  • 检查SELinux限制:临时关闭SELinux测试(别担心,只是临时生效):
    setenforce 0
    
    如果关闭后能连接了,就给SELinux加永久规则允许MySQL远程连接:
    setsebool -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

火山引擎 最新活动