Nginx+Upsync+Consul实现动态负载均衡
Consul由Go语言开发,部署起来非常容易,只需要极少的可执行程序和配置文件,具有绿色、轻量级的特点。Consul是分布式的、高可用的、 可横向扩展的用于实现分布式系统的服务发现与配置。 nginx-upsync-module是新浪微博开源插件,在此作用为:拉取 consul 的后端 KV的列表,并更新 Nginx 的路由信息。
1、下载需要的软件包
虚拟机采用:Centos7
consul:
wget https://releases.hashicorp.com/consul/0.7.5/consul_0.7.5_linux_amd64.zip
nginx(注意:nginx版本一定要>=1.9.10版本:
wget http://nginx.org/download/nginx-1.9.10.tar.gz
nginx-upsync-module:
wget https://github.com/weibocom/nginx-upsync-module/archive/master.zip
2、安装Consul
进入安装包下载保存目录(ps:如果下载好后没有切换目录,就已经在下载目录,可忽略此操作)
cd /data/nginx #注意调整为自己的软件下载保存目录
新建consul文件夹
mkdir /usr/local/consul #新建consul安装目录
解压consul压缩包,进行安装
yum install -y zip unzip #如已安装可忽略
unzip consul_0.7.5_linux_amd64.zip -d /usr/local/consul #解压安装到指定目录
验证是否安装成功
cd /usr/local/consul #进入consul安装目录
./consul version #查看consul版本
启动consul,并且输出日志文件(注意ip为当前服务器ip)
nohup /usr/local/consul/consul agent -server -dev -ui -node=consul-dev -client=10.118.241.165 >> /usr/local/consul/consul.log 2>&1 &
测试是否启动成功,首先要打开8500端口号
firewall-cmd --zone=public --add-port=8500/tcp --permanent
firewall-cmd --reload
浏览器访问10.118.241.165:8500,出现下面页面代表成功
3、安装nginx配置nginx-upsync-module
(1)、进入压缩包存放目录:
cd /data/nginx
(2)、解压nginx,解压upsync压缩包
tar -zxvf nginx-1.9.10.tar.gz #解压nginx
unzip master.zip # 解压upsync压缩包
注意nginx和nginx-upsync-module一定要解压到同一个目录中
(3)、准备nginx前置环境目录
groupadd nginx
useradd -g nginx -s /sbin/nologin nginx
mkdir -p /var/tmp/nginx/client
mkdir -p /usr/local/nginx
(4)、编译、安装Nginx
cd /data/nginx/nginx-1.9.10 #进入nginx解压后的目录
# 编译
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_realip_module --http-client-body-temp-path=/var/tmp/nginx/client/ --http-proxy-temp-path=/var/tmp/nginx/proxy/ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi --with-pcre --add-module=../nginx-upsync-module-master
#安装
make && make install
编译的是报错
./configure: error: SSL modules require the OpenSSL library.
解决办法
yum -y install openssl openssl-devel
(4)创建upsync拉取consul配置持久化目录
mkdir -p /usr/local/nginx/conf/servers/
(5)、配置nginx.conf文件:
vim /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
# 动态负载均衡配置
upstream amazecode{
#用于心跳检测
server 127.0.0.1:11111;
#去consul的KV拉取上游服务器信息
upsync 10.118.241.165:8500/v1/kv/upstreams/amaze
upsync_timeout=6m upsync_interval=500ms
upsync_type=consul strong_dependency=off;
#存放拉取到的上游服务器信息,/usr/local/nginx/conf/servers 这个目录需要创建
upsync_dump_path /usr/local/nginx/conf/servers/servers_test.conf;
}
server {
listen 80;
server_name localhost;
location / {
#反向代理配置
proxy_pass http://amazecode;
index index.html index.htm;
}
}
}
(6)、启动nginx
cd /usr/local/nginx/sbin/
./nginx #启动nginx
./nginx -s reload #重新加载配置文件
ps -ef | grep nginx #检查是否启动成功
4、测试动态负载均衡
整体测试步骤:
1)、先通过接口获取者页面向consul需要负载均衡的服务(ip和端口号),添加8080
2)、启动8080服务,然后访问nginx服务器,其他服务器通过浏览器以ip地址访问10.118.241.165(nginx安装服务器),此时不断刷新只是出现8080,如图
3)、在通过接口向consul中添加,一个8081的服务,然后直接浏览器访问10.118.241.165(nginx安装服务器),刷新几次出现8081端口代表动态负载均衡安装成功
consul添加服务接口
注意:接口中的amaze,一定要和nginx中配置的目录一致,否则负载均衡代理不了
#1.使用linux命令方式发送put请求
curl -H "Content-Type: application/json" -X PUT -d "{\"weight\":1, \"max_fails\":2, \"fail_timeout\":10, \"down\":0}" "http://10.118.241.165:8500/v1/kv/upstreams/amaze/192.168.101.1:8080"
curl -H "Content-Type: application/json" -X PUT -d "{\"weight\":1, \"max_fails\":2, \"fail_timeout\":10, \"down\":0}" "http://10.118.241.165:8500/v1/kv/upstreams/amaze/192.168.101.1:8081"
#2.使用postmen 发送put请求
http://10.118.241.165:8500/v1/kv/upstreams/amaze/192.168.101.1:8080
http://10.118.241.165:8500/v1/kv/upstreams/amaze/192.168.101.1:8081
# 参数
{"weight":1, "max_fails":2, "fail_timeout":10, "down":0}
192.168.101.1:端口号 #表示需要新增的服务
至此,整体环境搭建完成。