Nginx+Consul+UpSync动态配置负载均衡(一)

本文详细介绍了如何使用Nginx和Consul实现动态负载均衡,包括Nginx和Consul的安装配置,通过Consul动态更新Nginx的负载均衡配置,以及如何验证动态配置的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境说明

主机名系统版本ip地址nginx versionconsul versionupsync version备注
mastercentos-release-7-7.1908.0.el7.centos.x86_64192.168.137.252nginx-1.17.5consul_1.6.1_linux_amd64nginx-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.confindex3-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界面添加新的服务列表

  1. 我们在浏览器中打开http://192.168.137.252:8500,并点击key/value选项卡
    然后点击下面upstream选项,随后再点击test选项,进入配置页面。
    在这里插入图片描述
  2. 点击右上角的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可以暂时停用该服务项。
    在这里插入图片描述
  3. 点击save我们可以看到页面上多了一条数据
    在这里插入图片描述
  4. 再次查看持久化文件
[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即可

参考文档:https://github.com/weibocom/nginx-upsync-module

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值