[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:
parent
1ba6a73594
commit
d1142aa073
27
doc/design-thoughts/backends-v0.txt
Normal file
27
doc/design-thoughts/backends-v0.txt
Normal 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.
|
74
doc/design-thoughts/be-fe-changes.txt
Normal file
74
doc/design-thoughts/be-fe-changes.txt
Normal 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.
|
117
doc/design-thoughts/config-language.txt
Normal file
117
doc/design-thoughts/config-language.txt
Normal 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:"/"
|
||||||
|
|
101
doc/design-thoughts/cttproxy-changes.txt
Normal file
101
doc/design-thoughts/cttproxy-changes.txt
Normal 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)
|
||||||
|
|
13
doc/design-thoughts/sess_par_sec.txt
Normal file
13
doc/design-thoughts/sess_par_sec.txt
Normal 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))
|
||||||
|
|
||||||
|
|
44
doc/internals/connection-scale.txt
Normal file
44
doc/internals/connection-scale.txt
Normal 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 ?
|
||||||
|
|
||||||
|
|
92
doc/internals/header-parser-speed.txt
Normal file
92
doc/internals/header-parser-speed.txt
Normal 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
|
20
doc/internals/repartition-be-fe-fi.txt
Normal file
20
doc/internals/repartition-be-fe-fi.txt
Normal 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 -
|
||||||
|
|
5
doc/internals/todo.cttproxy
Normal file
5
doc/internals/todo.cttproxy
Normal 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
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user