发布于 2015-09-03 15:55:26 | 1823 次阅读 | 评论: 0 | 来源: 网络整理
This module can be used to update your upstream-list without reloadding Nginx.
TODO:
It can not work with common nginx_upstream_check_module
.
The module is not compiled into Tengine by default. It can be enabled with '--with-httpdyupsmodule' configuration parameter, and enabled lua support with '--with-httpdyupslua_api'. But it can not be compiled as a '.so'.
file: conf/nginx.conf
daemon off;
error_log logs/error.log debug;
events {
}
http {
dyups_upstream_conf conf/upstream.conf;
include conf/upstream.conf;
server {
listen 8080;
location / {
proxy_pass http://$host;
}
}
server {
listen 8088;
location / {
echo 8088;
}
}
server {
listen 8089;
location / {
echo 8089;
}
}
server {
listen 8081;
location / {
dyups_interface;
}
}
}
file: conf/upstream.conf
upstream host1 {
server 127.0.0.1:8088;
}
upstream host2 {
server 127.0.0.1:8089;
}
Syntax: dyups_interface
Default: none
Context: loc
This directive set the interface location where you can add or delete the upstream list. See the section of Interface for detail.
Syntax: dyups_read_msg_timeout time
Default: 1s
Context: main
This directive set the interval of workers readding the commands from share memory.
Syntax: dyups_shm_zone_size size
Default: 2M
Context: main
This directive set the size of share memory which used to store the commands.
Syntax: dyups_upstream_conf path
Default: none
Context: main
This directive set the path of file which you dumped all of upstreams' configs, it will be loaded in init process
after process respwan to restore upstreams.
Syntax: dyups_trylock on | off
Default: off
Context: main
You will get a better prefomance but it maybe not stable, and you will get a '409' when the update request conflicts with others.
/detail
get all upstreams and their servers/list
get the list of upstreams/upstream/name
find the upstream by it's name/upstream/name
update one upstreambody
commands;body
server ip:port;/upstream/name
delete one upstreamCall the interface, when you get the return code is HTTP_INTERNAL_SERVER_ERROR 500
, you need to reload nginx to make the Nginx work at a good state.
If you got HTTP_CONFLICT 409
, you need resend the same commands again latter.
The /list and /detail interface will return HTTP_NO_CONTENT 204
when there is no upstream.
Other code means you should modify your commands and call the interface again.
ATTENEION
: You also need a third-party
to generate the new config and dump it to Nginx'conf directory.
```bash » curl -H "host: dyhost" 127.0.0.1:8080
» curl -d "server 127.0.0.1:8089;server 127.0.0.1:8088;" 127.0.0.1:8081/upstream/dyhost success
» curl -H "host: dyhost" 127.0.0.1:8080 8089
» curl -H "host: dyhost" 127.0.0.1:8080 8088
» curl 127.0.0.1:8081/detail host1 server 127.0.0.1:8088
host2 server 127.0.0.1:8089
dyhost server 127.0.0.1:8089 server 127.0.0.1:8088
» curl -i -X DELETE 127.0.0.1:8081/upstream/dyhost success
» curl 127.0.0.1:8081/detail host1 server 127.0.0.1:8088
host2 server 127.0.0.1:8089 ```
c extern ngx_flag_t ngx_http_dyups_api_enable; ngx_int_t ngx_dyups_update_upstream(ngx_str_t *name, ngx_buf_t *buf, ngx_str_t *rv); ngx_int_t ngx_dyups_delete_upstream(ngx_str_t *name, ngx_str_t *rv);
NOTICE: you should add the directive dyups_interface
into your config file to active this feature
```lua contentbylua ' local dyups = require "ngx.dyups"
local status, rv = dyups.update("test", [[server 127.0.0.1:8088;]]);
ngx.print(status, rv)
if status ~= 200 then
ngx.print(status, rv)
return
end
ngx.print("update success")
status, rv = dyups.delete("test")
if status ~= 200 then
ngx.print(status, rv)
return
end
ngx.print("delete success")
';
```