使用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的弱依赖。