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; } } }
关键细节说明
- Docker内置DNS地址:
127.0.0.11是Docker默认的内部DNS服务器,所有容器都能通过这个地址解析同桥接网络内的容器名,确保Nginx能正确找到t1.web这类容器服务。 - 解析缓存时长:
valid=30s表示缓存DNS解析结果30秒,减少重复DNS查询的开销,同时保证容器IP变化时能及时更新解析结果。 - 正则捕获验证:你的
server_name正则~^(?<subdomain>.+)\.app\.dev能正确捕获t1.app.dev中的t1子域名,无需调整。
额外验证点
- 确认Nginx容器与所有租户容器处于同一个Docker桥接网络中(你已经通过
curl验证过互通,此步骤可忽略)。 - 若后续添加HTTPS配置,需确保证书覆盖所有子域名(如
*.app.dev),并在server块中配置HTTPS监听。
内容的提问来源于stack exchange,提问作者Evren Bingöl
相关产品推荐
相关产品推荐

