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
相关产品推荐
相关产品推荐

