"http-request capture" and "http-response capture".
-default-server [from <origin>] [param*]
- Change default options for a server in a backend
+default-server [name <name>] [from <origin>] [param*]
+ Changes a set of options reusable for future server declarations.
May be used in the following contexts: tcp, http
yes | no | yes | yes
Arguments:
+ <name> specifies a named default-instance instead of the default
+ anonymous one.
+
<origin> instructs to reinitialize first the set of options to their
default values and then reusing the settings from the designated
server or default-server instance. See section 5.2 about server
Example :
default-server inter 1000 weight 13
- Multiple default-server lines can be specified in the same backend with each
- new line completing the previous one. This set of options can be reset by
- using the "from none" keyword value.
+ Several sets of options can be defined per backend instance. A backend always
+ contains an unnamed default-server which is selected when <name> argument is
+ not present. A named default-server can be created by specifying the <name>
+ argument with a value. This name must not collide with servers in the same
+ backend.
+
+ The same default-server can be defined over multiple lines, with each line
+ completing the previous one. This set of options can be reset by using the
+ "from none" keyword value.
- A default-server with no parameter set will automatically be purged after
- parsing. As such, a final "default-server from none" statement will be
+ An unnamed default-server with no parameter set will automatically be purged
+ after parsing. As such, a final "default-server from none" statement will be
sufficient to release this unused memory, regardless of the global setting
"tune.defaults.purge" value.
its settings.
server <name> <address>[:port] [from <origin>] [settings ...]
- default-server [from <origin>] [settings ...]
+ default-server [name <name>] [from <origin>] [settings ...]
from <origin>
Preinitialize the server settings by copying values from another server or
#endif
struct list servers; /* servers present in current backend */
struct server *defsrv; /* default server configuration */
+ struct ceb_root *defsrv_by_name; /* named default servers */
struct lbprm lbprm; /* load-balancing parameters */
int srv_act, srv_bck; /* # of servers eligible for LB (UP|!checked) AND (enabled+weight!=0) */
int load_server_state_from_file; /* location of the file containing server state.
struct proxy *defpx;
struct list *init_proxies_list = NULL;
struct stktable *t;
- struct server *newsrv = NULL;
+ struct server *newsrv = NULL, *defsrv;
struct mt_list back;
int err_code = 0;
/* Value forced to skip '1' due to an historical bug, see below for more details. */
cfgerr++;
}
- /* Remove default-server if tune.defaults.purge is set for it. */
+ /* Remove default-server instances if tune.defaults.purge is set for it. */
if (curproxy->cap & PR_CAP_BE && (global.tune.options & GTUNE_PURGE_DEF_SRV)) {
+ /* remove unnamed default server */
if (curproxy->defsrv) {
srv_free_params(curproxy->defsrv);
srv_free(&curproxy->defsrv);
}
+
+ /* also removed named default servers */
+ while ((defsrv = cebuis_item_first(&curproxy->defsrv_by_name, conf.name_node, id, struct server))) {
+ cebuis_item_delete(&curproxy->defsrv_by_name, conf.name_node, id, defsrv);
+ srv_free_params(defsrv);
+ srv_free(&defsrv);
+ }
}
if (curproxy->flags & PR_FL_DISABLED) {
void deinit_proxy(struct proxy *p)
{
struct server *s, *s_back;
+ struct server *defsrv;
struct cap_hdr *h,*h_next;
struct listener *l,*l_next;
struct bind_conf *bind_conf, *bind_back;
srv_free(&p->defsrv);
}
+ while ((defsrv = cebuis_item_first(&p->defsrv_by_name, conf.name_node, id, struct server))) {
+ cebuis_item_delete(&p->defsrv_by_name, conf.name_node, id, defsrv);
+ srv_free_params(defsrv);
+ srv_free(&defsrv);
+ }
+
if (p->lbprm.ops && p->lbprm.ops->proxy_deinit)
p->lbprm.ops->proxy_deinit(p);
* executed for defaults section as this may still be useful.
*/
if ((curproxy->cap & PR_CAP_LISTEN) && !(curproxy->cap & PR_CAP_DEF)) {
- /* Default-server is removed if it does not define specific setting. */
+ /* Unnamed default-server is removed if it does not define specific setting. */
if (curproxy->defsrv && !(curproxy->defsrv->flags & SRV_F_UMODIFIED)) {
srv_free_params(curproxy->defsrv);
srv_free(&curproxy->defsrv);
HA_SPIN_INIT(&newsrv->lock);
}
else {
- /* This is a "default-server" line. Let's make certain the
- * current proxy's default server exists, otherwise it's
- * time to allocate it now.
- */
- newsrv = curproxy->defsrv;
+ char *name;
+
+ /* Parse optional "name" default-server keyword. */
+ if (*args[1] && strcmp(args[1], "name") == 0) {
+ if (!*args[2]) {
+ ha_alert("default-server name: missing value.\n");
+ err_code |= ERR_ALERT | ERR_FATAL;
+ goto out;
+ }
+
+ *cur_arg = 3;
+ name = strdup(args[2]);
+ if (!name) {
+ ha_alert("out of memory.\n");
+ err_code |= ERR_ALERT | ERR_FATAL;
+ goto out;
+ }
+
+ /* Retrieve default-server by its name. */
+ newsrv = cebuis_item_lookup(&curproxy->defsrv_by_name,
+ conf.name_node, id, name,
+ struct server);
+ }
+ else {
+ /* unnamed default-server instance */
+ *cur_arg = 1;
+ name = NULL;
+ newsrv = curproxy->defsrv;
+ }
+
if (!newsrv) {
+ /* Allocate non-existing yet default-server instance. */
+ struct server *srv_other;
+
+ if (name && (srv_other = server_find_by_name(curproxy, name))) {
+ ha_alert("default-server name '%s' conflicts with server defined at line %d.\n",
+ name, srv_other->conf.line);
+ err_code |= ERR_ALERT | ERR_ABORT;
+ goto out;
+ }
+
newsrv = srv_alloc();
if (!newsrv) {
ha_alert("out of memory.\n");
err_code |= ERR_ALERT | ERR_ABORT;
goto out;
}
- newsrv->id = NULL;
+ newsrv->id = name;
srv_settings_init(newsrv);
- curproxy->defsrv = newsrv;
+
+ if (newsrv->id) {
+ cebuis_item_insert(&curproxy->defsrv_by_name,
+ conf.name_node, id, newsrv);
+ }
+ else {
+ curproxy->defsrv = newsrv;
+ }
}
*srv = newsrv;
- *cur_arg = 1;
}
free(fqdn);
*from = srv;
}
else if (!(parse_flags & SRV_PARSE_DYNAMIC)) {
- /* Reuses the default-server in the current proxy when parsing configuration files. */
+ /* Reuses the unnamed default-server in the same proxy
+ * for servers declared in the configuration files.
+ */
*from = curproxy->defsrv;
}
else {