目录
简易架构图
web服务会通过弹性扩缩或者手动拉起机制创建新的集群服务,这样nginx的负载均衡策略需要根据自动修改,以至可以把流量负载到新的服务。 动态更新已经有很多开源方案,大多数都是基于生成配置文件后进行reload,但是reload这个操作在业务流量不大的时候是可以进行的,但是在一些高流量的站点,随便进行reload会对整个集群的性能造成抖动,这个抖动问题,要追究起来可大可小,不过总有人希望有个完美的方案来避免这个抖动,微博的nginx-upsync-module模块就是为解决这个问题而生的。
下面直接开始搞
ip | 操作系统 | 备注 |
---|---|---|
192.168.12.77 | centos7 | web服务 |
192.168.12.82 | centos7 | consul |
192.168.12.112 | centos7 | nginx |
cd /usr/local
wget 'https://releases.hashicorp.com/consul/0.7.5/consul_0.7.5_linux_amd64.zip'
unzip consul_0.7.5_linux_amd64.zip
然后启动consul
./consul agent -dev -ui -node=consul-dev -client=192.168.12.82
可以看到consul的日志输出,暂时不要关闭这个。
访问下 http://192.168.12.82:8500 即可看到consul控制台,如果无法访问请注意以下几点
防火墙是否关闭,或者开启8500端口(测试建议暂时关闭防火墙)
centos 7开启端口命令 /sbin/iptables -I INPUT -p tcp --dport 8500 -j ACCEPT
启动参数-client=ip,是否填写本机的ip
这里使用 springboot 2.0.1.RELEASE
启动类代码如下
@SpringBootApplication
@RestController
public class ProvideServer1App {
public static void main(String[] args) {
SpringApplication.run(ProvideServer1App.class, args);
}
@Value("${server.port}")
private String port;
@GetMapping("/test")
public Object test() {
return "I'm port is " + port;
}
}
web服务请各位自行配置
下载 nginx-upsync-module 模块
cd /usr/local
#安装git环境
yum install git
git clone https://github.com/weibocom/nginx-upsync-module.git
安装nginx编译环境
yum -y install gcc pcre-devel zlib-devel openssl openssl-devel
nginx下载地址 https://nginx.org/download/
wget 'https://nginx.org/download/nginx-1.9.9.tar.gz'
tar -zxvf nginx-1.9.9.tar.gz
cd nginx-1.9.9
#配置
./configure --prefix=/usr/local/nginx --add-module=/usr/local/nginx-upsync-module
#编译安装
make & make install
#启动
/usr/local/nginx/sbin/nginx
验证下是否启动成功
访问 http://192.168.12.112
环境都准备好了,接下来配置动态路由
修改 /usr/local/nginx/conf/nginx.conf
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
sendfile on;
keepalive_timeout 65;
upstream pic_backend {
#假数据
server 127.0.0.1:11111;
# upsync模块会去consul拉取最新的upstream信息并存到本地的文件中
upsync 192.168.12.82:8500/v1/kv/upstreams/pic_backend upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;
upsync_dump_path /usr/local/nginx/conf/servers/servers_pic_backend.conf;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://pic_backend/;
root html;
index index.html index.htm;
}
}
}
重新启动nginx
mkdir /usr/local/nginx/conf/servers
#创建从consul拉去的配置信息存储文件
touch /usr/local/nginx/conf/servers/servers_pic_backend.conf
#停止服务
/usr/local/nginx/sbin/nginx -s stop
#启动并加载指定配置文件
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
此时查看consul服务器的日志可以看到
2019/12/15 16:33:36 [DEBUG] http: Request GET /v1/kv/upstreams/pic_backend?recurse&index=0 (65.221µs) from=192.168.12.112:45448
2019/12/15 16:33:37 [DEBUG] http: Request GET /v1/kv/upstreams/pic_backend?recurse&index=0 (67.996µs) from=192.168.12.112:45450
2019/12/15 16:33:38 [DEBUG] http: Request GET /v1/kv/upstreams/pic_backend?recurse&index=0 (66.712µs) from=192.168.12.112:45452
这就配置成功了
先访问没有配置路由之前的nginx服务器
添加刚才启动的web服务1
#在任意机器执行,注意ip
#规则
#curl -X PUT http://$consul_ip:$port/v1/kv/upstreams/$upstream_name/$backend_ip:$backend_port
curl -X PUT -d '{"weight":10, "max_fails":2, "fail_timeout":10, "down":0}' http://192.168.12.82:8500/v1/kv/upstreams/pic_backend/192.168.12.77:8700
再次访问
搞到里就是配置成功了。可以尝试创建多个web服务测试,另外,nginx集群的配置把每台nginx都这样配置一下即可。
#删除服务命令
curl -X DELETE -d ' http://192.168.12.82:8500/v1/kv/upstreams/pic_backend/192.168.12.77:8700
更多操作的命令,可以查看githup地址nginx-upsync-module
可以从nginx服务器上查看下从consul拉去的配置信息
cat /usr/local/nginx/conf/servers/servers_pic_backend.conf
可以看到
server 192.168.12.77:8700 weight=10 max_fails=2 fail_timeout=10s;
基本使用方式就是这么多了,另外再说明下(踩坑发现),nginx会使用从consul拉去的最后一次配置信息,即使你把consul上边的配置删完了,因为它的机制是:如果从consul拉取配置失败,或者取到了空,就使用最后一次拉取成功的配置
整理不易,如果哪里有问题或者配置错误,可留言或者通过QQ:1603565290与我取得联系