Nginx+Consul+UpSync动态配置负载均衡(一)
环境说明
主机名 | 系统版本 | ip地址 | nginx version | consul version | upsync version | 备注 |
---|---|---|---|---|---|---|
master | centos-release-7-7.1908.0.el7.centos.x86_64 | 192.168.137.252 | nginx-1.17.5 | consul_1.6.1_linux_amd64 | nginx-upsync-module |
一、Nginx安装
使用动态负载均衡,nginx版本必须在1.9以上
1.下载nginx源码
[root@master02 ~]# cd /opt/nginx/
[root@master02 nginx]# wget http://nginx.org/download/nginx-1.17.5.tar.gz
2.下载组件及模块
consul组件
[root@master02 nginx]# wget https://releases.hashicorp.com/consul/1.6.1/consul_1.6.1_linux_amd64.zip
nginx-upsync-module模块
[root@master02 nginx]# git clone https://github.com/weibocom/nginx-upsync-module.git
如果提示git命令未找到,则需要先安装git工具
安装git
[root@master02 nginx]# yum install git
再次clone nginx-upsync-module模块
[root@master02 nginx]# git clone https://github.com/weibocom/nginx-upsync-module.git
3.安装nginx
3.1 安装编译工具及库文件
[root@master02 nginx]# yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel unzip
3.2 安装 PCRE
安装PCRE的目的是让 Nginx 支持 rewrite 功能。
下载 PCRE 安装包
[root@master02 nginx]# wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
解压安装包
[root@master02 nginx]# tar zxvf pcre-8.35.tar.gz
编译安装
[root@master02 nginx]# cd /opt/nginx/pcre-8.35
[root@master02 pcre-8.35]# ./configure
[root@master02 pcre-8.35]# make && make install
查看版本
[root@master02 pcre-8.35]# pcre-config --version
3.3 编译安装nginx
解压安装包
[root@master02 pcre-8.35]# cd /opt/nginx/
[root@master02 nginx]# tar zxvf nginx-1.17.5.tar.gz
编译安装
[root@master02 nginx]# cd nginx-1.17.5
[root@master02 pcre-8.35]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_realip_module --with-pcre --add-module=/opt/nginx/nginx-upsync-module
[root@master02 pcre-8.35]# make && make install
参数解析在另一篇文章nginx 部分编译参数解析
版本查看
[root@master02 nginx-1.17.5]# /usr/local/nginx/sbin/nginx -v
启动nginx
[root@master02 nginx-1.17.5]# /usr/local/nginx/sbin/nginx
验证nginx是否可用
[root@master02 nginx-1.17.5]# curl localhost
二、安装启动Consul
1.解压consul
[root@master02 nginx-1.17.5]# cd /opt/nginx
[root@master02 nginx]# unzip consul_1.6.1_linux_amd64.zip
2.启动consul
[root@master02 nginx]# ./consul agent -dev -ui -node=consul-dev -client=192.168.137.252
这里是前台运行,如果要停止服务按ctrl + c
就可以。
3.浏览器访问consul ui
浏览器打开 http://192.168.137.252:8500
可以看到如下界面
4.将consul注册为service形式
参考https://www.jianshu.com/p/67103aa278b8
由于consul
的执行文件在/opt/nginx
目录下,我们把它拷贝到/usr/bin/consul
[root@node03 nginx]# cp /opt/nginx/consul /usr/bin/
start.sh内容如下:
以client形式启动,在重启后数据会丢失。
#!/bin/bash
localhost=192.168.137.252
node_name=consul_dev
/usr/bin/consul agent -dev -ui -node=$node_name -data-dir=/usr/local/consul/data/ -config-dir=/usr/local/consul/config/ -log-file=/usr/local/consul/log/consul_log-$(date +%Y-%m-%d--%H-%M) -client=$localhost
如果要以server形式启动则使用下面的start.sh,数据会持久化
#!/bin/bash
localhost=192.168.137.252
node_name=consul_dev
#/usr/bin/consul agent -dev -ui -node=$node_name -data-dir=/usr/local/consul/data/ -config-dir=/usr/local/consul/config/ -log-file=/usr/local/consul/log/consul_log-$(date +%Y-%m-%d--%H-%M) -client=127.0.0.1
/usr/bin/consul agent -server -bootstrap-expect 1 -ui -node=$node_name -config-dir=/usr/local/consul/config/ -data-dir=/usr/local/consul/data/ -log-file=/usr/local/consul/log/consul_log-$(date +%Y-%m-%d--%H-%M) -bind=$localhost -datacenter dc1 -client $localhost
三、配置nginx负载均衡
1.nginx.conf加载外部配置文件
1.1 在/usr/local/nginx/
下新建目录conf.d
[root@master02 nginx]# mkdir -p /usr/local/nginx/conf.d
1.2 在nginx.conf中加载外部配置文件
[root@master02 nginx]# vim /usr/local/nginx/conf/nginx.conf
在http模块中加入如下语句:
include /usr/local/nginx/conf.d/*.conf;
2.模拟3个服务端
该章节仅在学习时需要,如果不需要模拟服务端,请使用已有服务端。
2.1 创建html文件
将/usr/local/nginx/html/
下的index.html
拷贝3份,并将其内容改为不同的三种内容:
方便起见,我这里只是随便改了几个可以区分的地方:
其他两个html对应的是2222跟3333 。
2.2 创建配置文件
在/usr/local/nginx/conf.d/
下创建配置文件,模拟3个服务端
[root@master02 nginx]# cd /usr/local/nginx/conf.d/
[root@master02 conf.d]# vim index1-91.conf
server {
listen 91;
server_name localhost 127.0.0.1;
location / {
alias /usr/local/nginx/html/;
index index1.html;
}
}
同理创建index2-92.conf
跟index3-93.conf
,分别指向其他两个html,注意修改conf中的监听端口跟文件名。
2.3 重启nginx
[root@master02 conf.d]# /usr/local/nginx/sbin/nginx -t
[root@master02 conf.d]# /usr/local/nginx/sbin/nginx -s reload
2.4 验证3个服务端是否可用
[root@master02 conf.d]# curl localhost:91
[root@master02 conf.d]# curl localhost:92
[root@master02 conf.d]# curl localhost:93
打印出3个页面的内容,说明服务端启动成功。
3.创建负载均衡的配置文件
[root@master02 conf.d]# cd /usr/local/nginx/conf.d/
[root@master02 conf.d]# vim upstream-test-77.conf
配置文件内容如下:
upstream index {
server 127.0.0.1:80;
#从consol服务端动态获取upstream的负载均衡服务信息。
upsync 192.168.137.252:8500/v1/kv/upstreams/test upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;
#将consul相关负载均衡配置信息持久化到硬盘上
upsync_dump_path /usr/local/nginx/conf/servers/servers_test.conf;
#加载从consul持久化的配置文件,当consul服务无法访问的时候,会从该配置文件中读取最后一次的配置信息。
include /usr/local/nginx/conf/servers/servers_test.conf;
}
server {
listen 77;
server_name localhost 127.0.0.1;
location / {
proxy_pass http://index;
}
}
4.启动consul服务端
该方式为前台启动,启动之后不能关闭,需要新建一个ssh窗口执行其他的命令。
[root@master02 conf.d]# /opt/nginx/consul agent -dev -ui -node=consul-dev -client=192.168.137.252
5.重启nginx
重启nginx之前需要创建持久化配置文件目录/usr/local/nginx/conf/servers/servers_test.conf
[root@master02 ~]# mkdir /usr/local/nginx/conf/servers
[root@master02 ~]# vim /usr/local/nginx/conf/servers/servers_test.conf
vim之后保存空文件即可。
重启nginx:
[root@master02 ~]# /usr/local/nginx/sbin/nginx -t
[root@master02 ~]# /usr/local/nginx/sbin/nginx -s reload
验证服务是否可用:
[root@master02 ~]# curl localhost:77
访问如果有输出则说明服务配置成功。
现在由于还没有配置负载均衡的正式服务地址,所以会返回502.
6.添加服务端信息到consul
6.1 添加127.0.0.1:91
到负载均衡服务列表
[root@master02 ~]# curl -X PUT http://192.168.137.252:8500/v1/kv/upstreams/test/127.0.0.1:91
6.2 查看持久化配置文件
[root@master02 ~]# cat /usr/local/nginx/conf/servers/servers_test.conf
可以看到,我们刚刚添加的127.0.0.1:91
已经被持久化到配置文件中了。接下来看看nginx是否动态加载该配置。
6.3 验证动态加载配置的结果
[root@master02 ~]# curl localhost:77
可以看到我们访问localhost:77
的时候已经出现正常的页面了,这就是我们之前配置的index1.html
的内容,而在这之前,我们最后一次重启nginx的时候访问过一次localhost:77
,当时返回的结果是502的页面,由此可以证明,我们的动态加载upstream服务列表已经成功了。
6.4 使用UI界面添加新的服务列表
- 我们在浏览器中打开
http://192.168.137.252:8500
,并点击key/value
选项卡
然后点击下面upstream选项,随后再点击test选项,进入配置页面。
- 点击右上角的
Create
,开始添加新的负载均衡服务
内容如下:
key为:127.0.0.1:92
也就是我们刚刚index2.html的服务端口。
value值可以为空,默认的value值为:{"weight":2, "max_fails":2, "fail_timeout":10}
也就是我们刚刚从持久化文档中看到的那样。我这里vaule值填写的是{"weight":2, "max_fails":2, "fail_timeout":10, "down":0}
down为0(默认值)说明该服务项是开启的,如果down设置为1可以暂时停用该服务项。
- 点击save我们可以看到页面上多了一条数据
- 再次查看持久化文件
[root@master02 ~]# cat /usr/local/nginx/conf/servers/servers_test.conf
可以看到文件中多了一条我们刚刚添加的服务项,这里可以看到 down=0的参数不见了,这是因为down=0是默认参数,所以没有显示出来。
5. 再次验证我们的负载均衡配置是否生效
多执行几次curl localhost:77
命令,我们可以看到每次返回的页面是不一样的。有时候是index1.html的内容,有时候是index2.html的内容,这说明我们刚刚添加的127.0.0.1:92
已经成功了。
[root@master02 ~]# curl localhost:77
四、Consul部分语法解析
1.添加一个upstream服务。
curl -X PUT http://$consul_ip:$consul_port/v1/kv/$upstream_name/$dir/$backend_ip:$backend_port
$consul_ip
consul服务端的ip地址
$consul_port
consul服务端的端口默认为8500
$upstream_name
设置的upstream的名称,我们这里设置的就是“upstream”
$dir
文件夹的名称,我们之前的操作过程中设置成了 test
$backend_ip
负载均衡服务器的ip地址
$backend_port
负载均衡服务器的端口
2.带参数添加/修改一个upstream服务
curl -X PUT -d '{"weight":1, "max_fails":2, "fail_timeout":10}' http://$consul_ip:$consul_port/v1/kv/$upstream_name/$dir/$backend_ip:$backend_port
$backend_ip:$backend_port
组合起来为一个Key,当Key相同时,可以改变前面的参数来修改这个服务项。
weight
服务器权重占比,默认值为 1,值越大则权重越高
max_fails
当在fail_timeout
配置的时间范围内,出现max_fails
次服务连接失败,则认为该服务不可用,转为请求下一个服务
fail_timeout
同上。
3.删除一个upstream服务
curl -X DELETE http://$consul_ip:$port/v1/kv/$upstream_name/$dir/$backend_ip:$backend_port
$backend_ip:$backend_port
组合起来为一个key,删除时指定key即可