You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

MySQL连接报错no route to host,同交换机机器通信正常求排查

解决PHP连接MySQL时的"No route to host"报错

看起来你遇到了个有点棘手的小问题——两台机器双向ping、sftp都正常,但PHP连MySQL就抛出"No route to host"错误。结合你给出的netstat结果(MySQL 3306端口确实在监听0.0.0.0:*),基础网络连通性肯定没问题,问题大概率出在特定端口的访问限制或者MySQL/PHP的配置细节上。下面是我整理的一步步排查方案:

1. 先查服务器防火墙:大概率是它在拦3306端口

虽然ping、sftp能通,但防火墙很可能单独拦截了MySQL的3306端口。你可以先临时关闭防火墙测试(测试完记得重新开启):

  • 用firewalld的服务器:
    sudo systemctl stop firewalld
    
  • 用iptables的服务器:
    sudo iptables -F && sudo iptables -P INPUT ACCEPT && sudo iptables -P OUTPUT ACCEPT
    

如果关闭后PHP能正常连接,那就是防火墙的锅了,赶紧给3306端口加个允许规则:

  • firewalld:
    sudo firewall-cmd --add-port=3306/tcp --permanent
    sudo firewall-cmd --reload
    
  • iptables:
    sudo iptables -A INPUT -p tcp --dport 3306 -s 192.168.0.7 -j ACCEPT
    sudo service iptables save
    

2. 确认MySQL的绑定地址配置没坑

虽然netstat显示监听0.0.0.0,但有时候MySQL配置文件里的设置可能没生效,或者不小心开了skip-networking。打开你的MySQL配置文件(常见路径是/etc/my.cnf/etc/mysql/mysql.conf.d/mysqld.cnf),检查这两项:

bind-address = 0.0.0.0  # 确保绑定的是所有地址,不是127.0.0.1
# 注释掉这行,如果有的话
# skip-networking = 1

修改后记得重启MySQL服务:

sudo systemctl restart mysqld

3. 直接测试客户端到3306端口的连通性

telnet或者nc工具直接测端口,比PHP连接更直观,能快速定位是网络还是代码问题:
在客户端机器上执行:

telnet 192.168.0.10 3306

或者用nc(如果装了的话):

nc -zv 192.168.0.10 3306

如果连接失败,回到第一步查防火墙;如果连接成功,那问题可能出在PHP代码或者MySQL用户权限上。

4. 检查MySQL用户的访问权限

MySQL用户默认可能只能本地登录(比如web@localhost),你得确保web用户允许从客户端IP(192.168.0.7)访问。登录服务器的MySQL控制台,执行:

-- 允许web用户从192.168.0.7访问指定数据库
GRANT ALL PRIVILEGES ON 你的数据库名.* TO 'web'@'192.168.0.7' IDENTIFIED BY '你的密码';
-- 或者允许整个192.168.0.0网段访问(更灵活)
-- GRANT ALL PRIVILEGES ON 你的数据库名.* TO 'web'@'192.168.0.%' IDENTIFIED BY '你的密码';
FLUSH PRIVILEGES;

记得把你的数据库名你的密码换成实际值。

5. 排查SELinux的限制(如果服务器开了的话)

有些Linux服务器默认开启SELinux,它可能会阻止PHP发起网络连接到MySQL端口。你可以先临时关闭SELinux测试:

sudo setenforce 0

如果能连接了,就给SELinux加个永久规则允许PHP访问数据库:

sudo setsebool -P httpd_can_network_connect_db on

按照上面的步骤一步步排查,应该能快速定位到问题根源。

内容的提问来源于stack exchange,提问作者Dennis Dumont

火山引擎 最新活动