EC2 Ubuntu22.04下PHP通过IAM角色上传文件到S3超时问题解决
问题排查与修复方案
1. 修复PHP代码变量名错误
你的代码里实例化的S3客户端是$s3Client,但调用上传方法时用的是$s3->putObject(),变量名不匹配会直接触发PHP致命错误,这大概率是页面超时的核心原因。修改代码如下:
// 原错误代码 $result = $s3->putObject([ 'Bucket' => $bucket, 'Key' => $file_name, 'SourceFile' => $file_temp_src ]); // 修改后 $result = $s3Client->putObject([ 'Bucket' => $bucket, 'Key' => $file_name, 'SourceFile' => $file_temp_src ]);
2. 开启PHP错误日志定位问题
默认PHP可能不显示错误,导致页面一直加载无反馈。在PHP代码开头添加以下代码开启错误显示:
error_reporting(E_ALL); ini_set('display_errors', 1);
同时查看Ubuntu服务器上的PHP错误日志(通常路径为/var/log/apache2/error.log或/var/log/php8.x-fpm.log,根据你的Web服务器和PHP版本调整),获取具体错误信息。
3. 验证EC2实例的IAM角色有效性
登录EC2实例,执行以下命令检查是否能正常获取IAM角色的临时凭证:
# 查看当前实例绑定的IAM角色名称 curl http://169.254.169.254/latest/meta-data/iam/security-credentials/
如果返回你的IAM角色名称,继续执行:
# 替换为上一步得到的角色名称,获取凭证详情 curl http://169.254.169.254/latest/meta-data/iam/security-credentials/你的角色名称
如果返回包含AccessKeyId、SecretAccessKey、Token的JSON数据,说明角色凭证获取正常;如果无返回,检查IAM角色是否正确附加到EC2实例。
4. 验证EC2与S3的网络连通性
在EC2实例上测试能否访问目标S3桶的端点:
curl -v https://bucket-name.s3.eu-central-1.amazonaws.com
如果连接超时,检查以下配置:
- EC2安全组:确保出站规则允许HTTPS(443端口)访问互联网。
- VPC网络ACL:确保出站规则允许443端口,入站规则允许对应的响应流量。
- 若使用VPC端点:确认S3 VPC端点已正确配置,且IAM角色允许通过端点访问S3。
5. 调整PHP上传相关配置
检查php.ini中的以下参数,确保上传文件大小和执行时间足够:
upload_max_filesize = 10M ; 根据你的文件实际大小调整 post_max_size = 10M max_execution_time = 300 ; 延长执行时间至5分钟,单位秒 max_input_time = 300
修改后重启Web服务器(比如systemctl restart apache2或systemctl restart php8.1-fpm)。
6. 确保AWS SDK自动获取实例角色凭证
你当前的客户端实例化代码是正确的,但可以显式指定凭证提供者,确保SDK能自动获取EC2角色凭证:
$s3Client = new S3Client([ 'region' => 'eu-central-1', 'version' => '2006-03-01', 'credentials' => new \Aws\Credentials\InstanceProfileCredentials() ]);
7. 检查临时文件目录权限
确保Web服务器用户(通常是www-data)有读写PHP临时文件目录的权限。先查看临时目录路径:
echo sys_get_temp_dir();
然后执行命令修改权限:
chown -R www-data:www-data /path/to/temp/dir chmod -R 755 /path/to/temp/dir
内容的提问来源于stack exchange,提问作者Mega
相关产品推荐
相关产品推荐

