nginx动态路由

nginx动态路由

目录

  1. 使用场景
  2. 服务器信息
  3. 安装consul
  4. 安装web服务
  5. 安装nginx
  6. 测试

使用场景

简易架构图nginx动态路由_第1张图片
web服务会通过弹性扩缩或者手动拉起机制创建新的集群服务,这样nginx的负载均衡策略需要根据自动修改,以至可以把流量负载到新的服务。 动态更新已经有很多开源方案,大多数都是基于生成配置文件后进行reload,但是reload这个操作在业务流量不大的时候是可以进行的,但是在一些高流量的站点,随便进行reload会对整个集群的性能造成抖动,这个抖动问题,要追究起来可大可小,不过总有人希望有个完美的方案来避免这个抖动,微博的nginx-upsync-module模块就是为解决这个问题而生的。
下面直接开始搞

测试服务器

ip 操作系统 备注
192.168.12.77 centos7 web服务
192.168.12.82 centos7 consul
192.168.12.112 centos7 nginx

安装consul

cd /usr/local
wget 'https://releases.hashicorp.com/consul/0.7.5/consul_0.7.5_linux_amd64.zip'
unzip consul_0.7.5_linux_amd64.zip

然后启动consul

./consul agent -dev -ui -node=consul-dev -client=192.168.12.82

可以看到consul的日志输出,暂时不要关闭这个。
访问下 http://192.168.12.82:8500 即可看到consul控制台,如果无法访问请注意以下几点

  1. 防火墙是否关闭,或者开启8500端口(测试建议暂时关闭防火墙)
    centos 7开启端口命令 /sbin/iptables -I INPUT -p tcp --dport 8500 -j ACCEPT

  2. 启动参数-client=ip,是否填写本机的ip

  3. 防火墙问题在下面的配置就不说了,配置用到的端口都要打开nginx动态路由_第2张图片

安装 web服务

这里使用 springboot 2.0.1.RELEASE
启动类代码如下

@SpringBootApplication
@RestController
public class ProvideServer1App {
     

    public static void main(String[] args) {
     
        SpringApplication.run(ProvideServer1App.class, args);
    }

    @Value("${server.port}")
    private String port;

    @GetMapping("/test")
    public Object test() {
     
        return "I'm port is " + port;
    }
}

web服务请各位自行配置

启动 web服务1 端口8700
nginx动态路由_第3张图片

安装nginx

下载 nginx-upsync-module 模块

cd /usr/local
#安装git环境 
yum install git
git clone https://github.com/weibocom/nginx-upsync-module.git

安装nginx编译环境

yum -y install gcc pcre-devel zlib-devel openssl openssl-devel

nginx下载地址 https://nginx.org/download/

wget 'https://nginx.org/download/nginx-1.9.9.tar.gz'
tar -zxvf nginx-1.9.9.tar.gz
cd nginx-1.9.9
#配置
./configure --prefix=/usr/local/nginx  --add-module=/usr/local/nginx-upsync-module
#编译安装
make & make install
#启动
/usr/local/nginx/sbin/nginx

验证下是否启动成功
访问 http://192.168.12.112
nginx动态路由_第4张图片
环境都准备好了,接下来配置动态路由
修改 /usr/local/nginx/conf/nginx.conf


#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
     
    worker_connections  1024;
}


http {
     
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
  
    sendfile        on;
   keepalive_timeout  65;
   upstream pic_backend {
     
        #假数据
        server 127.0.0.1:11111;
        # upsync模块会去consul拉取最新的upstream信息并存到本地的文件中
        upsync 192.168.12.82:8500/v1/kv/upstreams/pic_backend upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;
        upsync_dump_path /usr/local/nginx/conf/servers/servers_pic_backend.conf;
    }
    server {
     
        listen       80;
        server_name  localhost;
        location / {
     
            proxy_pass http://pic_backend/;
            root   html;
            index  index.html index.htm;
        }
    }
}

重新启动nginx

mkdir /usr/local/nginx/conf/servers
#创建从consul拉去的配置信息存储文件
touch /usr/local/nginx/conf/servers/servers_pic_backend.conf
#停止服务
/usr/local/nginx/sbin/nginx -s stop
#启动并加载指定配置文件
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

此时查看consul服务器的日志可以看到

2019/12/15 16:33:36 [DEBUG] http: Request GET /v1/kv/upstreams/pic_backend?recurse&index=0 (65.221µs) from=192.168.12.112:45448
2019/12/15 16:33:37 [DEBUG] http: Request GET /v1/kv/upstreams/pic_backend?recurse&index=0 (67.996µs) from=192.168.12.112:45450
2019/12/15 16:33:38 [DEBUG] http: Request GET /v1/kv/upstreams/pic_backend?recurse&index=0 (66.712µs) from=192.168.12.112:45452
   

这就配置成功了

测试

先访问没有配置路由之前的nginx服务器
nginx动态路由_第5张图片
添加刚才启动的web服务1

#在任意机器执行,注意ip
#规则
#curl -X PUT   http://$consul_ip:$port/v1/kv/upstreams/$upstream_name/$backend_ip:$backend_port
curl -X PUT -d '{"weight":10, "max_fails":2, "fail_timeout":10, "down":0}' http://192.168.12.82:8500/v1/kv/upstreams/pic_backend/192.168.12.77:8700

再次访问
nginx动态路由_第6张图片
搞到里就是配置成功了。可以尝试创建多个web服务测试,另外,nginx集群的配置把每台nginx都这样配置一下即可。

#删除服务命令
curl -X DELETE -d ' http://192.168.12.82:8500/v1/kv/upstreams/pic_backend/192.168.12.77:8700

更多操作的命令,可以查看githup地址nginx-upsync-module
可以从nginx服务器上查看下从consul拉去的配置信息

cat /usr/local/nginx/conf/servers/servers_pic_backend.conf

可以看到

server 192.168.12.77:8700 weight=10 max_fails=2 fail_timeout=10s;

查看consul的控制台
nginx动态路由_第7张图片

基本使用方式就是这么多了,另外再说明下(踩坑发现),nginx会使用从consul拉去的最后一次配置信息,即使你把consul上边的配置删完了,因为它的机制是:如果从consul拉取配置失败,或者取到了空,就使用最后一次拉取成功的配置

整理不易,如果哪里有问题或者配置错误,可留言或者通过QQ:1603565290与我取得联系

你可能感兴趣的:(自动化运维,负载均衡,运维,服务器,nginx,java)