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

Nginx代理多租户Docker容器:变量式proxy_pass失效求助

问题解决:Nginx proxy_pass使用变量无法路由到Docker容器

核心原因

当proxy_pass使用静态域名字符串时,Nginx会在启动阶段解析域名并缓存IP地址,因此能正常识别Docker容器的内部域名(如t1.web)。但使用变量作为proxy_pass目标时,Nginx会在请求实时阶段解析域名,此时需要显式指定DNS解析器,否则无法通过Docker内置DNS解析容器名。

解决方案

在Nginx的http块中添加Docker内置DNS的解析器配置,修改后的完整配置如下:

events {
    worker_connections  4096;
}
http {
  # 配置Docker内置DNS作为解析器,缓存解析结果30秒
  resolver 127.0.0.11 valid=30s;

  server {
    server_name             ~^(?<subdomain>.+)\.app\.dev;
    listen                  80;
    location / {
      set $domainweb        "http://$subdomain.web:8000";
      proxy_pass            $domainweb;
      proxy_set_header      Host $host;
      proxy_set_header      X-Real-IP $remote_addr;
    }
  }
}

关键细节说明

  1. Docker内置DNS地址:127.0.0.11是Docker默认的内部DNS服务器,所有容器都能通过这个地址解析同桥接网络内的容器名,确保Nginx能正确找到t1.web这类容器服务。
  2. 解析缓存时长:valid=30s表示缓存DNS解析结果30秒,减少重复DNS查询的开销,同时保证容器IP变化时能及时更新解析结果。
  3. 正则捕获验证:你的server_name正则~^(?<subdomain>.+)\.app\.dev能正确捕获t1.app.dev中的t1子域名,无需调整。

额外验证点

  • 确认Nginx容器与所有租户容器处于同一个Docker桥接网络中(你已经通过curl验证过互通,此步骤可忽略)。
  • 若后续添加HTTPS配置,需确保证书覆盖所有子域名(如*.app.dev),并在server块中配置HTTPS监听。

内容的提问来源于stack exchange,提问作者Evren Bingöl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 08:07:27