Laravel 4.2.22代码库无法连接AWS RDS数据库问题排查求助
排查方向
错误提示中的(13)是Linux系统层面的「权限拒绝」错误码,优先排查操作系统/服务进程级的权限限制,以下是按优先级排序的排查项:
1. 排查SELinux策略限制(90%概率为该问题)
- 先临时关闭SELinux验证:执行命令
setenforce 0,再访问API测试连接,如果恢复正常即可确认是SELinux策略拦截了Apache的数据库连接请求。 - 无需关闭SELinux的永久解决方案:执行命令
setsebool -P httpd_can_network_connect_db 1,给Apache进程开放访问数据库的网络权限即可。
2. 排查Apache运行环境的配置读取问题
- 你本地用
php artisan serve调用的是PHP CLI的配置,而服务器上Apache调用的是mod_php/php-fpm的配置,两者的环境变量、加载的配置文件可能存在差异。 - 先写简易测试脚本排除Laravel框架问题:在站点根目录新建测试文件
test_pdo.php,代码如下,通过浏览器访问该文件看连接结果:
<?php try { $pdo = new PDO('mysql:host=你的RDS域名;port=3306;dbname=你的数据库名', '数据库用户名', '数据库密码'); echo "连接成功"; } catch (PDOException $e) { echo "连接失败:".$e->getMessage(); }
- 如果测试脚本也报相同错误,说明和Laravel框架无关,问题出在Apache/PHP服务层面。
- 核对Laravel环境配置:Laravel 4.2支持多环境配置,确认你部署的stage环境下
app/config/stage/database.php的配置和你本地使用的配置完全一致,避免硬编码错误。
3. 排查服务器进程级网络限制
- 你在shell下能连接数据库不代表Apache进程也有权限发起网络请求,执行命令
sudo -u www-data telnet 你的RDS域名 3306(把www-data替换成你服务器上Apache的运行用户),测试Apache用户是否能正常访问RDS的3306端口。 - 检查服务器上的iptables/firewalld规则,确认没有限制Apache进程的出站请求。
- 二次核对AWS RDS安全组规则,确认已经放行本地机房服务器的公网IP访问3306端口。
4. 排查PHP模块兼容问题
- 对比服务器PHP版本和本地测试环境的PHP版本,低版本PHP的PDO_MYSQL扩展可能存在兼容性问题,无法适配RDS的密码加密规则、SSL连接要求。
- 检查Apache对应的php.ini配置,确认pdo_mysql扩展已正常启用,没有配置错误的socket路径、连接限制参数。
内容的提问来源于stack exchange,提问作者dhof
相关产品推荐
相关产品推荐

