解决PHP连接MySQL报错:Can't connect to MySQL server (13)
当PHP应用在测试环境运行正常,但迁移至正式环境后无论使用TCP/IP还是Unix Socket均无法连接MySQL,且命令行能正常访问时,极有可能是Linux系统的SELinux安全策略拦截了HTTP进程的网络外连请求。
现象与原因分析
在排查此类问题时,通常先检查PHP代码、网络防火墙以及MySQL授权列表。如果这些配置均无异常,且错误日志中出现如下提示:
Could not connect: Can't connect to MySQL server on 'MYSQL.SERVER' (13)
括号内的数字 13 在MySQL错误码中对应 EACCES(Permission denied)。由于命令行环境下可以直接通过客户端工具登录数据库,说明数据库服务本身和账号密码是正确的。问题的核心在于Web服务进程(如Apache/Nginx配合PHP-FPM或mod_php)被操作系统层面的安全模块限制了发起网络连接的能力。
解决方案
第1步:确认SELinux状态与相关策略
首先,查看当前SELinux是否处于Enforcing(强制)模式,并检查与HTTPD相关的布尔值设置。
输出结果通常显示为 httpd_can_network_connect --> off。默认情况下,为了安全起见,SELinux禁止Web服务器进程主动发起对外网络连接(包括连接本地或远程MySQL),从而导致PHP报出连接超时或拒绝连接错误。
第2步:开启允许HTTPD网络连接MySQL的策略
最安全的做法是精准开启该布尔值,无需关闭整个SELinux机制。
参数说明:
-P:将更改写入配置文件,确保重启服务器后依然生效。=1(或on):开启该权限。
第3步:验证连接是否正常
执行命令后,无需重启Apache或Nginx服务,重新刷新PHP页面或运行简单的DB连接脚本,观察是否恢复连接。如果问题解决,即证实了之前的推断。
第4步(备选):修改全局SELinux配置
如果对SELinux不熟悉,或者业务环境对安全性要求不高,可以选择在系统层面直接禁用SELinux。此方法需要重启系统才能完全生效,生产环境请谨慎操作。
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
#SELINUX=enforcing
#把设置改为disabled
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
保存配置文件 /etc/sysconfig/selinux 后,执行以下命令可在线临时解除限制进行测试:
[root@imysql ~]# setenforce 0
setenforce: SELinux is disabled
注意:setenforce 0 只是临时生效,重启后会恢复为配置文件中的状态。若希望永久生效,必须修改上述配置文件并重启系统。
总结
遇到PHP与MySQL通信失败但服务端正常时,务必检查操作系统的附加安全层。通过 setsebool -P httpd_can_network_connect=1 是解决此类SELinux冲突的标准且推荐的方法,既保障了应用连通性,又保留了其余的安全防护能力。以上就是SELinux导致PHP连接MySQL异常的详细解决方法,更多关于Linux系统调优的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













