AWS多容器Beanstalk中OpenResty无法解析127.0.0.11连接Memcached超时
解决AWS Elastic Beanstalk多容器环境中OpenResty无法解析Memcached的问题
这问题我之前帮好几个在AWS EB上部署多容器的开发者排查过,核心矛盾点在于本地Docker和EB多容器环境的DNS解析逻辑不一样——本地能用127.0.0.11(Docker内置DNS)正常解析容器名,但EB里这套行不通,哪怕容器之间能ping通也没用。下面给你几个靠谱的解决方案:
方案1:去掉手动resolver,直接用容器名通信
AWS EB的多容器环境会自动维护内部服务发现,容器名称本身就是可解析的主机名,根本不需要指定resolver。你可以直接修改Nginx配置:
location /health-check { # 删掉 resolver 127.0.0.11 ipv6=off; 这一行 access_by_lua_block { -- 直接用Memcached的容器名(比如你docker-compose里的服务名) local memc = memcached:new() local ok, err = memc:connect("memcached", 11211) -- 你的业务逻辑... } }
为什么管用? EB的多容器网络会自动把容器名映射到对应容器的内网IP,相当于内置了DNS服务,不需要依赖Docker daemon的127.0.0.11。
方案2:替换resolver为EB环境的内网DNS地址
如果你的业务逻辑必须保留resolver配置,那别用127.0.0.11,换成EB环境的内网DNS地址。步骤如下:
- 进入Nginx容器,执行
cat /etc/resolv.conf,找到类似nameserver 10.0.0.2的行,这个就是VPC的内置DNS地址。 - 修改Nginx配置里的resolver:
location /health-check { resolver 10.0.0.2 ipv6=off; # 替换成你查到的实际DNS地址 access_by_lua_block { local memc = memcached:new() local ok, err = memc:connect("memcached", 11211) -- 你的业务逻辑... } }
小技巧:VPC的默认DNS地址通常是VPC网段的第二个IP(比如VPC网段是10.0.0.0/16,DNS就是10.0.0.2),你也可以直接从AWS控制台的VPC配置里查到。
方案3:用静态IP或环境变量传递Memcached地址
如果上面两种方案都不适合,你可以直接跳过DNS解析,用静态IP或者环境变量传递地址:
方式A:指定静态IP(在docker-compose.yml里配置)
services: memcached: image: memcached:latest networks: eb-internal: ipv4_address: 172.16.0.10 # 自定义内网IP openresty: image: openresty:latest networks: eb-internal: ipv4_address: 172.16.0.11 environment: - MEMCACHED_IP=172.16.0.10 networks: eb-internal: ipam: config: - subnet: 172.16.0.0/24
方式B:在Nginx里读取环境变量
env MEMCACHED_IP; location /health-check { access_by_lua_block { local memc_host = os.getenv("MEMCACHED_IP") or "memcached" local memc = memcached:new() local ok, err = memc:connect(memc_host, 11211) -- 你的业务逻辑... } }
这种方式最稳定,完全不依赖DNS解析,适合对可靠性要求高的场景。
调试小建议
如果还是有问题,先做这几步排查:
- 在Nginx容器里执行
nslookup memcached,看是否能解析出IP。如果用127.0.0.11解析失败,换成/etc/resolv.conf里的DNS服务器再试。 - 检查EB的
Dockerrun.aws.json配置,确保Memcached容器的名称和Nginx里用的完全一致。 - 查看Nginx错误日志:
tail -f /usr/local/openresty/nginx/logs/error.log,里面会有更详细的解析失败细节。
内容的提问来源于stack exchange,提问作者sandeep
相关产品推荐
相关产品推荐

