nginx+consul+半自动平滑升级 实现动态负载均衡

Posted Json2011315

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx+consul+半自动平滑升级 实现动态负载均衡相关的知识,希望对你有一定的参考价值。

1.nginx-upsync-module安装

半自动平滑升级
所谓半自动,其实就是在最后迁移的时候使用源码自带的升级命令:make upgrade 来自动完成

说明地址:
https://github.com/weibocom/nginx-upsync-module

nginx-upsync-module
Nginx C模块,可以同步Consul或其他模块的上游。它动态地修改了后端服务器的属性(weight,max_fails等),而无需重新加载NGINX。

修改配置文件并重新启动NGINX可能并不总是很方便。例如,如果您遇到大量的流量和高负载,则在那时重启NGINX并重新加载配置会进一步增加系统的负载并可能暂时降低性能。

1.1 下载并安装扩展:nginx-upsync-module

下载地址:https://github.com/weibocom/nginx-upsync-module/releases
[root@localhost ~]# wget https://github.com/weibocom/nginx-upsync-module/archive/v2.1.0.tar.gz

1.2 解压
[root@localhost ~]# tar -zxvf v2.1.0.tar.gz

1.3 进入nginx解压目录,安装

[root@localhost ~]# ls
 nginx-1.14.1     
[root@localhost ~]# cd nginx-1.14.1

#1.清空之前的编译文件
[root@localhost nginx-1.14.1]# make clean

#2.执行 nginx -V 查看之前的编译参数
[root@localhost nginx-1.14.1]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.14.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-pcre --with-http_ssl_module --with-http_gzip_static_module

#3.添加扩展执行编译
[root@localhost nginx-1.14.1]# ./configure --prefix=/usr/local/nginx --with-pcre --with-http_ssl_module --with-http_gzip_static_module --add-module=/root/nginx-upsync-module-2.1.0

#4.执行make  (不能执行 make install)
[root@localhost nginx-1.14.1]# make

#5.(打开新连接窗口操作)重命名 nginx 旧版本二进制文件,即 sbin 目录下的 nginx(期间 nginx 并不会停止服务)

》》客户端2:
[root@localhost ~]# cd /usr/local/nginx/sbin/
[root@localhost sbin]# ls
nginx
[root@localhost sbin]# mv nginx nginx.old
[root@localhost sbin]# ls
nginx.old

#6.拷贝一份新编译的二进制文件到安装目录
[root@localhost nginx-1.14.1]# cd objs/
[root@localhost objs]# ll
total 6092
drwxr-xr-x. 3 root root      17 Apr 20 16:47 addon
-rw-r--r--. 1 root root   17835 Apr 20 16:47 autoconf.err
-rw-r--r--. 1 root root   42011 Apr 20 16:47 Makefile
-rwxr-xr-x. 1 root root 6053512 Apr 20 16:48 nginx
-rw-r--r--. 1 root root    5341 Apr 20 16:48 nginx.8
-rw-r--r--. 1 root root    7181 Apr 20 16:47 ngx_auto_config.h
-rw-r--r--. 1 root root     657 Apr 20 16:47 ngx_auto_headers.h
-rw-r--r--. 1 root root    6135 Apr 20 16:47 ngx_modules.c
-rw-r--r--. 1 root root   86656 Apr 20 16:48 ngx_modules.o
drwxr-xr-x. 9 root root      91 Apr 20 16:47 src
[root@localhost objs]# cp nginx /usr/local/nginx/sbin/

 》》客户端2(拷贝的nginx):
[root@localhost sbin]# pwd
/usr/local/nginx/sbin
[root@localhost sbin]# ls
nginx  nginx.old

