nginx動態路由
目錄
- 使用場景
- 服務器信息
- 安裝consul
- 安裝web服務
- 安裝nginx
- 測試
使用場景
簡易架構圖
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控制檯,如果無法訪問請注意以下幾點
-
防火牆是否關閉,或者開啓8500端口(測試建議暫時關閉防火牆)
centos 7開啓端口命令/sbin/iptables -I INPUT -p tcp --dport 8500 -j ACCEPT
-
啓動參數-client=ip,是否填寫本機的ip
-
防火牆問題在下面的配置就不說了,配置用到的端口都要打開
安裝 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
環境都準備好了,接下來配置動態路由
修改 /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與我取得聯繫