AWS ECS对应docker-compose容器名的nginx fastcgi_pass配置方法
问题原因
你之前的几种配置失效原因分别如下:
fastcgi_pass php:9000:ECS默认不提供docker-compose内置的基于容器名的自动DNS解析,无法直接识别php这个主机名fastcgi_pass 127.0.0.1:9000/fastcgi_pass 0.0.0.0:9000:这两个地址仅在Nginx和PHP-FPM共享同一个网络命名空间时生效,你当前要么两个容器不在同一个任务下网络隔离,要么PHP-FPM仅监听了IPv6地址:::9000,没有绑定IPv4栈,导致IPv4回环地址无法访问fastcgi_pass unix:/var/run/php-fpm.sock:Unix套接字跨容器通信需要两个容器共享存储卷挂载套接字文件,你没有做对应卷配置,自然找不到套接字文件
正确配置方案
根据你的部署架构二选一即可:
方案1:同任务部署Nginx和PHP-FPM(推荐,性能最优、配置最简单)
这是ECS上部署Nginx+PHP架构最常用的方式,两个容器放在同一个任务定义中,天然共享网络和存储命名空间:
- 调整PHP-FPM配置:编辑PHP-FPM的
www.conf配置文件,将监听地址从默认的[::]:9000改为0.0.0.0:9000,注释掉listen.allowed_clients配置避免访问拦截 - 任务定义配置:
- 启动类型选Fargate/EC2都可以,网络模式统一用
awsvpc - 只需要给Nginx容器配置80/443的端口映射,PHP-FPM不需要配置任何端口映射,9000端口不会对外暴露,安全性更高
- 启动类型选Fargate/EC2都可以,网络模式统一用
- 修改Nginx配置中的fastcgi_pass为:
fastcgi_pass 127.0.0.1:9000; - 默认安全组会放通同ENI内的所有本地回环流量,不需要额外配置安全组规则。
方案2:Nginx和PHP-FPM分属独立ECS服务(适合需要独立扩缩容的场景)
如果两个服务需要分开部署、独立调整副本数,用ECS服务发现实现连通:
- 给PHP-FPM服务开启服务发现,创建VPC内的私有DNS命名空间(例如
ecs.internal),设置PHP-FPM服务的发现名为php,服务启动后会自动生成php.ecs.internal的私有DNS记录,指向PHP-FPM所有健康任务的私有IP - 调整PHP-FPM配置:监听地址改为
0.0.0.0:9000,配置PHP-FPM任务的安全组,放通入方向9000端口的访问,来源设置为Nginx服务对应的安全组 - 修改Nginx配置中的fastcgi_pass为:
fastcgi_pass php.ecs.internal:9000;
可选:Unix套接字配置方式(性能更高)
如果想走Unix套接字减少TCP开销,在同任务部署的基础上额外做如下配置:
- 任务定义中新增一个
emptyDir类型的共享卷,分别挂载到Nginx和PHP-FPM容器的/run/php-fpm路径 - 修改PHP-FPM的
www.conf,监听地址改为unix:/run/php-fpm/php-fpm.sock,同时配置listen.mode = 0660,将套接字文件的所属用户/组设置为两个容器运行用户共同所在的组,避免权限拒绝 - 修改Nginx配置中的fastcgi_pass为:
fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
内容的提问来源于stack exchange,提问作者whitebear
相关产品推荐
相关产品推荐

