项目背景:
conf >& ${BASE_DIR}nginx/logs/nginx.start
HTTP APIs
You can operate upstreams dynamically with HTTP APIs.
list
$ curl "http://127.0.0.1:6000/dynamic?upstream=zone_for_backends" server 127.0.0.1:6001; server 127.0.0.1:6002; server 127.0.0.1:6003; $
verbose
$ curl "http://127.0.0.1:6000/dynamic?upstream=zone_for_backends&verbose=" server 127.0.0.1:6001 weight=1 max_fails=1 fail_timeout=10; server 127.0.0.1:6002 weight=1 max_fails=1 fail_timeout=10; server 127.0.0.1:6003 weight=1 max_fails=1 fail_timeout=10; $
update_parameters
$ curl "http://127.0.0.1:6000/dynamic?upstream=zone_for_backends&server=127.0.0.1:6003&weight=10&max_fails=5&fail_timeout=5" server 127.0.0.1:6001 weight=1 max_fails=1 fail_timeout=10; server 127.0.0.1:6002 weight=1 max_fails=1 fail_timeout=10; server 127.0.0.1:6003 weight=10 max_fails=5 fail_timeout=5; $
The supported parameters are blow.
- weight
- max_fails
- fail_timeout
down
$ curl "http://127.0.0.1:6000/dynamic?upstream=zone_for_backends&server=127.0.0.1:6003&down=" server 127.0.0.1:6001 weight=1 max_fails=1 fail_timeout=10; server 127.0.0.1:6002 weight=1 max_fails=1 fail_timeout=10; server 127.0.0.1:6003 weight=1 max_fails=1 fail_timeout=10 down; $
up
$ curl "http://127.0.0.1:6000/dynamic?upstream=zone_for_backends&server=127.0.0.1:6003&up=" server 127.0.0.1:6001 weight=1 max_fails=1 fail_timeout=10; server 127.0.0.1:6002 weight=1 max_fails=1 fail_timeout=10; server 127.0.0.1:6003 weight=1 max_fails=1 fail_timeout=10; $
add
$ curl "http://127.0.0.1:6000/dynamic?upstream=zone_for_backends&add=&server=127.0.0.1:6004" server 127.0.0.1:6001; server 127.0.0.1:6002; server 127.0.0.1:6003; server 127.0.0.1:6004; $
remove
server 127.0.0.1:6001;
server 127.0.0.1:6002;
server 127.0.0.1:6004;
restful interface
GET
-
/detail
get all upstreams and their servers -
/list
get the list of upstreams -
/upstream/name
find the upstream by it's name
POST
-
/upstream/name
update one upstream -
body
commands; -
body
server ip:port;
DELETE
-
/upstream/name
delete one upstream
Call 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.
Sample
» curl -H "host: dyhost" 127.0.0.1:8080 <html> <head><title>502 Bad Gateway</title></head> <body bgcolor="white"> <center><h1>502 Bad Gateway</h1></center> <hr><center>nginx/1.3.13</center> </body> </html> » 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
API
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); extern ngx_dyups_add_upstream_filter_pt ngx_dyups_add_upstream_top_filter; extern ngx_dyups_del_upstream_filter_pt ngx_dyups_del_upstream_top_filter;
Lua API Example
NOTICE: you should add the directive dyups_interface
into your config file to active this feature
local dyups = require "ngx.dyups"
local status, rv = dyups.update("test", [[server 127.0.0.1:8088;]]);
ngx.print(status, rv)
if status ~= ngx.HTTP_OK then
ngx.print(status, rv)
return
end
ngx.print("update success")
status, rv = dyups.delete("test")
if status ~= ngx.HTTP_OK then
ngx.print(status, rv)
return
end
ngx.print("delete success")