Laravel迁移正常但页面访问报MySQL连接错误(多Vagrant环境)
嘿,这个错误我之前碰到过好几次,结合你的情况来看,核心问题是权限被拒绝(错误码里的(13)就是明证),不是网络不通——毕竟你已经能通过Windows上的HeidiSQL、SSH里的php artisan migrate --seed成功连接数据库了对吧?问题出在应用所在虚拟机的本地权限限制上,下面是一步步排查和解决的方法:
1. 先排查SELinux限制(最常见原因)
CentOS7默认开启SELinux,它会严格限制Web服务(不管是Apache还是Nginx)发起对外网络连接的行为,而你用SSH执行migrate时是用的命令行PHP,和Web服务器的PHP进程处于不同的SELinux上下文,所以不会受限制。
先临时关闭SELinux验证(只是测试用,别一直关着):
sudo setenforce 0刷新应用页面,如果能正常连接数据库,那肯定是SELinux的锅。
永久允许Web服务连接数据库(更安全的正确做法):
不管是Apache还是Nginx,都用这个命令(SELinux把Nginx归到httpd相关的上下文规则里):sudo setsebool -P httpd_can_network_connect_db on加
-P是让这个设置重启后依然生效。
2. 检查应用虚拟机的防火墙出站规则
虽然你能从外部(Windows)和SSH连接数据库,但应用虚拟机的firewalld可能限制了Web服务进程的出站连接:
- 先查看当前防火墙规则:
sudo firewall-cmd --list-all - 如果没有允许到3306端口(MySQL默认端口)的出站规则,就添加一下:
可以直接开放所有到3306的连接:
或者更精准地只允许连接数据库虚拟机的IP:sudo firewall-cmd --add-port=3306/tcp --permanent sudo firewall-cmd --reloadsudo firewall-cmd --add-rich-rule='rule family="ipv4" destination address="192.168.3.16" port port="3306" protocol="tcp" accept' --permanent sudo firewall-cmd --reload
3. 确认应用的数据库配置加载情况
虽然你migrate能成功,但要确保Web服务器加载的数据库配置和命令行用的是同一个:
- 检查应用根目录下的
.env文件,确认DB_HOST是192.168.3.16,DB_PORT是3306,DB_USERNAME和DB_PASSWORD没有写错。 - 注意:如果用的是Apache,修改
.env后需要重启Apache才能让配置生效:
如果是Nginx,重启php-fpm就行:sudo systemctl restart httpdsudo systemctl restart php-fpm
4. 验证Web服务器对.env文件的读取权限
有时候Web服务器的进程用户(比如apache、nginx或者www-data)没有权限读取.env文件,导致数据库配置没加载,自然连不上:
- 先查看
.env文件的权限和所属用户:ls -la .env - 给Web服务器用户加上读取权限:
如果是Apache:
如果是Nginx,把用户换成sudo chown apache:apache .env sudo chmod 640 .envnginx或者www-data就行:sudo chown nginx:nginx .env sudo chmod 640 .env
按这个顺序排查下来,基本上就能解决问题了——毕竟你已经确认网络是通的,核心就是应用所在虚拟机的本地权限限制在搞鬼。
内容的提问来源于stack exchange,提问作者Galanx

