基于upsync-module实现nginx动态配置

孟福
2023-12-01

使用nginx-upsync-module动态更新nginxupstream,github 地址为:https://github.com/weibocom/nginx-upsync-module

如果使用的nginx tcp的负载均衡可以使用 https://github.com/xiaokai-wang/nginx-stream-upsync-module


nginx-upsync-module可以通过etcd或consul进行键值存储

1.安装consule

因为是测试直接使用docker进行安装(我这里docker路由实现内网和dockeroverlay打通,建议使用br):

docker run -d --net applications --ip=192.168.100.170 consul agent -server -bootstrap-expect=1  -node=agent-one   -client 0.0.0.0 -ui

curl192.168.100.170:8500/ui

2.安装编译nginx

现在nginx-upsync-module支持1.9.x版本的nginx,我们这里使用1.9.2

cd /opt &&wget http://nginx.org/download/nginx-1.9.2.tar.gz


解压nginx

tar xfnginx-1.9.2.tar.gz

下载模块,nginx-upsync-module的健康检查依赖于阿里的nginx_upstream_check_module

git clone https://github.com/weibocom/nginx-upsync-module
git clone https://github.com/xiaokai-wang/nginx_upstream_check_module

cdnginx-1.9.2 && patch -p0 < /opt/nginx_upstream_check_module/check_1.9.2+.patch //对nginx打patch


编译安装:

./configure --add-module=/opt/nginx_upstream_check_module  --add-module=/opt/nginx-upsync-module --prefix=/opt/nginxtest/

cd/opt/nginxtest/ && useradd -M nginx && mkdir conf/conf.d && mv conf/nginx.conf conf/nginx.conf.bak && mkdir conf/servers && mkdir /var/log/nginx

conf/servers 目录用于保存从consul dump下来的server信息,保证信息的一致性

编辑主配置文件:

user  nginx;
worker_processes  5;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /opt/nginxtest/conf/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    #gzip  on;
    include /opt/nginxtest/conf/conf.d/*.conf;
}



编辑具体的vhost:

http {
    upstream test {
        least_conn; //hash $uri consistent;
        # fake server otherwise ngx_http_upstream will report error when startup
        server 127.0.0.1:11111;

        # all backend server will pull from consul when startup and will delete fake server
        upsync 192.168.100.170:8500/v1/kv/upstreams/test upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;
        upsync_dump_path /opt/nginxtest/conf/servers/servers_test.conf;
        upsync_lb least_conn; //hash_ketama;
    }

    upstream bar {
        server 127.0.0.1:8090 weight=1 fail_timeout=10 max_fails=3;
    }

    server {
        listen 8080;

        location = /proxy_test {
            proxy_pass http://test;
        }

        location = /bar {
            proxy_pass http://bar;
        }

        location = /upstream_show {
            upstream_show;
        }

    }
}

server 127.0.0.1:11111;这个配置必须要有不然校验配置文件不通过.


3.验证

打开upstream_show和check_status,默认的upstream为:server 127.0.0.1:11111

让我们向consul插入数据:curl -X PUT http://192.168.100.170:8500/v1/kv/upstreams/test/127.0.0.1:8000

启动一个简单服务器:python -m SimpleHTTPServer

查看状态可以发现已经为127.0.0.1:8000

可以多添加删除几次


在实验的过程中我发现一个问题,当把所有键值都删除,nginx会保留最后一个,而不是我们配置的127.0.0.1:11111,这和sync_module的机制有关,如果从consule获取不到值,则沿用最新一次的配置继续提供服务,实现对consul的弱依赖。


 类似资料: