ECS上Laravel容器无法连接Redis:协议错误排查求助
AWS ECS Fargate环境下Laravel连接Redis触发协议错误排查
问题详情
在AWS ECS Fargate环境中部署了运行Laravel应用的php-fpm容器和Redis容器,执行php artisan migrate时触发Redis协议错误:
protocol error, got 'H' as reply type byte
已完成以下排查:
- 通过
ping、nc命令确认php-fpm容器与Redis容器的网络连通性正常 - 更换为简单Redis密码后问题仍复现
怀疑故障根源为AWS网络配置或服务关联问题,现提供相关配置文件请求协助排查。
相关配置文件
CloudFormation模板片段
# 此处粘贴CloudFormation模板相关内容
Laravel Redis配置文件(config/database.php)
return [ // ... 其他配置 'redis' => [ 'client' => env('REDIS_CLIENT', 'phpredis'), 'options' => [ 'cluster' => env('REDIS_CLUSTER', 'redis'), 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'), ], 'default' => [ 'url' => env('REDIS_URL'), 'host' => env('REDIS_HOST', '127.0.0.1'), 'username' => env('REDIS_USERNAME'), 'password' => env('REDIS_PASSWORD'), 'port' => env('REDIS_PORT', '6379'), 'database' => env('REDIS_DB', '0'), ], // ... 其他Redis连接配置 ], // ... ];
.env环境变量配置
APP_NAME=Laravel APP_ENV=production # ... 其他应用配置 REDIS_HOST=redis-service # ECS服务名称或Redis容器IP REDIS_PASSWORD=your_redis_password REDIS_PORT=6379 REDIS_DB=0 REDIS_CLIENT=phpredis
排查建议
- 校验Redis连接地址有效性:确认.env中
REDIS_HOST使用的ECS服务发现名称(如redis-service)配置正确,Fargate环境下需确保服务发现规则允许php-fpm容器解析到Redis实例 - 验证Redis服务状态与密码一致性:进入Redis容器执行
redis-cli ping确认服务正常,同时执行redis-cli config get requirepass验证密码是否与.env配置完全匹配 - 检查Laravel Redis客户端依赖:若
REDIS_CLIENT设置为phpredis,确认php-fpm容器已安装对应扩展;若使用predis,需排查版本与Laravel框架的兼容性 - 排查ECS网络规则:若采用awsvpc网络模式,确认两个容器处于同一VPC、子网,且安全组规则允许双向6379端口通信(即使nc连通,也要检查安全组是否存在隐性限制)
- 抓取通信包分析:在php-fpm容器中执行
tcpdump port 6379抓取与Redis的通信数据,分析发送的命令和返回内容,定位是否有异常数据导致协议解析错误
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

