You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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地址。步骤如下:

  1. 进入Nginx容器,执行cat /etc/resolv.conf,找到类似nameserver 10.0.0.2的行,这个就是VPC的内置DNS地址。
  2. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:24:40