nginx很强大,第三方模块也不少,淘宝在nginx上很活跃,特别是章亦春,他参与的模块至少10+, 好了今天主角不是他,是一款动态配置upstream的模块,这个模块使用rest接口. 简单,方便,并且可以不需要重启nginx。但是有个问题比较明显,nginx重启之后,什么都没了.
1. 安装
首先安装nginx动态upstream配置模块,如果你已经安装了nginx,那么轻参考ttlsa上的如何安装nginx第三方模块,会安装的请跳过.
01 # cd /usr/local/src/
02 # wget https://github.com/yzprofile/ngx_http_dyups_module/archive/master.zip \
03 -O? ngx_http_dyups_module-master.zip
04 # unzip ngx_http_dyups_module-master.zip
05 # wget http://nginx.org/download/nginx-1.4.2.tar.gz
06 # tar -xzvf nginx-1.4.2.tar.gz
07 # cd nginx-1.4.2
08 # ./configure --prefix=/usr/local/nginx-1.4.2 --with-http_stub_status_module
09 \--add-module=../ngx_http_dyups_module-master/
10 # make
11 # make install
2. 指令(Directives)
语法: dyups_interface
默认: none
配置段: location
启用配置upstream的接口
语法: dyups_read_msg_timeout time
默认: 1s
配置段: main
设置从共享内存中读取commands的超时时间,默认为1秒
语法: dyups_shm_zone_size size
默认: 2MB
配置段: main
设置存储commands的共享内存
This directive set the size of share memory which used to store the commands.
语法: dyups_upstream_conf path
默认: none
配置段: main
这个指令用来指定upstream配置文件的路径,他会在启动的时候加载
语法: dyups_trylock on | off
默认: off
配置段: main
是否启用锁,如果启用了它,同一时刻有人在修改,那么将会返回409.
3. restful接口
GET
/detail 获取所有upstream名称以及upstream里面的servers信息
/list 获取upstream列表
/upstream/name 使用upstream名称获取upstream信息
POST
/upstream/name 更新upstream
body 配置内容;
body server ip:port;
DELETE
/upstream/name 删除upstream,name相应修改
3.1 调用接口响应http状态码
500: 需要reload nginx
409: 重新调用一次接口,上个请求被锁了.
204:调用list或者detail时出现,表示没有响应内容
其他:你的命令错误,请修改
注意:你需要第三方模块来生成新的配置文件到nginx配置目录. 作者也没有说什么第三方模块,这个插件很好,不能生成配置文件,让他显得尤为不足.
4. nginx配置
备注:以下配置有安装echo模块.
01 http {
02 # 从upstream读取初始upstream配置
03 dyups_upstream_conf? conf/upstream.conf;
04 include conf/upstream.conf;
05
06 # 默认主机
07 server {
08 listen?? 80;
09 location / {
10 proxy_pass http://$host;
11 }
12 }
13
14 # 动态配置upstream的接口站点
15 server {
16 listen 81;
17 location / {
18 dyups_interface; # 这个指令表示这边是接口站点
19 }
20 }
21
22 # upstream后面的realserver,2台801,,82
23 server {
24 listen 801;
25 location / {
26 echo 801;
27 }
28 }
29
30 server {
31 listen 802;
32 location / {
33 echo 802;
34 }
35 }
36 }
upstream.conf配置
1 upstream ttlsa1 {
2 server 127.0.0.1:801;
3 }
4
5 upstream ttlsa12 {
6 server 127.0.0.1:802;
7 }
5. 使用方法演示
5.1 添加upstream
1 # curl -d "server 127.0.0.1:801;server 127.0.0.1:802;" 127.0.0.1:81/upstream/ttlsa3
2 success
测试
1 # curl -H "host: ttlsa3" 127.0.0.1
2 801
3
4 # curl -H "host: ttlsa3" 127.0.0.1
5 802
可以看到通过host的ttlsa3可以访问到upstream配置的两台服务器。如果你发现curl几次都是一样的,那么轻多试几次。
5.2 查看upstream详细信息
01 # curl 127.0.0.1:81/detail
02 ttlsa1
03 server 127.0.0.1:801
04
05 ttlsa2
06 server 127.0.0.1:802
07
08 ttlsa3
09 server 127.0.0.1:801
10 server 127.0.0.1:802
5.3 删除upstream
01 # curl -i -X DELETE 127.0.0.1:81/upstream/ttlsa1
02 success
03
04 # curl 127.0.0.1:81/detail
05 ttlsa2
06 server 127.0.0.1:802
07
08 ttlsa3
09 server 127.0.0.1:801
10 server 127.0.0.1:802
5.4 增加带ip_hash的upstream
1 # curl -d "ip_hash;server 127.0.0.1:801;server 127.0.0.1:802;" 127.0.0.1:81/upstream/ttlsa4
2 success
3
4 # curl 127.0.0.1:81/upstream/ttlsa4
5 server 127.0.0.1:801
6 server 127.0.0.1:802
为什么没有带ip_hash的信息,本身就无法显示,那我们在看看weight会不会显示出来
5.5 增加带weight的upstream
1 # curl -d "server 127.0.0.1:801;server 127.0.0.1:802 weight=2;" 127.0.0.1:81/upstream/ttlsa5
2 success
3
4 # curl 127.0.0.1:81/upstream/ttlsa5
5 server 127.0.0.1:801
6 server 127.0.0.1:801
还是不显示,虽然没显示,但是效果还是有的,大家自己去测试吧.
6. 注意事项
本模块不能和nginx_upstream_check_module一起使用,接下来的版本会支持。或者可以使用tenengine。淘宝真是不遗余力在推广他们的tenengine.
7. 结束语
ngx_http_dyups_module带的功能我很喜欢,但是最大的不足就是不能生成配置文件,所有内容都保存在内存中,希望以后的版本能够支持。有这个模块,shell脚本也可以修改upstream,不在需要重启nginx。
本文介绍了如何使用ngx_http_dyups_module模块动态修改nginx的upstream配置,无需重启服务。该模块提供REST接口进行增删查改操作,但缺点是配置仅保存在内存中,不支持生成配置文件。
1773

被折叠的 条评论
为什么被折叠?



