nginx動態路由

nginx動態路由

目錄

  1. 使用場景
  2. 服務器信息
  3. 安裝consul
  4. 安裝web服務
  5. 安裝nginx
  6. 測試

使用場景

簡易架構圖簡易架構
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. 防火牆問題在下面的配置就不說了,配置用到的端口都要打開consul管理界面

安裝 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

下載 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主頁
環境都準備好了,接下來配置動態路由
修改 /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服務器
在這裏插入圖片描述
添加剛纔啓動的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

再次訪問
在這裏插入圖片描述
搞到裏就是配置成功了。可以嘗試創建多個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會使用從consul拉去的最後一次配置信息,即使你把consul上邊的配置刪完了,因爲它的機制是:如果從consul拉取配置失敗,或者取到了空,就使用最後一次拉取成功的配置

整理不易,如果哪裏有問題或者配置錯誤,可留言或者通過QQ:1603565290與我取得聯繫

發佈了20 篇原創文章 · 獲贊 31 · 訪問量 7693
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章