[DOC] imported lots of internal documentations

Those documentations provide nothing to users nor contributors
but at least now I know where they are.
This commit is contained in:
Willy Tarreau 2007-01-07 13:03:59 +01:00
parent 1ba6a73594
commit d1142aa073
14 changed files with 493 additions and 0 deletions

View File

@ -0,0 +1,27 @@
1 type générique "entité", avec les attributs suivants :
- frontend *f
- l7switch *s
- backend *b
des types spécifiques sont simplement des entités avec certains
de ces champs remplis et pas forcément tous :
listen = f [s] b
frontend = f [s]
l7switch = s
backend = [s] b
Ensuite, les traitements sont évalués dans l'ordre :
- listen -> s'il a des règles de l7, on les évalue, et potentiellement on branche vers d'autres listen, l7 ou back, ou on travaille avec le back local.
- frontend -> s'il a des règles de l7, on les évalue, et potentiellement on branche vers d'autres listen, l7 ou back
- l7switch -> on évalue ses règles, potentiellement on branche vers d'autres listen, l7 ou backends
- backend -> s'il a des règles l7, on les évalue (quitte à changer encore de backend) puis on traite.
Les requêtes sont traitées dans l'ordre des chaînages f->s*->b, et les réponses doivent être
traitées dans l'ordre inverse b->s*->f. Penser aux réécritures de champs Host à l'aller et
Location en retour.
D'autre part, prévoir des "profils" plutôt que des blocs de nouveaux paramètres par défaut.
Ca permettra d'avoir plein de jeux de paramètres par défaut à utiliser dans chacun de ces
types.

View File

