Laravel服务器MySQL远程访问配置失败排查求助
首先你的疑问完全正确:当MySQL开启远程访问后,netstat -ltn里的Local Address确实应该显示为0.0.0.0:3306(允许所有IP访问)或者你的服务器公网/内网IP:3306,现在还是127.0.0.1:3306说明你的配置根本没生效,大概率是改了错误的配置文件,下面一步步帮你排查:
1. 找到MySQL真正加载的配置文件
不同Linux发行版的MySQL配置文件位置差异很大,你修改的/etc/mysql/mysql.conf可能不是MySQL实际读取的文件。执行以下命令查看MySQL加载配置的顺序:
mysqld --help --verbose | grep -A 1 "Default options"
输出会类似这样:
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf
重点关注带mysqld相关的配置段,通常在Debian/Ubuntu系统中,实际生效的是/etc/mysql/mysql.conf.d/mysqld.cnf,而不是根目录下的mysql.conf。
2. 修改正确的配置并重启服务
找到正确的配置文件后,编辑它,定位bind-address配置项:
- 若想允许所有IP访问,设置为
bind-address = 0.0.0.0 - 若只想允许特定服务器访问,设置为那台服务器的IP(比如
bind-address = 192.168.1.100)
保存后,务必重启MySQL服务让配置生效:
# Systemd系统(Ubuntu 16.04+/Debian 9+) sudo systemctl restart mysql # 旧版SysVinit系统 sudo service mysql restart
重启后再次执行netstat -ltn,确认3306端口的Local Address已经变成0.0.0.0:3306或者你指定的IP。
3. 确保MySQL用户拥有远程访问权限
即使端口监听正常了,MySQL默认用户只能本地访问,你需要给pf_remote用户授权远程访问权限:
- 登录本地MySQL:
mysql -u root -p
- 执行授权命令(替换
your_password为实际密码):
-- 允许所有IP访问(方便测试,生产环境建议替换%为具体IP) GRANT ALL PRIVILEGES ON *.* TO 'pf_remote'@'%' IDENTIFIED BY 'your_password'; -- 刷新权限让配置生效 FLUSH PRIVILEGES;
如果是MySQL 8.0及以上版本,授权语法略有不同,需要先创建用户再授权:
CREATE USER 'pf_remote'@'%' IDENTIFIED BY 'your_password'; GRANT ALL PRIVILEGES ON *.* TO 'pf_remote'@'%'; FLUSH PRIVILEGES;
4. 排查其他可能的拦截因素
如果以上步骤都完成了还是报错Can't connect to MySQL server on 'xxx.xxx.xxx.xxx' (111),还要检查:
- 云服务器安全组:如果你用的是云服务器(阿里云、AWS、腾讯云等),需要在控制台的安全组规则中,添加一条入站规则,允许3306端口的访问(来源可以是对方服务器IP或者0.0.0.0/0)。
- 其他防火墙:虽然你禁用了ufw,但有些系统可能还有iptables规则,执行
sudo iptables -L -n查看是否有拒绝3306端口的规则,如果有需要删除或者添加允许规则:
sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
完成这些步骤后,再从另一台服务器执行mysql -h xxx.xxx.xxx.xxx -u pf_remote -p测试连接,应该就能成功了。
内容的提问来源于stack exchange,提问作者napalias

