AWS部署PHP应用连接数据库报504网关超时如何排查?
问题根因分析
504网关超时本质是请求处理时间超过了ELB/PHP的最大执行时间限制,结合你本地可正常连接同一RDS、仅Elastic Beanstalk环境超时的特征,90%以上是网络访问控制配置问题,和平台支持性无关:Elastic Beanstalk的PHP运行环境默认已预装pdo_mysql扩展,完全支持PDO连接MariaDB的操作。
最常见的故障点如下:
- RDS安全组入站规则配置错误
你本地XAMPP能正常连接,是因为你已经将本地公网IP添加到了RDS安全组的3306端口入站允许列表中,但没有允许Elastic Beanstalk环境对应的EC2实例安全组访问RDS的3306端口。你可以进入AWS控制台RDS实例的安全组配置,添加入站规则:协议选TCP,端口3306,来源选择你的Elastic Beanstalk环境的EC2实例安全组ID即可。 - 网络路由/解析配置异常
如果你的RDS配置了仅VPC内部访问,或是Elastic Beanstalk环境和RDS不在同一个VPC,也会导致网络不通。如果RDS开启了公网访问,你可以尝试将代码中的数据库地址替换为RDS的公网域名临时验证,确认问题后再调整VPC路由配置走内网连接。 - 代码缺少PDO错误捕获逻辑
你当前的PDO连接代码没有开启错误模式,连接失败时会无输出持续等待,最终触发超时。可以修改连接代码开启异常抛出,方便定位问题:
<?php $dsn = 'mysql:host=<AWS database hostname>; dbname=e-flash-card-schema;charset=utf8mb4'; $username = '<username>'; $password = '<password>'; // 增加PDO错误配置,连接出错直接抛出异常 $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_TIMEOUT => 5, // 设置连接超时时间为5秒,避免长时间卡住 ]; try { $db = new PDO($dsn, $username, $password, $options); } catch (PDOException $e) { die("数据库连接失败:" . $e->getMessage()); }
额外优化建议(非本次故障原因,建议修复)
你当前的SQL写法存在SQL注入风险,虽然使用了prepare方法,但直接把变量拼到SQL语句中,没有用到参数绑定的安全特性,建议修改为:
$query1 = "SELECT Front_Text FROM `e-flash-card-schema`.`card_text` WHERE Username = ? AND Card_Number = ?"; $statement1 = $db->prepare($query1); $statement1->execute([$user, $card_number]);
内容的提问来源于stack exchange,提问作者Udo-N
相关产品推荐
相关产品推荐

