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

Nginx容器无法通过名称解析Redis容器的问题求助

解决Nginx Lua连接Redis容器的解析与连接问题

咱们一步一步来解决你遇到的这两个问题——先是域名解析失败,然后是连接拒绝:

1. 先搞定域名解析错误:别用带网络后缀的服务名

你第一个错误no resolver defined to resolve "local_redis.lua_project_default",其实是因为多此一举加了网络后缀。在Docker Compose创建的默认网络里,直接用服务名local_redis就能访问Redis容器,不需要加上lua_project_default这个网络名称后缀。

赶紧把my_redis.lua里的连接代码改成这样:

local ok, err = red:connect("local_redis", 6379)

2. 正确配置Nginx的Resolver(如果需要用域名解析)

如果你之后还要用类似的域名连接其他容器,OpenResty的Lua模块需要Nginx配置正确的DNS解析器。Docker内部自带了一个DNS服务,地址是127.0.0.11,专门用来处理容器间的域名解析。你需要在Nginx的http块里加上这行配置:

http {
  resolver 127.0.0.11 valid=30s; # 缓存解析结果30秒,减少解析次数
  server {
    # 你的server配置保持不变
  }
}

3. 排查连接拒绝的问题

你说加了resolver后出现connection refused,但telnet能通,这大概率是配置细节出了问题,咱们逐一排查:

  • 再确认Lua脚本里的主机名:一定要用local_redis,别再带那个网络后缀了,Docker Compose的服务名在同一网络里就是有效的主机名。
  • 检查Redis的绑定设置:官方redis:latest镜像默认是允许所有IP访问的(配置里是bind 0.0.0.0),但如果你自己改了redis.conf,要确保没把绑定地址设成127.0.0.1——那样的话只有Redis容器自己能访问,其他容器连不上。
  • 再验证容器间的连通性:进入Nginx容器,执行ping local_redis和telnet local_redis 6379,确认能正常连通。如果这两步都没问题,那问题肯定在Lua代码的配置上。
  • 看看Redis有没有正常启动:跑一下docker logs local_redis,看看日志里有没有报错,确认Redis服务已经完全启动了。

给你一个完整的可运行示例

修改后的my_redis.lua(加了测试代码)

local redis = require "resty.redis"
local red = redis:new()

-- 设置连接超时为1秒
red:set_timeout(1000)

-- 用Docker服务名连接Redis
local ok, err = red:connect("local_redis", 6379)
if not ok then
  ngx.say("failed to connect: ", err)
  return
end

-- 测试:设置一个键值对
ok, err = red:set("lua_test", "hello from nginx lua!")
if not ok then
  ngx.say("failed to set key: ", err)
  return
end

-- 读取刚才设置的键
local res, err = red:get("lua_test")
if not res then
  ngx.say("failed to get key: ", err)
  return
end

ngx.say("Redis response: ", res)

-- 把连接放回连接池,避免频繁创建销毁连接(优化性能)
local ok, err = red:set_keepalive(10000, 100)
if not ok then
  ngx.say("failed to set keepalive: ", err)
  return
end

修改后的nginx.conf

events {}
http {
  resolver 127.0.0.11 valid=30s;
  server {
    server_name lua;
    listen 8053;
    location /redis-request {
      content_by_lua_file /nginx/html/my_redis.lua;
    }
  }
}

这样调整之后,再访问http://你的主机IP:8053/redis-request,应该就能正常拿到Redis的响应了。

内容的提问来源于stack exchange,提问作者Navid_pdp11

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 15:32:28