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

Docker Nginx反向代理无法解析主机名问题排查求助

解决Nginx反向代理Docker容器时的DNS解析报错问题

问题背景

用Docker Compose搭建带Nginx反向代理的NextCloud环境,所有服务均处于nextcloud-aio网络中:

  • Nginx容器可正常ping通nextcloud-aio-mastercontainer主机名
  • 访问Web服务时,Nginx日志报错:no resolver defined to resolve nextcloud-aio-mastercontainer
  • 仅修改了proxy_pass目标,从127.0.0.1改为nextcloud-aio-mastercontainer,当前配置:
    proxy_pass http://nextcloud-aio-mastercontainer:11000$request_uri;
    
  • 容器内/etc/resolv.conf配置正常:
    nameserver 127.0.0.11
    options ndots:0
    

核心原因

Nginx对proxy_pass的解析逻辑分两种场景:

  • 若proxy_pass为固定字符串(不含变量),Nginx会在启动时一次性解析主机名并缓存IP
  • 若proxy_pass包含变量(比如这里的$request_uri),Nginx会在每次请求时动态解析,但此时必须显式指定resolver,不会自动读取系统的resolv.conf

ping能通是因为ping直接使用系统DNS解析(调用resolv.conf里的127.0.0.11),但Nginx的动态解析逻辑不共享这个配置。

可行解决思路

方案1:添加resolver配置

在Nginx的server或location块中添加Docker内置DNS的resolver:

resolver 127.0.0.11 valid=30s;
proxy_pass http://nextcloud-aio-mastercontainer:11000$request_uri;
  • 127.0.0.11是Docker默认内置DNS服务器,所有容器均可访问
  • valid=30s设置DNS缓存时长,避免频繁解析

方案2:调整proxy_pass写法(移除$request_uri)

如果不需要手动拼接$request_uri,可直接写成:

proxy_pass http://nextcloud-aio-mastercontainer:11000;

此时Nginx会在启动时解析nextcloud-aio-mastercontainer的IP并缓存,无需额外配置resolver,同时会自动将请求URI传递给后端服务。

方案3:验证后端容器端口监听状态

虽然ping通了主机名,仍需确认nextcloud-aio-mastercontainer确实在监听11000端口:

  • 进入NextCloud容器执行:ss -tulpn | grep 11000
  • 或在Nginx容器内执行:telnet nextcloud-aio-mastercontainer 11000测试端口连通性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 18:22:12