精华内容
下载资源
问答
  • nginx-upsync-module Nginx C模块,可以同步Consul或其他模块的上游。 它动态地修改了后端服务器的属性(weight,max_fails等),而无需重新加载NGINX。 修改配置文件并重新启动NGINX可能并不总是很方便。 例如,...
  • 前置知识 DNS域名解析过程 在浏览器输入域名,访问后 在浏览器缓存中查找是否有对应的ip和端口,如果有直接访问对应ip和端口 浏览器缓存中没有则在本地host文件中查找是否有对应的~~ 本地host文件中没有则去DSN...
  • # 这个固定的,不用理 # springbootserver : key的值,upsync_timeout 超时时间3秒,upsync_interval 间隔时间 ,upsync_type 类型consul,strong_dependency 增强依赖 upsync 192.168.254.134:8500/v1/kv/...

    前置知识

    DNS域名解析过程

    • 在浏览器输入域名,访问后
    • 在浏览器缓存中查找是否有对应的ip和端口,如果有直接访问对应ip和端口
    • 浏览器缓存中没有则在本地host文件中查找是否有对应的~~
    • 本地host文件中没有则去DSN服务器上查找

    外网映射

    顾名思义,就是将本地的ip地址,映射出一个公网ip,可以供所有主机(连接到互联网的计算机)访问

    • 疑问:为什么需要使用外网映射
      例如做微信支付时的第三方接口回调,微信回调你的接口必须是一个公网ip地址,不然他根本无法给你回调,导致你本地无法测试。这个时候你就需要外网映射来将自己的ip地址映射成一个公网(可供主机访问的网络)
    • 疑问:如何实现外网映射?
      通过第三方工具完成外网映射,例如natapp,ngrok,具体如何使用自行进入官网观看,
      ngrok官网.
      natapp官网.(推荐)

    nginx 核心知识

    什么是nginx

    nginx是一款轻量级的web服务器/反向代理服务器,很小并且支持非常高的并发量

    应用场景

    http服务器 :做静态服务器、图片服务器
    虚拟主机配置 :将一台服务器、拆分成多个网站部署。(可以通过配置不同的域名映射或者不同的端口来完成虚拟主机的配置)
    反向代理: 使用反向代理隐藏真实ip地址
    反向代理应用场景:
    你有3台服务器分别提供不同的服务,这个时候使用nginx来配置通过域名映射来完成不同三台服务器的访问,或者通过端口也可以。可以隐藏3台提供服务器的真实ip地址,nginx通过内部转发到不同的服务器,抓包工具也只能获取到nginx服务器的ip地址(没有基点)。
    负载均衡
    安全配置
    使用Nginx搭建API接口网关,解决网站跨域问题
    实现网站静态资源和动态资源分离
    实现防止DDOS(流量攻击)

    名词解释

    四层负载均衡

    运行在运输层,常使用TCP协议

    七层负载均衡

    运行在应用层,常使用Http协议

    负载均衡

    作用: 能够减轻单台服务器的压力,故障转移(重试机制)如果一台服务器宕机了,直接轮询到下一台服务器、健康检查,在nginx中使用upstream配置上游服务器,nginx中

    故障转移

    如果访问其中一台服务器,发现服务宕机了,或者有延迟,可以配置故障转移直接切换到另一台服务器

    		### 连接到上游服务器的时间
    		proxy_connect_timeout 1s;
    		### 发送请求超时时间
            proxy_send_timeout 1s;
    		### 接受相应超时时间
            proxy_read_timeout 1s;
    
    

    动态负载均衡

    在upstream中的配置不再是静态的,而是在注册中心上动态拉取配置,达到动态负载均衡的功能。

    Nginx + consul + upsync 完成动态负载均衡

    1、安装centos7的基础环境

    # 基础命令
     # 安装netstat命令
    yum install netstat
     # 查看所有tcp端口使用情况
     netstat -ntlp
     # 查看当前服务进程
     ps -ef  可选:[ | grep nginx]
     # 强制杀死端口对应的程序
     kill -9 pid进程号
     
    # 配置yum源
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    yum update
    yum install -y yum-utils device-mapper-persistent-data lvm2
    # 安装基本环境
    yum install gcc-c++
    yum install -y pcre pcre-devel
    yum install -y zlib zlib-devel
    yum install -y openssl openssl-devel
    yum install wget
    yum install unzip
    

    2、安装consul (服务注册与发现)

    # 下载它的安装包,wget -c 中的 -c 表示断点续传
    wget -c https://releases.hashicorp.com/consul/1.8.5/consul_1.8.5_linux_amd64.zip
    # 解压压缩包
    upzip unzip consul_1.8.5_linux_amd64.zip
    # 执行./consul命令,执行后出现 Usage: consul [--version] [--help] <command> [<args>] 这一行以及下面的一些参数则代表这个consul没问题
    ./consul
    # 关闭防火墙
    systemctl stop firewalld
    # 启动consul,这个ip填写自己计算机的ip,如果是虚拟机就填虚拟机的ip,centos查看ip地址可以用ip addr,window查看ip用 ipconfig
    ./consul agent -dev -ui -node=consul-dev -client=192.168.254.134
    # 当然,也可以使用后台运行的方式,这样子输出的日志回到同级的nohup.out文件中
    nohup ./consul  agent -dev -ui -node=consul-dev -client=192.168.254.134 &
    # 访问consul 的web页面
    192.168.254.134:8500
    
    # 查看并关闭consul的后台进程,我这里写的19854是jobs -l查询到的进程pid
    jobs -l
    kill -9 19854
    

    3、安装nginx 并且为其添加upsync模块

    # 下载upsync模块并且将其解压
    wget -c https://github.com/weibocom/nginx-upsync-module/archive/master.zip
    unzip nginx-upsync-module-master.zip
    # 下载nginx
    wget -c http://nginx.org/download/nginx-1.9.9.tar.gz
    # 解压到当前目录
    tar -zxvf nginx-1.9.9.tar.gz
    # 配置一个nginx的用户以及用户组,-s /sbin/nologin nginx代表该用户是无法登录到主机的
    groupadd nginx
    useradd -g nginx -s /sbin/nologin nginx
    # 这两个文件夹会在编译nginx时指定
    mkdir -p /var/tmp/nginx/client/
    mkdir -p /usr/local/nginx
    # 进入到nginx的解压后文件夹的目录下
    cd nginx-1.9.9 
    # 编译 nginx ,--prefix 代表nginx安装的目录。其中指定了用户和用户组,以及上面创建的文件夹并且添加了upsync模块,由于upsync解压在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
    ## 进入到刚刚nginx安装的目录,也就是/usr/local/nginx目录中,进入conf目录中编辑conf目录的文件内容
    upstream myserver {
          server 127.0.0.1:11111;# 这个固定的,不用理
          # springbootserver : key的值,upsync_timeout 超时时间3秒,upsync_interval 间隔时间 ,upsync_type 类型consul,strong_dependency 增强依赖 
          upsync 192.168.254.134:8500/v1/kv/upstreams/springbootserver upsync_timeout=3000ms upsync_interval=500ms upsync_type=consul strong_dependency=off;
          # 将拉取下来的配置文件放在以下配置的目录中 
          upsync_dump_path /usr/local/nginx-1.9.9/conf/upsync_dump.conf;
    
        }
        # 将server中的location指定为刚刚创建的upstream(上游服务器)
     location / {
            proxy_pass http://myserver;
            index  index.html index.htm;
          }
    # 进入到sbin目录下,启动nginx
    ./nginx
    

    4、进行测试

    • 本机启动2个服务,分别为8080和8081,ip地址为192.168.0.116
    • 使用linux命令为consul指定2个key value,192.168.254.134是consul的ip地址
    # 使用curl 请求,一定要是put请求
    curl -X PUT http://192.168.254.134:8500/v1/kv/upstreams/springbootserver/192.168.0.116:8080
    
    curl -X PUT http://192.168.254.134:8500/v1/kv/upstreams/springbootserver/192.168.0.116:8081
    
    #或者使用postman调用consul提供的api来添加key,value
    http://192.168.254.134:8500/v1/kv/upstreams/springbootserver/192.168.0.116:8081
    
    # 甚至可以图形化界面进行操作,手动添加key value,手动添加时注意如果是创建文件夹需要在最后加一个正斜杠 : /
    

    5、在consul图形化页面添加key对应的value来指定负载均衡的算法

    {"weight":1, "max_fails":2, "fail_timeout":10, "down":0}
    

    在这里插入图片描述

    然后由于wget下载的速度有时候比较慢,这边上传了文件

    文件链接

    展开全文
  • 3 个应用服务: 编译 Nginx 实现 Dynamic Upstream 需要添加 nginx-upsync-module 和nginx_upstream_check_module 两个第三方模块,在编译 Nginx 的时候要将这两个模块添加进去。这里准备了一个 Dockerfile,使用 ...

    Nginx 是一款开源、高性能、高可靠的 Web 和反向代理服务器,性能是 Nginx 最重要的考量,其占用内存少、并发能力强。
    Nginx 最常见的使用场景就是反向代理,Nginx 接收客户端的请求并通过相应的负载均衡算法将流量转发给后端的多台应用服务器。

    传统做法

    通常我们先会配置一个 upstream 地址池,包含后端的多台应用服务器,然后通过 proxy_pass 将流量分发给 upstream 中的成员。

    http {
        
        upstream upstream_server{
            server 192.168.1.134:81;
            server 192.168.1.134:82;
        }
    
        server {
            listen       80;
            server_name localhost;
    
            location / {
                proxy_pass http://upstream_server;
            }
        }
    }
    

    假如现在由于应用服务器压力比较大,要新增一台服务器,那么需要修改 upstream 为:

    upstream upstream_server{
        server 192.168.1.134:81;
        server 192.168.1.134:82;
        #新增的服务器
        server 192.168.1.134:83;
    }
    

    修改完成之后,需要通过 nginx -s reload 命令重新加载配置,才能使配置生效。虽然 Nginx 可以做到平滑地重载配置,但是每次应用服务器增加或删除时都要改动 Nginx 显得并不是那么智能。如果有大量的 Nginx 需要管理,每次都需要手动操作将会极大地增加运维的负担。

    Dynamic Upstream

    基于传统做法的弊端,我们引入了注册中心保存应用服务信息,Nginx 通过动态获取注册中心中的服务信息,更新 upstream 配置,无需人为干预和重启。实际生产应用中我们可以将 CMDB 和 注册中心整合,管理人员只需要在 CMDB 上维护应用服务信息即可。

    Nginx 第三方模块 nginx-upsync-module 支持通过注册中心动态发现 upstream 信息。目前 nginx-upsync-module 模块支持 Consul 和 Etcd 作为 注册中心。

    另外开源版本的 Nginx 默认只支持被动的健康检查,只有当客户端访问时,才会发起对后端节点的探测。假设本次请求中, Nginx 转发的后端节点正好出现了异常,Nginx 会将请求再转交给另一个 upstream 中的节点处理,所以不会影响到这次请求的正常进行,但是会影响效率,因为多了一次转发。并且自带模块无法做到预警。因此我们还使用了第三方模块 nginx_upstream_check_module 用于健康检查,该模块不仅支持主动的健康检查还提供了 WebUI 用于查看健康检查状态。

    本示例 github 地址:https://github.com/cr7258/nginx-lab/tree/master/dynamic-upstream

    目前还有其他产品支持动态配置,不仅仅是 upstream,还包括了其他方面的配置。例如 Nginx 的商业版本 Nginx Plus,和云原生结合得比较好的 Envoy、Kong、Traefik 等等。大家有兴趣可以自行了解。

    注册中心 Consul 搭建

    我们在一台虚拟机上启动 3 个 Consul 服务,组成一个伪集群。

    下载安装包。

    wget https://releases.hashicorp.com/consul/1.9.3/consul_1.9.3_linux_amd64.zip
    unzip consul_1.9.3_linux_amd64.zip
    mv consul /usr/local/bin/
    

    创建相关目录:

    mkdir /data/consul && cd $_
    mkdir -pv /data/consul/node{1..3}
    

    创建 3 个 Consul 节点使用的配置文件:

    node1

    vim /data/consul/node1/consul_config1.json

    {
      "datacenter": "dev",
      "data_dir": "/data/consul/node1",
      "log_file": "/data/consul/node1/consul.log",
      "log_level": "INFO",
      "server": true,
      "node_name": "node1",
      "ui": true,
      "bind_addr": "192.168.1.134",
      "client_addr": "192.168.1.134",
      "advertise_addr": "192.168.1.134",
      "bootstrap_expect": 3,
      "ports":{
        "http": 8510,
        "dns": 8610,
        "server": 8310,
        "serf_lan": 8311,
        "serf_wan": 8312
        }
    }
    

    node2

    vim /data/consul/node2/consul_config2.json

    {
      "datacenter": "dev",
      "data_dir": "/data/consul/node2",
      "log_file": "/data/consul/node2/consul.log",
      "log_level": "INFO",
      "server": true,
      "node_name": "node2",
      "ui": true,
      "bind_addr": "192.168.1.134",
      "client_addr": "192.168.1.134",
      "advertise_addr": "192.168.1.134",
      "bootstrap_expect": 3,
      "ports":{
        "http": 8520,
        "dns": 8620,
        "server": 8320,
        "serf_lan": 8321,
        "serf_wan": 8322
        }
    }
    

    node3

    vim /data/consul/node3/consul_config3.json

    {
      "datacenter": "dev",
      "data_dir": "/data/consul/node3",
      "log_file": "/data/consul/node3/consul.log",
      "log_level": "INFO",
      "server": true,
      "node_name": "node3",
      "ui": true,
      "bind_addr": "192.168.1.134",
      "client_addr": "192.168.1.134",
      "advertise_addr": "192.168.1.134",
      "bootstrap_expect": 3,
      "ports":{
        "http": 8530,
        "dns": 8630,
        "server": 8330,
        "serf_lan": 8331,
        "serf_wan": 8332
        }
    }
    

    启动 Consul 集群:

    nohup consul agent -config-file=/data/consul/node1/consul_config1.json > /dev/null 2>&1 &
    nohup consul agent -config-file=/data/consul/node2/consul_config2.json -retry-join=192.168.1.134:8311 > /dev/null 2>&1 &
    nohup consul agent -config-file=/data/consul/node3/consul_config3.json -retry-join=192.168.1.134:8311 > /dev/null 2>&1 &
    

    启动之后,便可以通过 http://192.168.1.134:8510 访问,此处 192.168.1.134:8510 是 Leader 角色。

    启动后端应用服务

    后端服务是用 Nginx 启动的 Web 服务。准备 3 个后端服务,IP 和 Port 分别是:

    192.168.1.134:81
    192.168.1.134:82
    192.168.1.134:83
    

    配置文件内容如下,3 个服务的配置基本一样,只是改了相关的端口和路径:

    user root;
    events{}
    http{
    server {
        listen       81 default_server;
        listen       [::]:81 default_server;
        server_name  127.0.0.1;
        root         /root/myapp/nginx/html/81;
        server_tokens off;
    
        gzip on;
        gzip_buffers 16 8k;
        gzip_comp_level 6;
        gzip_http_version 1.1;
        gzip_min_length 256;
        gzip_proxied any;
        gzip_vary on;
        gzip_types text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml text/javascript application/javascript application/x-javascript text/x-json application/json application/x-web-app-manifest+json text/css text/plain text/x-component font/opentype application/x-font-ttf application/vnd.ms-fontobject image/x-icon;
        gzip_disable "msie6";
    
    
        location / {
            expires max;  
            open_file_cache max=1000 inactive=20s; 
            open_file_cache_valid 30s; 
            open_file_cache_min_uses 2; 
            open_file_cache_errors on;
        }
    
        error_page 404 /404.html;
            location = /40x.html {
        }
    
        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
      }
    }
    

    html 文件如下:

    [root@nginx-plus1 nginx]# cat html/81/index.html 
    <html>
    <head>
        <meta charset="utf-8">
        <title>server1</title>
    </head>
    <body style="background-color:blue;">
        <h1>Server 1 url 1<h1>
    </body>
    </html>
    

    启动 3 个后端服务,在启动 Nginx 的时候指定配置文件即可:

    sbin/nginx -c /root/myapp/nginx/81.conf
    sbin/nginx -c /root/myapp/nginx/82.conf
    sbin/nginx -c /root/myapp/nginx/83.conf
    

    访问 3 个应用服务:

    编译 Nginx

    实现 Dynamic Upstream 需要添加 nginx-upsync-modulenginx_upstream_check_module 两个第三方模块,在编译 Nginx 的时候要将这两个模块添加进去。这里准备了一个 Dockerfile,使用 docker build -t 镜像名:标签名 . 就可以构建出一个编译好的 Nginx Docker 镜像。

    FROM debian:stretch-slim
    
    RUN useradd  www && \
    mkdir -p /logs/nginx/  /webserver/nginx /webserver/nginx/conf/upsync && \
    chown -R www:www /logs/nginx/  /webserver/nginx && \
    echo 'deb http://mirrors.163.com/debian/ stretch main non-free contrib' > /etc/apt/sources.list && \
    echo 'deb http://mirrors.163.com/debian/ stretch-updates main non-free contrib' >> /etc/apt/sources.list && \
    echo 'deb-src http://mirrors.163.com/debian/ stretch main non-free contrib' >> /etc/apt/sources.list && \
    echo 'deb-src http://mirrors.163.com/debian/ stretch-updates main non-free contrib' >> /etc/apt/sources.list && \
    echo 'deb-src http://mirrors.163.com/debian/ stretch-backports main non-free contrib' >> /etc/apt/sources.list && \
    echo 'deb-src http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib' >> /etc/apt/sources.list && \
    cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    apt-get update && \
    apt-get install -y wget vim net-tools unzip libjemalloc-dev && \
    apt-get build-dep -y nginx
    
    RUN \
    cd /usr/local/src/ && \
    wget -c http://nginx.org/download/nginx-1.14.2.tar.gz && \
    wget -c https://www.openssl.org/source/old/1.0.2/openssl-1.0.2m.tar.gz && \
    wget -c https://github.com/simplresty/ngx_devel_kit/archive/v0.3.1rc1.tar.gz && \
    wget -c https://github.com/openresty/lua-nginx-module/archive/v0.10.11.tar.gz && \
    wget -c https://github.com/xiaokai-wang/nginx_upstream_check_module/archive/master.zip -O nginx_upstream_check_module.zip && \
    wget -c https://github.com/weibocom/nginx-upsync-module/archive/master.zip -O nginx-upsync-module.zip && \
    tar zxf ./nginx-1.14.2.tar.gz && rm nginx-1.14.2.tar.gz && \
    tar zxf ./openssl-1.0.2m.tar.gz && rm openssl-1.0.2m.tar.gz && \
    tar zxf ./v0.3.1rc1.tar.gz && rm v0.3.1rc1.tar.gz && \
    tar zxf ./v0.10.11.tar.gz && rm v0.10.11.tar.gz &&  \
    unzip ./nginx_upstream_check_module.zip && rm nginx_upstream_check_module.zip && \
    unzip ./nginx-upsync-module.zip && rm nginx-upsync-module.zip
    
    RUN \
    cd /usr/local/src/nginx-1.14.2 &&\
    patch -p1 < /usr/local/src/nginx_upstream_check_module-master/check_1.12.1+.patch &&\
    ./configure \
    --prefix=/webserver/nginx \
    --user=www --group=www --with-pcre \
    --with-stream \
    --with-http_v2_module \
    --with-http_ssl_module \
    --with-ld-opt=-ljemalloc \
    --with-http_realip_module \
    --with-http_gzip_static_module \
    --with-http_stub_status_module \
    --http-log-path=/logs/nginx/access.log \
    --error-log-path=/logs/nginx/error.log \
    --with-openssl=/usr/local/src/openssl-1.0.2m \
    --add-module=/usr/local/src/ngx_devel_kit-0.3.1rc1 \
    --add-module=/usr/local/src/lua-nginx-module-0.10.11 \
    --add-module=/usr/local/src/nginx_upstream_check_module-master \ 
    --add-module=/usr/local/src/nginx-upsync-module-master && \
    make && \
    make install
    

    另外我也准备了一个已经构建好的镜像:registry.cn-shanghai.aliyuncs.com/public-namespace/nginx-dynamic-upstream:v1.0.0 ,可以直接拿来使用。

    准备 Nginx 动态更新的配置文件

    配置 nginx.conf 文件:

    worker_processes  1;
    events {
        worker_connections  1024;
    }
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
    
        upstream app {
            upsync 192.168.1.134:8510/v1/kv/upstreams/app/ upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;
            upsync_dump_path /webserver/nginx/conf/app.conf; # 当consul故障时候,就可以把此作为备份配置文件
            include /webserver/nginx/conf/app.conf; # 准备一个兼容的nginx测试文件,如果没有第一次启动会起不来
            check interval=1000 rise=2 fall=2 timeout=3000 type=http default_down=false;
            check_http_send "HEAD / HTTP/1.0\r\n\r\n";
            check_http_expect_alive http_2xx http_3xx;
            }
        server {
            listen       80;
            server_name  localhost;
            location / {
                proxy_pass http://app;
            }
            location /upstream_list {
                upstream_show;
            }
            location /upstream_status {
                check_status;
                access_log off;
            }
        }
    }
    

    app.conf 文件里随便写上一个 IP 和 Port 信息,可以是无法访问的服务,因为 Nginx 的 upstream 中必须要有地址才能启动 Nginx。我们后面会通过在 Consul 上注册服务让 Nginx 动态更新 Upstream。

    server 0.0.0.0:12345 weight=1 max_fails=2 fail_timeout=10s;
    

    在本地的 Mac 电脑上通过 Docker 启动 Nginx 容器:

    docker run -d --name nginx-dynamic-upstream \
    -v /Users/chengzhiwei/lab/docker-lab/nginx/dynamic-upstream/nginx.conf:/webserver/nginx/conf/nginx.conf \
    -v /Users/chengzhiwei/lab/docker-lab/nginx/dynamic-upstream/app.conf:/webserver/nginx/conf/app.conf \
    -p 80:80 -p 443:443 \
    registry.cn-shanghai.aliyuncs.com/public-namespace/nginx-dynamic-upstream:v1.0.0 \
    /webserver/nginx/sbin/nginx  -g "daemon off;"
    

    通过 curl 命令发送 HTTP 请求往 Consul 中注册两个新的服务。

    curl -X PUT -d '{"weight":1, "max_fails":2, "fail_timeout":10, "down":0}' http://192.168.1.134:8510/v1/kv/upstreams/app/192.168.1.134:81
    curl -X PUT -d '{"weight":1, "max_fails":2, "fail_timeout":10, "down":0}' http://192.168.1.134:8510/v1/kv/upstreams/app/192.168.1.134:82
    

    通过 http://localhost/upstream_list 查看 upstream 主机:

    通过 http://localhost/upstream_status 可以看到应用服务的健康检查状态:

    访问 http://localhost 可以代理到后端的应用服务:

    此时我们停掉 192.168.1.134:81 的服务:

    #查看监听 81 端口的进程号
    [root@nginx-plus1 nginx]# lsof -i:81
    COMMAND   PID USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
    nginx   26047 root    6u  IPv4 202389912      0t0  TCP *:81 (LISTEN)
    nginx   26047 root    7u  IPv6 202389913      0t0  TCP *:81 (LISTEN)
    nginx   26048 root    6u  IPv4 202389912      0t0  TCP *:81 (LISTEN)
    nginx   26048 root    7u  IPv6 202389913      0t0  TCP *:81 (LISTEN)
    #停止服务
    [root@nginx-plus1 nginx]# kill 26047
    

    此时查看健康检查状态,发现 81 端口的服务已经被置为 down 了。

    此时再访问 http://localhost 就只能访问到端口为 82 的服务了。

    参考链接

    • https://cloud.tencent.com/developer/article/1802712?from=article.detail.1628590
    • https://github.com/weibocom/nginx-upsync-module
    • https://cloud.tencent.com/developer/article/1648733?from=article.detail.1802712

    欢迎关注

    展开全文
  • <div><p>nginx-stream-upsync-module 支持tcp nginx-stream-upsync-module支持http 你好,我可能项目中需要同时动态修改这两个协议,如果不能,求推荐别的方案或工具。</p><p>该提问来源于开源...
  • Nginx+Consul+UpSync动态配置负载均衡(二)一、安装nginx模块1.合并module2.重新编译nginx二、添加stream配置文件1.添加stream模块2.创建stream配置文件3.创建持久化文件目录4.启动nginx三、模拟tcp服务端1.创建tcp...


    环境说明

    主机名系统版本ip地址nginx versionconsul versionupsync version备注
    mastercentos-release-7-7.1908.0.el7.centos.x86_64192.168.137.252nginx-1.17.5consul_1.6.1_linux_amd64nginx-upsync-module

    上一篇我们使用Consul+UpSync的方案给ngxin加上了动态负载均衡的功能,但是他只能作为http模块中的负载均衡,也就是只能代理http协议。这篇,在之前的基础上,我们加强一下,添加一个支持stream模块的动态负载均衡功能,让nginx支持tcp/udp的动态负载。顺便也温习一下其他知识点。

    一、安装nginx模块

    之前我们已经下载过nginx-upsync-module模块了,但是这个模块不支持在stream{}模块中使用,而nginx-stream-upsync-module模块是为stream{}提供支持的。我们需要同时安装这两个module模块。但是想要同时使用这两个模块的话,是不能同时在编译nginx的时候把这两个模块一起编译进去的。所以我们需要先将两个模块合并成一个。

    1.合并module

    [root@master02 ~]# cd /opt/nginx/
    [root@master02 nginx]# git clone https://github.com/CallMeFoxie/nginx-upsync.git
    

    原文章是将3个资源包下载好之后再进行复制的,但是他那里写的复制命令是有问题的,不能复制子目录,请注意。
    我们这里直接进行下载覆盖即可。

    [root@master02 nginx]# cd /opt/nginx/nginx-upsync
    [root@master02 nginx-upsync]# git clone https://github.com/weibocom/nginx-upsync-module.git
    [root@master02 nginx-upsync]# git clone https://github.com/xiaokai-wang/nginx-stream-upsync-module.git
    

    这样我们就将nginx-upsync-modulenginx-stream-upsync-module两个模块合并成了nginx-upsync模块了。

    2.重新编译nginx

    之前我们已经编译过一次nginx了,但是当时只将nginx-upsync-module模块编译进去,现在我们需要用nginx-upsync模块进行替换,所以要重新编译。
    2.1 编译安装nginx

    [root@master02 nginx-upsync]# cd /opt/nginx/nginx-1.17.5
    [root@master02 nginx-1.17.5]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_realip_module --with-pcre --add-module=/opt/nginx/nginx-upsync --with-stream
    

    注意最后两个参数--add-module=/opt/nginx/nginx-upsync --with-stream,第一个参数我们将之前的nginx-upsync-module替换成了nginx-upsync,第二个参数--with-stream是开启nginx的stream模块。

    [root@master02 nginx-1.17.5]# make
    [root@master02 nginx-1.17.5]# /usr/local/nginx/sbin/nginx -s stop
    [root@master02 nginx-1.17.5]# \cp /opt/nginx/nginx-1.17.5/objs/nginx /usr/local/nginx/sbin/
    

    第一条命令是安装,不要使用make install命令,这个命令可能会覆盖之前的nginx工作目录。
    第二条命令是停止运行中的nginx,因为接下来我们要替换旧的nginx执行文件。
    第三条是用刚刚编译安装成功的nginx替换旧的nginx执行文件。\cp命令的作用是若文件存在不询问直接覆盖。

    我们可以使用-V命令来查看nginx的编译参数:

    [root@master02 nginx-1.17.5]# /usr/local/nginx/sbin/nginx -V
    

    在这里插入图片描述
    可以看到是我们刚刚的编译参数。

    二、添加stream配置文件

    1.添加stream模块

    [root@master02 nginx-1.17.5]# cd /usr/local/nginx/conf
    [root@master02 conf]# vim nginx.conf
    

    在文件中添加如下代码块,stream模块与http模块并列。

    stream {
        #加载外部配置文件
        include /usr/local/nginx/conf.d/stream/*.conf;
    }
    

    在这里插入图片描述

    2.创建stream配置文件

    [root@master02 conf]# mkdir /usr/local/nginx/conf.d/stream
    [root@master02 conf]# cd /usr/local/nginx/conf.d/stream
    [root@master02 stream]# vim stream-mysql-3307.conf
    

    因为mysql通常是用tcp连接的,所以我们使用mysql来做测试。故文件名中有mysql。
    文件中填入下面代码:

    upstream mysql {
            server 127.0.0.1:11111;
            upsync 192.168.137.252:8500/v1/kv/upstreams/stream/ upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;
            upsync_dump_path /usr/local/nginx/conf/servers/servers_stream.conf;
            include /usr/local/nginx/conf/servers/servers_stream.conf;
    }
    
    server {
            listen 3307;
            proxy_pass mysql;
    }
    

    在这里插入图片描述

    3.创建持久化文件目录

    [root@master02 stream]# vim /usr/local/nginx/conf/servers/servers_stream.conf
    

    直接空文件退出即可。

    4.启动nginx

    [root@master02 stream]# /usr/local/nginx/sbin/nginx -t
    [root@master02 stream]# /usr/local/nginx/sbin/nginx
    

    三、模拟tcp服务端

    1.创建tcp服务器

    我们需要几个tcp的服务端来验证我们的动态负载是否可用。
    我这边是使用docker,在docker中创建了3个mysql的容器:
    在这里插入图片描述
    如果没有其他更好的方式,也可以采取我这种。我这个mysql是装在另外一台机子192.168.137.123上面。

    2.给每个服务做区分

    分别登录3个数据库服务端,我们在每个数据库服务端中都创建一个叫test的数据库实例,然后分别在每个数据库实例中创建一张表,我们可以创建不同的表名来做为三台服务器之间的区分。当然也可以表名相同,然后利用表中数据不同来做区分。我这里使用表名区分,更加简单、直观。
    在这里插入图片描述

    四、开启并验证tcp的动态负载均衡

    1.启动Consul服务

    如果之前启动的没有关闭就可以不用再启动了。

    [root@master02 stream]# /opt/nginx/consul agent -dev -ui -node=consul-dev -client=192.168.137.252
    

    2.添加服务端信息到consul

    我们依次将3个mysql服务端的地址添加到consul

    [root@master02 stream]# curl -X PUT http://192.168.137.252:8500/v1/kv/upstreams/tcp/192.168.137.123:3301
    [root@master02 stream]# curl -X PUT http://192.168.137.252:8500/v1/kv/upstreams/tcp/192.168.137.123:3302
    [root@master02 stream]# curl -X PUT http://192.168.137.252:8500/v1/kv/upstreams/tcp/192.168.137.123:3303
    

    此时我们可以查看一下持久化文件中的内容

    [root@master02 stream]# cat /usr/local/nginx/conf/servers/servers_tcp.conf
    

    在这里插入图片描述
    如果是我们刚刚添加的三个服务端列表的话,就是成功了。

    3.验证动态负载均衡是否成功

    我们在之前的navicat软件中新建一个连接。
    连接至我们之前配置的192.168.137.252:3307
    先点击测试连接,如果不成功的话,需要先找下原因。我这边是没问题的。
    在这里插入图片描述
    我们打开刚刚创建的连接,进入表选项中,可以看到一个表名称,我现在看到的是t_lb2这张表。
    在这里插入图片描述
    然后我们将连接先关闭,然后再重新连接,看看表有没有变化。可以看到我这里已经变成t_lb1表了
    在这里插入图片描述
    重复几次关闭连接再重新连接,看看表的变化,会发现表名称会在t_lb1/t_lb2/t_lb3三张表中随机出现,这刚刚好对应到我们一开始在mysql的三个服务端中分别创建的3张表。由此也就可以说明我们的tcp动态负载均衡已经成功了。

    如果还不太确信的话,可以使用命令删除两个负载均衡服务,只留下一个,再次验证一下lb-upstream-mysql中表的名称是不是不会变化了。

    [root@master02 stream]# curl -X DELETE http://127.0.0.1:8500/v1/kv/upstreams/tcp/192.168.137.123:3302
    [root@master02 stream]# curl -X DELETE http://127.0.0.1:8500/v1/kv/upstreams/tcp/192.168.137.123:3303
    

    这个时候,再去尝试重新连接lb-upstream-mysql,发现不管重连多少次,表中只会出现t_lb1这个表名称。

    这样就可以完全确定我们已经配置好了。

    五、问题记录

    1. upsync_del_peer: upstream “app” cannot delete all peers

    当nginx重启,consul后台与持久化文件中的服务器列表不统一时,nginx日志中将会报错:

    upsync_del_peer: upstream "app" cannot delete all peers
    upsync_process: upstream del peers failed
    

    在这里插入图片描述
    但是这个时候负载均衡还是依然可以访问的,只是持久化文件写入失败了。consul服务正常启用的时候,负载均衡列表以consul服务中的列表为准。

    如果我们想要持久化文件被写入,就要在nginx重启之前,将持久化文件内的服务器列表手动配置成跟consul后台一致,然后再重启nginx。这样问题就得以解决了。

    2. upsync_check_key: has no port in /

    nginx中会一直报这个错upsync_check_key: has no port in /,原因是consul在添加键值的时候,默认会把我们添加的文件夹也当成一个键值对,而文件夹这个key是没有带端口的。所以nginx会报这个错。
    但是nginx可以正常使用的。这个错误,暂时我也不知道怎么解决。

    参考连接:https://github.com/CallMeFoxie/nginx-upsync
    https://github.com/xiaokai-wang/nginx-stream-upsync-module

    展开全文
  • 一、nginx reload的问题 问题描述 nginx reload是有一定损耗的,如果你使用的是长连接的话,那么当... 微博的Upsync+Consul 实现动态负载均衡。 OpenResty的balancer_by_lua(又拍云使用其开源的slardar(Consul bal

    一、nginx reload的问题

    问题描述

    nginx reload是有一定损耗的,如果你使用的是长连接的话,那么当reload nginx时长连接所有的worker进程会进行优雅退出,并当该worker进程上的所有连接都释放时,进程才真正退出。

    解决办法

    对于社区版nginx目前有三个选择方式:

    1. Tengine 的Dyups模块。
    2. 微博的Upsync+Consul 实现动态负载均衡。
    3. OpenResty的balancer_by_lua(又拍云使用其开源的slardar(Consul balancer_by_lua))。

    本文使用upsync模块来解决配置文件修改后,reload nginx进程造成性能下降的问题。

    它的功能是拉取 consul 的后端 server 的列表,并更新 Nginx 的路由信息。此模块不依赖于任何第三方模块。consul 作为 Nginx 的 db,利用 consul 的 KV 服务,每个 Nginx work 进程独立的去拉取各个 upstream 的配置,并更新各自的路由。

     

    二、实战

    2.1 给nginx打补丁包

    这步可以不做,如果不做,编译的时候删除这个模块

    git clone https://github.com/xiaokai-wang/nginx_upstream_check_module
    ## 打补丁包
    patch -p0 < /usr/local/src/nginx_upstream_check_module-master/check_1.9.2+.patch 
    

    下载nginx-upsync-module源码

    git clone https://github.com/weibocom/nginx-upsync-module.git
    下载nginx源码
    wget 'http://nginx.org/download/nginx-1.10.1.tar.gz'
    tar -xzvf nginx-1.10.1.tar.gz
    cd nginx-1.10.1/
    开始编译
    ./configure --prefix=/data/app/nginx-1.10.1 --user=nginx --group=nginx  --with-http_ssl_module  --with-http_stub_status_module   --add-module=/usr/local/src/nginx-upsync-module-master/ --add-module=/usr/local/src/nginx_upstream_check_module-master/
    make
    make install
    

    三、启动consul

    wget https://releases.hashicorp.com/consul/0.6.4/consul_0.6.4_linux_amd64.zip
    unzip consul_0.6.4_linux_amd64.zip
    ./consul agent -advertise=x.x.x.x -client=0.0.0.0 -dev
    

    创建nginx配置文件

    mkdir -p /usr/local/nginx/conf/servers
    /usr/local/nginx/conf/nginx.conf
    events {
      worker_connections  4096;  ## Default: 1024
    }
    
    http {
        upstream test {
            # 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 127.0.0.1:8500/v1/kv/upstreams/test upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;
            upsync_dump_path /usr/local/nginx/conf/servers/servers_test.conf;
        }
    
        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;
            }
    
        }
    }
    

    四、测试

    for i in `seq 3`;do mkdir html$i/test -p && echo $i >html$i/test/test.html; done;  
    
    docker run -d -p 8001:80 -v /root/html1/:/usr/share/nginx/html nginx 
    docker run -d -p 8002:80 -v /root/html2/:/usr/share/nginx/html nginx 
    docker run -d -p 8003:80 -v /root/html3/:/usr/share/nginx/html nginx 
    

    五、添加服务

    curl -X PUT -d '{"weight":1, "max_fails":2, "fail_timeout":10}' http://127.0.0.1:8500/v1/kv/upstreams/test/192.168.56.12:8001
    curl -X PUT -d '{"weight":1, "max_fails":2, "fail_timeout":10}' http://127.0.0.1:8500/v1/kv/upstreams/test/192.168.56.12:8002
    curl -X PUT -d '{"weight":1, "max_fails":2, "fail_timeout":10}' http://127.0.0.1:8500/v1/kv/upstreams/test/192.168.56.12:8003
    

    查看conf/servers/servers_test.conf 文件中是否有内容

    cat conf/servers/servers_test.conf 
    server 192.168.56.12:8003 weight=1 max_fails=2 fail_timeout=10s;
    server 192.168.56.12:8002 weight=1 max_fails=2 fail_timeout=10s;
    server 192.168.56.12:8001 weight=1 max_fails=2 fail_timeout=10s;
    

    或者浏览器打开http://192.168.56.11:8080/upstream_show?test
    显示内容如下:

    Upstream name: test; Backend server count: 3
            server 192.168.56.12:8003 weight=1 max_fails=2 fail_timeout=10s;
            server 192.168.56.12:8002 weight=1 max_fails=2 fail_timeout=10s;
            server 192.168.56.12:8001 weight=1 max_fails=2 fail_timeout=10s;
    

    总结
    此模块只修改upstream 中的缓存信息,不能修改或添加其他配置

    测试中遇到的问题
    在添加服务时出现如下错误,导致服务添加不能实时进行,大约需要3分钟左右时间。

    consul日志:

    2016/03/22 05:34:42 [DEBUG] http: Request GET /v1/kv/upstreams/test?recurse&index=169 (149.023µs) from=127.0.0.1:38853
        2016/03/22 05:34:43 [DEBUG] http: Request GET /v1/kv/upstreams/test?recurse&index=169 (146.759µs) from=127.0.0.1:38854
        2016/03/22 05:34:45 [DEBUG] http: Request GET /v1/kv/upstreams/test?recurse&index=169 (149.853µs) from=127.0.0.1:38855
        2016/03/22 05:34:46 [DEBUG] http: Request GET /v1/kv/upstreams/test?recurse&index=169 (111.46µs) from=127.0.0.1:38856
        2016/03/22 05:34:48 [DEBUG] http: Request GET /v1/kv/upstreams/test?recurse&index=169 (142.696µs) from=127.0.0.1:38857
        2016/03/22 05:34:48 [DEBUG] http: Request GET /v1/kv/upstreams/test?recurse&index=169 (112.089µs) from=127.0.0.1:38858
        2016/03/22 05:34:49 [DEBUG] http: Request GET /v1/kv/upstreams/test?recurse&index=169 (114.29µs) from=127.0.0.1:38859
        2016/03/22 05:34:50 [DEBUG] http: Request GET /v1/kv/upstreams/test?recurse&index=169 (148.245µs) from=127.0.0.1:38860
    

    nginx日志

    2016/03/22 05:35:09 [error] 18879#0: recv() failed (104: Connection reset by peer)
    2016/03/22 05:35:09 [error] 18879#0: upsync_recv: recv error with upsync_server: 127.0.0.1:8500
    2016/03/22 05:35:10 [error] 18879#0: recv() failed (104: Connection reset by peer)
    2016/03/22 05:35:10 [error] 18879#0: upsync_recv: recv error with upsync_server: 127.0.0.1:8500
    2016/03/22 05:35:11 [error] 18879#0: recv() failed (104: Connection reset by peer)
    2016/03/22 05:35:11 [error] 18879#0: upsync_recv: recv error with upsync_server: 127.0.0.1:8500
    2016/03/22 05:35:13 [error] 18879#0: recv() failed (104: Connection reset by peer)
    2016/03/22 05:35:13 [error] 18879#0: upsync_recv: recv error with upsync_server: 127.0.0.1:8500
    2016/03/22 05:35:13 [error] 18879#0: recv() failed (104: Connection reset by peer)
    2016/03/22 05:35:13 [error] 18879#0: upsync_recv: recv error with upsync_server: 127.0.0.1:8500
    2016/03/22 05:35:14 [error] 18879#0: recv() failed (104: Connection reset by peer)
    

    问题现象
    当添加一个服务时,出现此问题,新增服务不能及时添加到负载中,不影响运行正常的服务。 此时再往consul继续添加一个服务时,可能会导致此错误终止,并能成功添加当前两条服务记录。

    六、帮助文档

    官方github地址
    nginx_upstream_check_modulehttps://www.cnblogs.com/CarpenterLee/p/8084533.html)

    展开全文
  •  upsync 192.168.212.134:8500/v1/kv/upstreams/itmayiedu upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;  upsync_dump_path /usr/local/nginx/conf/servers/servers...
  • upsync 192.168.112.129:8500/v1/kv/upstreams/itmayiedu upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off; ## 配置upsync从consul拉去最新服务信息存放的地址 upsync_dump_...
  • 安装依赖包 OpenSSL 在官网下载页下到最新稳定版1.0.2q。 PCRE 在 PCRE 官网可以找到下载地址,这里选择8.x的...下载nginx 源码包及nginx-upsync-module模块源码 这里下载的是nginx稳定版nginx-1.14.2.tar.gz,nginx-u
  • Upsync,微博开源基于Nginx容器动态流量管理方案 。Nginx 以其超高的性能与稳定性,在业界获得了广泛的使用,微博的七层就大量使用了 Nginx 。结合 Nginx 的健康检查模块,以及动态 reload 机制,可以近乎无损的服务...
  • Consul+upsync+Nginx 实现无需重启Nginx的动态负载均衡 各组件作用: Consul Web:Consul的客户端可视化界面,管理负载均衡配置的信息 Consul Server:Consul服务端,用于存放负载均衡配置 Nginx:以间隔时间动态...
  • 动态负载均衡就相当于不去修改nginx的配置,就可以改变nginx的上游服务器。 动态负载均衡的实现方案 Consul+Consul-template ...Consul+upsync+nginx:推荐该方案,实现无需reload nginx,可...
  • Upsync是新浪微博开源的基于Nginx实现动态配置的三方模块。Nginx-Upsync-Module的功能是拉取Consul的后端server的列表,并动态更新Nginx的路由信息。此模块不依赖于任何第三方模块。Consul作为Nginx的DB,利用...
  • 一:下载nginx和upsync,并编译nginx(添加upsync模块) 1.安装所需依赖: //一键安装上面四个依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 2. 切换到安装目录: cd /usr/local 3...
  • Consul+upsync+Nginx实现动态负载均衡

    千次阅读 2018-06-25 16:28:13
    upsync192.168.212.134:8500/v1/kv/upstreams/itmayieduupsync_timeout=6mupsync_interval=500ms upsync_type=consul strong_dependency=off; upsync_dump_path /usr/local/nginx/conf/servers/servers_test.conf; ...
  • nginx-upsync-module使用

    千次阅读 2016-10-25 18:16:41
    nginx-upsync-module使用编译模块到nginx安装nginx依赖以及其他工具apt-get install git apt-get build-dep nginx下载nginx-upsync-module源码git clone https://github.com/weibocom/nginx-upsync-module.git下载...
  • Nginx + Consul + Upsync实现动态负载均衡

    千次阅读 2018-10-21 15:22:31
    各组件作用: ConsulWeb:Consul的客户端可视化界面,管理负载均衡配置的信息 ConsulServer:Consul服务端,用于存放负载均衡配置 ...Nginx-Upsync-Module的功能是拉取Consul的后端server的列表,并动态更新Nginx...
  • Consul+upsync+Nginx 实现无需重启Nginx的动态负载均衡
  • upstream app { upsync 192.168.99.12:8510/v1/kv/upstreams/app/ upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off; upsync_dump_path /webserver/nginx/conf/app.conf; # 当...
  • Docker部署Consul Nginx添加Upsync模块 动态实现负载均衡
  • 注:如果只要实现动态更新 upstream,而不需要检测server 的可用性,那么以下 2、4步骤就不需要了,只要ngix-upsync-module模块就够了 1. 下载并解压 openresty 2. 下载:nginx_upstream_check_module ,地址...
  • 前提前段时间顺利地把整个服务集群和中间件全部从UCloud迁移到阿里云,笔者担任了架构和半个运维的角色。这里详细记录一下通过Nginx、Consul、Upsync实现动态负载均衡和服务平...
  • nginx-upsync-module模块安装

    千次阅读 2017-11-09 11:45:32
    1:下载对应安装包nginx-upsync-module对nginx的版本有相关要求 我们这里采用的是1.8x的版本 wget http://nginx.org/download/nginx-1.8.0.tar.gz wget ...
  • http://www.php230.com/weixin1456193048.html 【upsync模块说明、性能评测】 https://www.jianshu.com/p/76352efc5657 https://www.jianshu.com/p/c3fe55e6a5f2   说明: 动态nginx负载均衡的配置,可以通过...
  • 1.常用的动态配置Nginx负载均衡方式 ...Consul+upsync+Nginx 实现无需重启Nginx的动态负载均衡。 2、配置Concul服务器 2.1安装解压ZIP软件 如果未安装 unzip软件,在解压ZIP包的时候会提示未找...
  • Nginx+Consul+UpSync动态配置负载均衡一、Nginx安装1.下载nginx源码2.下载组件及模块3.安装nginx3.1、安装编译工具及库文件3.2安装 PCRE3.3编译安装nginx二、安装启动Consul1.解压consul2.启动consul3.浏览器访问...
  • 基于 upsync 方式,开发了模块 nginx-upsync-module,它的功能是拉取 consul 的后端 server 的列表,并更新 Nginx 的路由信息。此模块不依赖于任何第三方模块。 路由表更新方式 consul 作为 Nginx 的 db,利用 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 662
精华内容 264
关键字:

upsync