@ -0,0 +1,74 @@
- PR_O_TRANSP => FE !!! devra peut-être changer vu que c'est un complément du mode dispatch.
- PR_O_NULLNOLOG => FE
- PR_O_HTTP_CLOSE => FE. !!! mettre BE aussi !!!
- PR_O_TCP_CLI_KA => FE
- PR_O_FWDFOR => BE. FE aussi ?
- PR_O_FORCE_CLO => BE
- PR_O_PERSIST => BE
- PR_O_COOK_RW, PR_O_COOK_INS, PR_O_COOK_PFX, PR_O_COOK_POST => BE
- PR_O_COOK_NOC, PR_O_COOK_IND => BE
- PR_O_ABRT_CLOSE => BE
- PR_O_REDISP => BE
- PR_O_BALANCE, PR_O_BALANCE_RR, PR_O_BALANCE_SH => BE
- PR_O_CHK_CACHE => BE
- PR_O_TCP_SRV_KA => BE
- PR_O_BIND_SRC => BE
- PR_O_TPXY_MASK => BE
- PR_MODE_TCP : BE côté serveur, FE côté client
- nbconn -> fe->nbconn, be->nbconn.
Pb: rendre impossible le fait que (fe == be) avant de faire ça,
sinon on va compter les connexions en double. Ce ne sera possible
que lorsque les FE et BE seront des entités distinctes. On va donc
commencer par laisser uniquement fe->nbconn (vu que le fe ne change
pas), et modifier ceci plus tard, ne serait-ce que pour prendre en
compte correctement les minconn/maxconn.
=> solution : avoir beconn et feconn dans chaque proxy.
- failed_conns, failed_secu (réponses bloquées), failed_resp... : be
Attention: voir les cas de ERR_SRVCL, il semble que parfois on
indique ça alors qu'il y a un write error côté client (ex: ligne
2044 dans proto_http).
=> be et pas be->beprm
- logs du backup : ->be (idem)
- queue : be
- logs/debug : srv toujours associé à be (ex: proxy->id:srv->id). Rien
pour le client pour le moment. D'une manière générale, les erreurs
provoquées côté serveur vont sur BE et celles côté client vont sur
FE.
- logswait & LW_BYTES : FE (puisqu'on veut savoir si on logue tout de suite)
- messages d'erreurs personnalisés (errmsg, ...) -> fe
- monitor_uri -> fe
- uri_auth -> (fe->firpm puis be->fiprm). Utilisation de ->be
- req_add, req_exp => fe->fiprm, puis be->fiprm
- req_cap, rsp_cap -> fe->fiprm
- rsp_add, rsp_exp => be->fiprm, devrait être fait ensuite aussi sur fe->fiprm
- capture_name, capture_namelen : fe->fiprm
Ce n'est pas la solution idéale, mais au moins la capture et configurable
par les filtres du FE et ne bouge pas lorsque le BE est réassigné. Cela
résoud aussi un pb d'allocation mémoire.
- persistance (appsessions, cookiename, ...) -> be
- stats:scope "." = fe (celui par lequel on arrive)
!!!ERREUR!!! => utiliser be pour avoir celui qui a été validé par
l'uri_auth.
--------- corrections à effectuer ---------
- remplacement de headers : parser le header et éventuellement le supprimer puis le(les) rajouter.
- session->proto.{l4state,l7state,l7substate} pour CLI et SRV
- errorloc : si définie dans backend, la prendre, sinon dans front.
- logs : faire be sinon fe.

View File

@ -0,0 +1,117 @@
Prévoir des commandes en plusieurs mots clés.
Par exemple :
timeout connection XXX
connection scale XXX
On doit aussi accepter les préfixes :
tim co XXX
co sca XXX
Prévoir de ranger les combinaisons dans un tableau. On doit même
pouvoir effectuer un mapping simplifiant le parseur.
Pour les filtres :
<direction> <where> <what> <operator> <pattern> <action> [ <args>* ]
<direction> = [ req | rsp ]
<where> = [ in | out ]
<what> = [ line | LINE | METH | URI | h(hdr) | H(hdr) | c(cookie) | C(cookie) ]
<operator> = [ == | =~ | =* | =^ | =/ | != | !~ | !* | !^ | !/ ]
<pattern> = "<string>"
<action> = [ allow | permit | deny | delete | replace | switch | add | set | redir ]
<args> = optionnal action args
exemples:
req in URI =^ "/images" switch images
req in h(host) =* ".mydomain.com" switch mydomain
req in h(host) =~ "localhost(.*)" replace "www\1"
alternative :
<direction> <where> <action> [not] <what> [<operator> <pattern> [ <args>* ]]
req in switch URI =^ "/images" images
req in switch h(host) =* ".mydomain.com" mydomain
req in replace h(host) =~ "localhost(.*)" "www\1"
req in delete h(Connection)
req in deny not line =~ "((GET|HEAD|POST|OPTIONS) /)|(OPTIONS *)"
req out set h(Connection) "close"
req out add line "Server: truc"
<direction> <action> <where> [not] <what> [<operator> <pattern> [ <args>* ]] ';' <action2> <what2>
req in switch URI =^ "/images/" images ; replace "/"
req in switch h(host) =* ".mydomain.com" mydomain
req in replace h(host) =~ "localhost(.*)" "www\1"
req in delete h(Connection)
req in deny not line =~ "((GET|HEAD|POST|OPTIONS) /)|(OPTIONS *)"
req out set h(Connection) "close"
req out add line == "Server: truc"
Extension avec des ACL :
req in acl(meth_valid) METH =~ "(GET|POST|HEAD|OPTIONS)"
req in acl(meth_options) METH == "OPTIONS"
req in acl(uri_slash) URI =^ "/"
req in acl(uri_star) URI == "*"
req in deny acl !(meth_options && uri_star || meth_valid && uri_slash)
Peut-être plus simplement :
acl meth_valid METH =~ "(GET|POST|HEAD|OPTIONS)"
acl meth_options METH == "OPTIONS"
acl uri_slash URI =^ "/"
acl uri_star URI == "*"
req in deny not acl(meth_options uri_star, meth_valid uri_slash)
req in switch URI =^ "/images/" images ; replace "/"
req in switch h(host) =* ".mydomain.com" mydomain
req in replace h(host) =~ "localhost(.*)" "www\1"
req in delete h(Connection)
req in deny not line =~ "((GET|HEAD|POST|OPTIONS) /)|(OPTIONS *)"
req out set h(Connection) "close"
req out add line == "Server: truc"
Prévoir le cas du "if" pour exécuter plusieurs actions :
req in if URI =^ "/images/" then replace "/" ; switch images
Utiliser les noms en majuscules/minuscules pour indiquer si on veut prendre
en compte la casse ou non :
if uri =^ "/watch/" setbe watch rebase "/watch/" "/"
if uri =* ".jpg" setbe images
if uri =~ ".*dll.*" deny
if HOST =* ".mydomain.com" setbe mydomain
etc...
Another solution would be to have a dedicated keyword to URI remapping. It
would both rewrite the URI and optionally switch to another backend.
uriremap "/watch/" "/" watch
uriremap "/chat/" "/" chat
uriremap "/event/" "/event/" event
Or better :
uriremap "/watch/" watch "/"
uriremap "/chat/" chat "/"
uriremap "/event/" event
For the URI, using a regex is sometimes useful (eg: providing a set of possible prefixes.
Sinon, peut-être que le "switch" peut prendre un paramètre de mapping pour la partie matchée :
req in switch URI =^ "/images/" images:"/"

View File

@ -0,0 +1,101 @@
Nécessite CAP_NET_ADMIN (12)
On peut donc aussi mettre CAP_NET_BIND_SERVICE (10) pour autoriser les ports < 1024
charger le module :
# modprobe ip_conntrack hashsize=65536
# modprobe iptable_tproxy hashsize=65536
# echo 15 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_time_wait
# echo 30 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_fin_wait
Si on utilise "usesrc client", alors on rencontre ce problème en cas
de réutilisation d'un port :
# dmesg
IP_TPROXY: error applying NAT mapping, hooknum=4 0103000a:e5a2 -> 05000001:d204
IP_TPROXY: error applying NAT mapping, hooknum=4 0103000a:e5a2 -> 05000001:d204
Solution retenue pour la configuration :
You have to write "usesrc XXXX" on the "source" line. "XXXX" is either
an IP address or the keyword "clientip" to reuse the client's IP with
a dynamically allocated port, or "client" to reuse both the client's IP
and port (dangerous). But due to the way cttproxy works, the source address
is mandatory. Eg:
backend static
source 192.168.1.254 usesrc clientip
server static1 192.168.1.10 source 192.168.1.254 usesrc clientip
---- Anciennes réflexions ----
Il faudrait donc peut-être toujours avoir un port dynamique, ou bien
traiter le TIME_WAIT correctement en appliquant natdel => corrige pratiquement
toujours le problème (mais réduire les timeouts semble important)
source 10.1.2.3 present 10.2.3.4
source 10.1.2.3 present same_ip
source 10.1.2.3 present same
source 10.1.2.3:5000 present same
source 10.1.2.3 appear_as 10.2.3.4
source 10.1.2.3 appear_as same_ip
source 10.1.2.3 appear_as same
source 10.1.2.3:5000 appear_as same
source 10.1.2.3 {keepsrc | keepip | usesrc 1.2.3.4}
source 10.1.2.3 snat { client | clientip | 1.2.3.4 }
source 10.1.2.3 extbind same
source 10.1.2.3 intercept same
source 10.1.2.3 spoof same
source 10.1.2.3 showsrc same
source 10.1.2.3 usesrc same
source 10.1.2.3 setsrc same
source 10.1.2.3 withsrc same
source 10.1.2.3 usesrc clientip:sameport
source 10.1.2.3 alias same
source 10.1.2.3 as same
source 10.1.2.3 outgoing same
source 10.1.2.3 public same
source 10.1.2.3:5000 pretend same
source 10.1.2.3=same
source 10.1.2.3=10.2.3.4
source 10.1.2.3^same
source 10.1.2.3^10.2.3.4
source 10.1.2.3@same
source 10.1.2.3@10.2.3.4
source 10.1.2.3!same
source 10.1.2.3!10.2.3.4
source 10.1.2.3|same
source 10.1.2.3|10.2.3.4
source 10.1.2.3(same)
source 10.1.2.3(10.2.3.4)
source 10.1.2.3~same
source 10.1.2.3~10.2.3.4
A l'inverse, si "source" contient l'adresse vue :
source same bindto 1.2.3.4
source 2.3.4.5 bindto 1.2.3.4
Problème: si "bindto" est oublié, le bind sur 2.3.4.5 ne fonctionnera pas.
Pour l'adresse de listen (avec "bind"), il serait bien que l'adresse
translatée apparaisse au même niveau que l'IP afin que les plages et
listes continuent de fonctionner par association.
Différences entre source et bind :
- source: 1 seule IP source, éventuellement un port, plus tard une plage
- bind : liste de (IP source facultatives, port obligatoire, parfois une plage)

View File

@ -0,0 +1,13 @@
Graphe des nombres de traitements par seconde unité de temps avec
- un algo linéaire et très peu coûteux unitairement (0.01 ut)
- un algo en log(2) et 5 fois plus coûteux (0.05 ut)
set yrange [0:1]
plot [0:1000] 1/(1+0.01*x), 1/(1+0.05*log(x+1)/log(2))
Graphe de la latence induite par ces traitements en unités de temps :
set yrange [0:1000]
plot [0:1000] x/(1+0.01*x), x/(1+0.05*log(x+1)/log(2))

View File

@ -0,0 +1,44 @@
Problème des connexions simultanées avec un backend
Pour chaque serveur, 3 cas possibles :
- pas de limite (par défaut)
- limite statique (maxconn)
- limite dynamique (maxconn/(ratio de px->conn), avec minconn)
On a donc besoin d'une limite sur le proxy dans le cas de la limite
dynamique, afin de fixer un seuil et un ratio. Ce qui compte, c'est
le point après lequel on passe d'un régime linéaire à un régime
saturé.
On a donc 3 phases :
- régime minimal (0..srv->minconn)
- régime linéaire (srv->minconn..srv->maxconn)
- régime saturé (srv->maxconn..)
Le minconn pourrait aussi ressortir du serveur ?
En pratique, on veut :
- un max par serveur
- un seuil global auquel les serveurs appliquent le max
- un seuil minimal en-dessous duquel le nb de conn est
maintenu. Cette limite a un sens par serveur (jamais moins de X conns)
mais aussi en global (pas la peine de faire du dynamique en dessous de
X conns à répartir). La difficulté en global, c'est de savoir comment
on calcule le nombre min associé à chaque serveur, vu que c'est un ratio
défini à partir du max.
Ca revient à peu près à la même chose que de faire 2 états :
- régime linéaire avec un offset (srv->minconn..srv->maxconn)
- régime saturé (srv->maxconn..)
Sauf que dans ce cas, le min et le max sont bien par serveur, et le seuil est
global et correspond à la limite de connexions au-delà de laquel on veut
tourner à plein régime sur l'ensemble des serveurs. On peut donc parler de
passage en mode "full", "saturated", "optimal". On peut également parler de
la fin de la partie "scalable", "dynamique".
=> fullconn 1000 par exemple ?

View File

@ -0,0 +1,92 @@
TEST 3:
printf "GET /\r\nbla: truc\r\n\r\n"
NO SPEEDUP :
WHL: hdr_st=0x00, hdr_used=1 hdr_tail=0 hdr_last=1, h=0x8071080, lr=0x8071080, r=0x8071094
WHL: hdr_st=0x01, hdr_used=1 hdr_tail=0 hdr_last=1, h=0x8071080, lr=0x8071080, r=0x8071094
WHL: hdr_st=0x32, hdr_used=1 hdr_tail=0 hdr_last=1, h=0x8071080, lr=0x8071086, r=0x8071094
WHL: hdr_st=0x03, hdr_used=2 hdr_tail=1 hdr_last=2, h=0x8071087, lr=0x8071087, r=0x8071094
WHL: hdr_st=0x34, hdr_used=2 hdr_tail=1 hdr_last=2, h=0x8071087, lr=0x8071091, r=0x8071094
WHL: hdr_st=0x03, hdr_used=3 hdr_tail=2 hdr_last=3, h=0x8071092, lr=0x8071092, r=0x8071094
WHL: hdr_st=0x34, hdr_used=3 hdr_tail=2 hdr_last=3, h=0x8071092, lr=0x8071093, r=0x8071094
WHL: hdr_st=0x06, hdr_used=3 hdr_tail=2 hdr_last=3, h=0x8071092, lr=0x8071093, r=0x8071094
END: hdr_st=0x06, hdr_used=3 hdr_tail=2 hdr_last=3, h=0x8071092, lr=0x8071094, r=0x8071094
=> 9 trans
FULL SPEEDUP :
WHL: hdr_st=0x00, hdr_used=1 hdr_tail=0 hdr_last=1, h=0x806a770, lr=0x806a770, r=0x806a784
WHL: hdr_st=0x32, hdr_used=1 hdr_tail=0 hdr_last=1, h=0x806a770, lr=0x806a776, r=0x806a784
WHL: hdr_st=0x03, hdr_used=2 hdr_tail=1 hdr_last=2, h=0x806a777, lr=0x806a777, r=0x806a784
WHL: hdr_st=0x34, hdr_used=2 hdr_tail=1 hdr_last=2, h=0x806a777, lr=0x806a781, r=0x806a784
WHL: hdr_st=0x26, hdr_used=3 hdr_tail=2 hdr_last=3, h=0x806a782, lr=0x806a783, r=0x806a784
END: hdr_st=0x06, hdr_used=3 hdr_tail=2 hdr_last=3, h=0x806a782, lr=0x806a784, r=0x806a784
=> 6 trans
TEST 4:
printf "GET /\nbla: truc\n\n"
NO SPEEDUP :
WHL: hdr_st=0x00, hdr_used=1 hdr_tail=0 hdr_last=1, h=0x80750d0, lr=0x80750d0, r=0x80750e1
WHL: hdr_st=0x01, hdr_used=1 hdr_tail=0 hdr_last=1, h=0x80750d0, lr=0x80750d0, r=0x80750e1
WHL: hdr_st=0x02, hdr_used=1 hdr_tail=0 hdr_last=1, h=0x80750d0, lr=0x80750d5, r=0x80750e1
WHL: hdr_st=0x03, hdr_used=2 hdr_tail=1 hdr_last=2, h=0x80750d6, lr=0x80750d6, r=0x80750e1
WHL: hdr_st=0x04, hdr_used=2 hdr_tail=1 hdr_last=2, h=0x80750d6, lr=0x80750df, r=0x80750e1
WHL: hdr_st=0x03, hdr_used=3 hdr_tail=2 hdr_last=3, h=0x80750e0, lr=0x80750e0, r=0x80750e1
WHL: hdr_st=0x04, hdr_used=3 hdr_tail=2 hdr_last=3, h=0x80750e0, lr=0x80750e0, r=0x80750e1
WHL: hdr_st=0x06, hdr_used=3 hdr_tail=2 hdr_last=3, h=0x80750e0, lr=0x80750e0, r=0x80750e1
END: hdr_st=0x06, hdr_used=3 hdr_tail=2 hdr_last=3, h=0x80750e0, lr=0x80750e1, r=0x80750e1
=> 9 trans
FULL SPEEDUP :
WHL: hdr_st=0x00, hdr_used=1 hdr_tail=0 hdr_last=1, h=0x8072010, lr=0x8072010, r=0x8072021
WHL: hdr_st=0x03, hdr_used=2 hdr_tail=1 hdr_last=2, h=0x8072016, lr=0x8072016, r=0x8072021
END: hdr_st=0x06, hdr_used=3 hdr_tail=2 hdr_last=3, h=0x8072020, lr=0x8072021, r=0x8072021
=> 3 trans
TEST 5:
printf "GET /\r\nbla: truc\r\n truc2\r\n\r\n"
NO SPEEDUP :
WHL: hdr_st=0x00, hdr_used=1 hdr_tail=0 hdr_last=1, h=0x8071080, lr=0x8071080, r=0x807109d
WHL: hdr_st=0x01, hdr_used=1 hdr_tail=0 hdr_last=1, h=0x8071080, lr=0x8071080, r=0x807109d
WHL: hdr_st=0x32, hdr_used=1 hdr_tail=0 hdr_last=1, h=0x8071080, lr=0x8071086, r=0x807109d
WHL: hdr_st=0x03, hdr_used=2 hdr_tail=1 hdr_last=2, h=0x8071087, lr=0x8071087, r=0x807109d
WHL: hdr_st=0x34, hdr_used=2 hdr_tail=1 hdr_last=2, h=0x8071087, lr=0x8071091, r=0x807109d
WHL: hdr_st=0x05, hdr_used=2 hdr_tail=1 hdr_last=2, h=0x8071087, lr=0x8071092, r=0x807109d
WHL: hdr_st=0x03, hdr_used=2 hdr_tail=1 hdr_last=2, h=0x8071087, lr=0x8071094, r=0x807109d
WHL: hdr_st=0x34, hdr_used=2 hdr_tail=1 hdr_last=2, h=0x8071087, lr=0x807109a, r=0x807109d
WHL: hdr_st=0x03, hdr_used=3 hdr_tail=2 hdr_last=3, h=0x807109b, lr=0x807109b, r=0x807109d
WHL: hdr_st=0x34, hdr_used=3 hdr_tail=2 hdr_last=3, h=0x807109b, lr=0x807109c, r=0x807109d
WHL: hdr_st=0x06, hdr_used=3 hdr_tail=2 hdr_last=3, h=0x807109b, lr=0x807109c, r=0x807109d
END: hdr_st=0x06, hdr_used=3 hdr_tail=2 hdr_last=3, h=0x807109b, lr=0x807109d, r=0x807109d
=> 12 trans
FULL SPEEDUP :
WHL: hdr_st=0x00, hdr_used=1 hdr_tail=0 hdr_last=1, h=0x806dfc0, lr=0x806dfc0, r=0x806dfdd
WHL: hdr_st=0x32, hdr_used=1 hdr_tail=0 hdr_last=1, h=0x806dfc0, lr=0x806dfc6, r=0x806dfdd
WHL: hdr_st=0x03, hdr_used=2 hdr_tail=1 hdr_last=2, h=0x806dfc7, lr=0x806dfc7, r=0x806dfdd
WHL: hdr_st=0x34, hdr_used=2 hdr_tail=1 hdr_last=2, h=0x806dfc7, lr=0x806dfd1, r=0x806dfdd
WHL: hdr_st=0x34, hdr_used=2 hdr_tail=1 hdr_last=2, h=0x806dfc7, lr=0x806dfda, r=0x806dfdd
WHL: hdr_st=0x26, hdr_used=3 hdr_tail=2 hdr_last=3, h=0x806dfdb, lr=0x806dfdc, r=0x806dfdd
END: hdr_st=0x06, hdr_used=3 hdr_tail=2 hdr_last=3, h=0x806dfdb, lr=0x806dfdd, r=0x806dfdd
=> 7 trans

View File

@ -0,0 +1,20 @@
- session : ajouter ->fiprm et ->beprm comme raccourcis
- px->maxconn: ne s'applique qu'au FE. Pour le BE, on utilise fullconn,
initialisé par défaut à la même chose que maxconn.
\ from: proxy session server actuellement
field \
rules px->fiprm sess->fiprm -
srv,cookies px->beprm sess->beprm srv->px
options(log) px-> sess->fe -
options(fe) px-> sess->fe -
options(be) px->beprm sess->beprm srv->px
captures px-> sess->fe - ->fiprm
logs px-> sess->fe srv->px
errorloc px-> sess->beprm|fe -
maxconn px-> sess->fe - ->be
fullconn px-> sess->beprm srv->px -

View File

@ -0,0 +1,5 @@
- check TPROXY_VERSION if lstchk_tproxy
- check capabilities for CAP_NET_ADMIN if lstchk_tproxy
- add capabilities support to the global conf (cap_bind_service)
- add support for non-local listen address