Summary
在更新nginx upstream pool时,一般方案是更新nginx配置文件,然后reload nginx, 在nginx繁忙时会导致worker process长久处于shutdowning,
在频繁reload ng时,可能会导致nginx挂掉.
本文用的方案是:consul + cosnul-template + tengine dyups + python script , 当服务有变动时,触发consul-template渲染模板并持久化,同时
consul-template触发执行python脚本,python脚本先调用consul api获取对应服务信息,然后将新的服务信息调用dyups管理接口写入nginx upstream pool.
这个方案有两个好处, 一是将nginx upstream pool持久化了 二是在服务出现变动时,不需要再reload nginx了。
简略流程如下:
Tengine编译安装
tengine是支持加载动态库(*.so)的 , 但ngx_http_dyups_module模块是不能编译为动态库的, 需要重新编译tengine,且在编译时启用“--with-http_dyups_module”
Tengine编译参数
1 | --prefix=/usr/local/tengine \ |
nginx.conf
1 | daemon on; |
其它
1 | mkdir -p /usr/local/tengine/conf/upstream_conf/ , 在该目录下不要放置任何conf文件, 该目录下的conf文件都将由consul-template生成. |
题外话: 制作动态库并加载它,在此以“echo-nginx-module”模块为例.
1 | 模块: |
服务注册
本文的测试环境是同先前的consul文章中的环境一样的,需要注意的是,注册的服务名不能含有“.” , prod.cloudiya.com这样的服务名在
consul-template是解析不了的,consul官方也提到了这点.
IP | ROLE | 其上注册的服务 |
---|---|---|
192.168.1.4 | consul server | prod-cloudiya-com |
192.168.1.5 | consul server | prod-cloudiya-com |
192.168.1.6 | consul server | prod-cloudiya-com |
192.168.1.100 | consul client | test-cloudiya-com |
192.168.1.101 | consul client , consul-template , nginx | test-cloudiya-com |
服务定义文件内容
prod-cloudiya-com.json
1 | { |
test-cloudiya-com.json
1 | { |
在如上每台consul主机上将对应服务注册进consul ,并在每台主机“ /usr/bin/nohup python -m SimpleHTTPServer 8090 > /dev/null 2>&1 &” 。
consul-template
/opt/consul-template/template/prod.cloudiya.com.conf.ctmpl
1 | # ----------prod.cloudiya.com------------------ |
/opt/consul-template/template/test.cloudiya.com.conf.ctmpl
1 | # ---------test.cloudiya.com------------------ |
/opt/consul-template/conf/nginx.hcl
1 | consul { |
run consul-template
1 | consul-template -config "/opt/consul-template/conf/nginx.hcl" |
UpdateNgUpstreamPool.py
1 | #!/usr/bin/python |
nginx监控页面
1 | http://192.168.1.101:8081/ng_status |
关于调用tengine dyups管理接口的示例
==在将upstreams信息写往dyups接口时,其对weight , max_fails , down等都是支持和生效的,==
==就如同你先前在nginx配置文件里加upstream条目一样。==
1 | curl -d "server 192.168.1.4:8090;server 192.168.1.5:8090;server 192.168.1.6:8090 weight=2 max_fails=2 fail_timeout=10s;" 127.0.0.1:8081/upstream/prod.cloudiya.com |
参考
1 | http://tengine.taobao.org/document/http_dyups.html |