背景

当时该模块服务为物理机,需要迁移到内部云上,该业务是在nginx上通过proxy_pass代理了该模块接口服务,类似如下

1
2
3
location /authxxxx/ {
proxy_pass http://192.168.44.56:18080/;
}

迁移挺简单的,将地址改为私云新地址即可,后面nginx -s reload就好了,但甲方baba说不确定后续还会不会迁移,因为他们也是第一次上私云,循序渐进安排项目迁移。。。。一听到可能多次,就裂开,因为这种变更得去客户现场操作,所以得想个方式动态变更,剧本已经想好:

  • 第一次迁移:物理机->云
    • 云上环境部署
    • 前端nginx切流
  • 第n次迁移:云->云
    • 利用私云上快照快速克隆创建
    • 利用reslover+域名代理,后面切换dns解析即可

以后对于甲方集群机器挪动得变更,博主这里要做得事情就会轻松很多,因为私云上得甲方操作,只有服务器上得操作才需要我

nginx reslover

reslover指令语法

1
2
3
Syntax:resolver address ... [valid=time] [ipv6=onoff];
Default:—
Context:http, server, location

The address can be specified as a domain name or IP address, with an optional port (1.3.1, 1.2.2). If port is not specified, the port 53 is used. Name servers are queried in a round-robin fashion

该指令用于指定nginx得dns服务器:

  • address:可以用ip或域名(这个域名则用本地配置得dns进行解析获得最终dns服务器地址)。
  • valid:配置nginx缓存dns记录过期时间,不配置则用源记录得ttl,否则覆盖源纪录ttl
  • ipv6:配置解析域名ipv6地址,nginx默认会从dns服务器解析域名ipv4和ipv6,如果不需要ipv6则off关闭

resolver_timeout指令语法

1
2
3
4
Syntax:resolver_timeout time;
Default:
resolver_timeout 30s;
Context:http, server, location

该指令是配置dns解析超时时间

reslover配置样例

此处需要提前准备内网dns解析服务,此处博主也不需要建,直接申请使用私云内网域解析域名服务即可。读者则可以使用dnsmasq或bind9搭建dns服务,可以参考:https://www.xadocker.cn/archives/1539.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server {
# 略
resolver 10.xxx.xx.x 600s ipv6=off;
resolver_timeout 5s;
location /authxxxx/ {
proxy_pass http://sva-xxxproject-clusterxx.aaabbb.com:18080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
proxy_buffer_size 1600k;
proxy_buffers 4 3200k;
}
}