#7.在源码目录执行 make upgrade 开始升级
[root@localhost objs]# cd ..
[root@localhost nginx-1.14.1]# pwd
/root/nginx-1.14.1
[root@localhost nginx-1.14.1]# make upgrade
/usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
sleep 1
test -f /usr/local/nginx/logs/nginx.pid.oldbin
kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`
(查看进程的方式可以查看是否重启成功 ps -ef|grep nginx)

 #8 查看安装命令的方式,可以查看是否安装成功
 [root@localhost nginx-1.14.1]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.14.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-pcre --with-http_ssl_module --with-http_gzip_static_module --add-module=/root/nginx-upsync-module-2.1.0

总结流程:
1、需要下载对应的需要加载的第三方的扩展,或者是需要附加设置的参数 (注意:之前的配置参数要保留) --add_module=PATH 添加第三方扩展
2、执行make不要执行make install
3、重命名 nginx 旧版本二进制文件,即 sbin 目录下的 nginx(期间 nginx 并不会停止服务)
4、然后拷贝一份新编译的二进制文件到安装目录
5、在源码目录执行 make upgrade 开始升级:

=====================================================

2.安装consul

2.1下载consul

[root@localhost ~]# wget https://releases.hashicorp.com/consul/1.6.3/consul_1.6.3_linux_amd64.zip

2.2 解压

[root@localhost ~]# yum -y install unzip
[root@localhost ~]# unzip consul_1.6.3_linux_amd64.zip 
Archive:  consul_1.6.3_linux_amd64.zip
  inflating: consul                  
[root@localhost ~]# 

2.3 运行consul

#可以通过后台方式执行
[root@localhost ~]# ./consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -node=ali -bind=192.168.11.200 -ui -client=0.0.0.0 &

2.4浏览器访问consul 的ui

http://192.168.11.200:8500/ui/dc1/services


2.5 执行curl 添加 key/value (consul)
添加完配置后不需要重启nginx
ui方式查看consul的key/value :【浏览器访问]http://192.168.11.200:8500/ui/dc1/kv】

[root@localhost ~]# curl -X PUT -d '"weight":1,"max_fails":2,"fail_timeout":10' http://127.0.0.1:8500/v1/kv/upstreams/swoole_test/192.168.11.200:9502
true
[root@localhost ~]# curl -X PUT -d '"weight":1,"max_fails":2,"fail_timeout":10' http://127.0.0.1:8500/v1/kv/upstreams/swoole_test/192.168.11.200:9503
true
[root@localhost ~]# curl -X PUT -d '"weight":1,"max_fails":2,"fail_timeout":10' http://127.0.0.1:8500/v1/kv/upstreams/swoole_test/192.168.11.200:9504
true

浏览器访问:

================================================

3.创建项目目录、并配置nginx.conf

3.1配置nginx.conf

[root@localhost conf]# pwd
/usr/local/nginx/conf
[root@localhost conf]# vim nginx.conf

	#9501
    server 
        listen 9501;
        server_name server_9501;
        location / 
                root html/swoole_test/9501;
                index index.html index.htm;
        
    

    #9502
    server 
        listen 9502;
        server_name server_9502;
        location / 
                root html/swoole_test/9502;
                index index.html index.htm;
        
    


    #9503
    server 
        listen 9503;
        server_name server_9503;
        location / 
                root html/swoole_test/9503;
                index index.html index.htm;
        
    

    #9504
    server 
        listen 9504;
        server_name server_9504;
        location / 
                root html/swoole_test/9504;
                index index.html index.htm;
        
        

3.2创建目录 swoole_test、9501、9502、9503、9504

[root@localhost ~]# cd /usr/local/nginx/html/
[root@localhost html]# ls
50x.html  index.html
[root@localhost html]# mkdir -p swoole_test
[root@localhost html]# chmod -R 777 swoole_test/
[root@localhost html]# cd swoole_test/

3.3 创建9501、9502、9503、9504目录

[root@localhost swoole_test]# mkdir -p 9501
#创建index.html --》修改body--》显示9501
[root@localhost swoole_test]# cp ../index.html ./9501/
[root@localhost swoole_test]# vim 9501/index.html 


复制9501创建9502、9503、9504

[root@localhost swoole_test]# pwd
/usr/local/nginx/html/swoole_test
[root@localhost swoole_test]# cp -r 9501 9502
[root@localhost swoole_test]# cp -r 9501 9503
[root@localhost swoole_test]# cp -r 9501 9504
[root@localhost swoole_test]# ls
9501  9502  9503  9504
(修改对应的index的显示对应的端口)

保证能正常访问

=====================================

4.配置nginx.conf的负载均衡

4.1原始方式直接在配置文件配置反向代理机器

[root@localhost conf]# pwd
/usr/local/nginx/conf
[root@localhost conf]# vim nginx.conf

#原始方式配置负载均衡
    upstream swoole_server 
        #ip_hash; #ip hash
        #least_conn; #最少连接数
        #hash $key_id; #根据id

        #demo1
        server 192.168.11.200:9501 weight=1 max_fails=1 fail_timeout=10s;
        server 192.168.11.200:9502 weight=4 max_fails=1 fail_timeout=10s;
        server 192.168.11.200:9503 weight=1 max_fails=1 fail_timeout=10s;
        server 192.168.11.200:9504 weight=1 max_fails=1 fail_timeout=10s;
    

    server 
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        #匹配参数
        if ( $request_uri ~* ^\\/.*id=(\\d+).* )
                set $key_id $1;
        

        #nginx proxy_pass
        location / 
                proxy_next_upstream timeout;
                proxy_next_upstream_tries 2; #重试次数
                proxy_next_upstream_timeout 1; #重试超时时间
                proxy_send_timeout 10;
                proxy_read_timeout 10;
                proxy_connect_timeout 10;
                proxy_pass http://swoole_server;
        

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html 
            root   html;
        
    

4.2 利用consul key/value存储动态负载的配置信息,实现动态负载均衡

4.2.1 创建conf配置存放文件目录、文件
[root@localhost swoole_test]# pwd
/usr/local/nginx/html/swoole_test
[root@localhost swoole_test]# mkdir -p conf
[root@localhost swoole_test]# chmod -R 777 conf/
[root@localhost swoole_test]# ls
9501 9502 9503 9504 conf
[root@localhost swoole_test]# touch conf/swoole_test.conf
[root@localhost swoole_test]# ls conf/
swoole_test.conf

4.2.2 nginx.conf配置负载均衡

[root@localhost conf]# pwd
/usr/local/nginx/conf
[root@localhost conf]# vim nginx.conf

#使用consul key/value实现动态存储配置,实现不重启nginx实现负载均衡
upstream swoole_server 
	#初始化的时候,在此处配置一个负载的机器,主要是用来初始化生成,初始化完成生成swoole_test.conf,在把此处配置注释
	server 192.168.11.200:9501 weight=1 max_fails=1 fail_timeout=10s;
    #利用consul key/value storage:一个用来存储动态配置的系统,提供简单的http接口
    #upsync模块会去consul拉取最新的upstream信息并存到本地的文件中 
    #upsync_timeout 配置从consul拉取上游服务器的超时时间 
    #upsync_interval 配置从consul拉取上游服务器的间隔时间 
    #upsync_type 指定使用配置服务器的类型,当前是consul
    #strong_dependency 启动时是否强制依赖配置服务器,如果配置为on,则拉取失败,nginx同样会启用失败 
    #upsync_dump_path 指定从consul拉取的上游服务器后持久化到的位置,这样即使 Consul服务器出问题了,本地同样会有备份
    #consul 的key  upstreams/swoole_test(此处要和consul key对应)
    upsync 127.0.0.1:8500/v1/kv/upstreams/swoole_test upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;
    #拉取consul动态配置,生成配置文件
    upsync_dump_path /usr/local/nginx/html/swoole_test/conf/swoole_test.conf;
    #包含动态负载均衡配置文件
    include /usr/local/nginx/html/swoole_test/conf/swoole_test.conf;


server 
    listen       80;
    server_name  localhost;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    #匹配参数
    if ( $request_uri ~* ^\\/.*id=(\\d+).* )
            set $key_id $1;
    

    #nginx proxy_pass
    location / 
            proxy_next_upstream timeout;
            proxy_next_upstream_tries 2; #重试次数
            proxy_next_upstream_timeout 1; #重试超时时间
            proxy_send_timeout 10;
            proxy_read_timeout 10;
            proxy_connect_timeout 10;
            proxy_pass http://swoole_server;
    

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html 
        root   html;
    

4.2.3 重启nginx

[root@localhost conf]# /usr/local/nginx/sbin/nginx -s reload

#此时生成了配置文件
[root@localhost conf]# pwd
/usr/local/nginx/html/swoole_test/conf
[root@localhost conf]# cat swoole_test.conf 
server 192.168.11.200:9504 weight=1 max_fails=2 fail_timeout=10s;
server 192.168.11.200:9503 weight=1 max_fails=2 fail_timeout=10s;
server 192.168.11.200:9502 weight=1 max_fails=2 fail_timeout=10s;

4.2.4 注释nginx.conf的初始配置

4.2.5 再次重启

[root@localhost conf]# /usr/local/nginx/sbin/nginx -s reload

4.2.6 浏览器访问


==================================

5.consul添加9501的配置信息

[root@localhost ~]# curl -X PUT -d '"weight":4,"max_fails":2,"fail_timeout":10' http://127.0.0.1:8500/v1/kv/upstreams/swoole_test/192.168.11.200:9501
true

查看consul的key

#此时查看swoole_test.conf(不需要重启nginx)

此时就可以访问到9501的服务了

以上是关于nginx+consul+半自动平滑升级 实现动态负载均衡的主要内容,如果未能解决你的问题,请参考以下文章

Nginx在线服务状态下平滑升级或新增模块

Nginx 的平滑升级

Nginx 的平滑升级

consul + nginx实现自动扩容平台

平滑升级你的Nginx

nginx的平滑升级