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

ECS部署Nginx代理web、api容器无需同步重部署的方案问询

根本原因

Nginx 默认在启动时会一次性解析配置中所有域名对应的IP并永久缓存,直到进程重启才会更新,所以容器重建IP变更后,Nginx依然会把流量转发到旧IP上。

解决方案

方案1:配置Nginx动态DNS解析(最简便,适合开源版Nginx)

无需额外工具,仅修改Nginx配置即可实现自动刷新IP:

  • 第一步:确保3个容器都加入同一个Docker自定义网络(Docker默认bridge网络不支持容器名DNS解析,必须手动创建自定义网络)
  • 第二步:修改Nginx配置,调整为如下格式:
http {
  # 配置Docker内置DNS服务器,解析结果缓存5秒
  resolver 127.0.0.11 valid=5s;
  
  server {
    listen 80;
    
    # web路由配置
    location /web/ {
      # 用变量存储上游地址,触发Nginx动态解析逻辑
      set $web_upstream http://web-container:3000;
      proxy_pass $web_upstream;
      # 其余原有proxy配置保持不变即可
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
    }
    
    # api路由配置
    location /api/ {
      set $api_upstream http://api-container:3001;
      proxy_pass $api_upstream;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
    }
  }
}

如果使用商业版Nginx Plus,可直接在原有upstream块中配置resolver 127.0.0.11 valid=5s;并给server条目加resolve参数,无需替换为变量写法。

  • 第三步:重启一次Nginx容器加载新配置,后续更新web/api容器无需再操作Nginx。

方案2:使用docker-gen自动重载Nginx配置(适合多上游管理场景)

如果需要保留upstream块的配置方式,可以借助docker-gen工具实现配置自动更新:

  • docker-gen可以监听Docker容器的启动、停止事件,当web/api容器重建时,自动根据预设模板生成新的Nginx配置,随后向Nginx进程发送nginx -s reload信号平滑重载配置,无需重建Nginx容器。
  • 重载过程不会中断现有请求,对业务无感知。
注意事项
  • 方案1中的valid=5s可以根据业务容忍的IP更新延迟调整,数值越小IP更新越快,同时DNS解析开销也会略高。
  • 所有容器必须加入同一Docker自定义网络,Docker会自动维护容器名到IP的DNS映射,无需手动配置hosts。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:39:04