| There has been a lot of confusion during the development because of the |
| backends and frontends. |
| |
| What we want : |
| |
| - being able to still use a listener as it has always been working |
| |
| - being able to write a rule stating that we will *change* the backend when we |
| match some pattern. Only one jump is allowed. |
| |
| - being able to write a "use_filters_from XXX" line stating that we will ignore |
| any filter in the current listener, and that those from XXX will be borrowed |
| instead. A warning would be welcome for options which will silently get |
| masked. This is used to factor configuration. |
| |
| - being able to write a "use_backend_from XXX" line stating that we will ignore |
| any server and timeout config in the current listener, and that those from |
| XXX will be borrowed instead. A warning would be welcome for options which |
| will silently get masked. This is used to factor configuration. |
| |
| |
| |
| Example : |
| --------- |
| |
| | # frontend HTTP/80 |
| | listen fe_http 1.1.1.1:80 |
| | use_filters_from default_http |
| | use_backend_from appli1 |
| | |
| | # frontend HTTPS/443 |
| | listen fe_https 1.1.1.1:443 |
| | use_filters_from default_https |
| | use_backend_from appli1 |
| | |
| | # frontend HTTP/8080 |
| | listen fe_http-dev 1.1.1.1:8080 |
| | reqadd "X-proto: http" |
| | reqisetbe "^Host: www1" appli1 |
| | reqisetbe "^Host: www2" appli2 |
| | reqisetbe "^Host: www3" appli-dev |
| | use_backend_from appli1 |
| | |
| | |
| | # filters default_http |
| | listen default_http |
| | reqadd "X-proto: http" |
| | reqisetbe "^Host: www1" appli1 |
| | reqisetbe "^Host: www2" appli2 |
| | |
| | # filters default_https |
| | listen default_https |
| | reqadd "X-proto: https" |
| | reqisetbe "^Host: www1" appli1 |
| | reqisetbe "^Host: www2" appli2 |
| | |
| | |
| | # backend appli1 |
| | listen appli1 |
| | reqidel "^X-appli1:.*" |
| | reqadd "Via: appli1" |
| | balance roundrobin |
| | cookie app1 |
| | server srv1 |
| | server srv2 |
| | |
| | # backend appli2 |
| | listen appli2 |
| | reqidel "^X-appli2:.*" |
| | reqadd "Via: appli2" |
| | balance roundrobin |
| | cookie app2 |
| | server srv1 |
| | server srv2 |
| | |
| | # backend appli-dev |
| | listen appli-dev |
| | reqadd "Via: appli-dev" |
| | use_backend_from appli2 |
| | |
| | |
| |
| |
| Now we clearly see multiple things : |
| ------------------------------------ |
| |
| - a frontend can EITHER have filters OR reference a use_filter |
| |
| - a backend can EITHER have servers OR reference a use_backend |
| |
| - we want the evaluation to cross TWO levels per request. When a request is |
| being processed, it keeps track of its "frontend" side (where it came |
| from), and of its "backend" side (where the server-side parameters have |
| been found). |
| |
| - the use_{filters|backend} have nothing to do with how the request is |
| decomposed. |
| |
| |
| Conclusion : |
| ------------ |
| |
| - a proxy is always its own frontend. It also has 2 parameters : |
| - "fi_prm" : pointer to the proxy holding the filters (itself by default) |
| - "be_prm" : pointer to the proxy holding the servers (itself by default) |
| |
| - a request has a frontend (fe) and a backend (be). By default, the backend |
| is initialized to the frontend. Everything related to the client side is |
| accessed through ->fe. Everything related to the server side is accessed |
| through ->be. |
| |
| - request filters are first called from ->fe then ->be. Since only the |
| filters can change ->be, it is possible to iterate the filters on ->be |
| only and stop when ->be does not change anymore. |
| |
| - response filters are first called from ->be then ->fe IF (fe != be). |
| |
| |
| When we parse the configuration, we immediately configure ->fi and ->be for |
| all proxies. |
| |
| Upon session creation, s->fe and s->be are initialized to the proxy. Filters |
| are executed via s->fe->fi_prm and s->be->fi_prm. Servers are found in |
| s->be->be_prm. |
| |