File: TODO

package info (click to toggle)
haproxy 1.3.15.2-2%2Blenny2
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 2,780 kB
  • ctags: 2,264
  • sloc: ansic: 21,832; perl: 543; sh: 407; makefile: 339; xml: 124
file content (181 lines) | stat: -rw-r--r-- 6,991 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
* x-forwarded-for
* implmenter l'option "log global" au niveau proxy pour utiliser les logs
  globaux.
* matching case-insensitive
* implmenter outgoing addr
* loguer t_cnx, t_data, t_total
+ factoriser la fonction de log (send_log = send_syslog+warning+alert)
+ dsactivation du keep-alive (suppression des ^Connection: et ajout des Connection: close)
  -> 4 lignes (2 del, 2 add) suffisent.
+ ne pas loguer certaines adresses IP sources
  -> pour les health-checks uniquement -> pas de log pour les requtes
     vides (option dontlognull)
- mesurer le tps consomm entre deux select, et fournir la conso CPU :
  %cpu = 100 * (tpreselect(n+1)-tpostselect(n)) / (tpreselect(n+1)-tpreselect(n))
* implmenter limitation fd dans la conf : setrlimit(RLIMIT_NOFILE, ...)
- implmenter core/no-core dans la conf : setrlimit(RLIMIT_CORE, ...)
- optimiser les regex pour acclrer les matches :
  - compter les matches
  - si match(n) & ([n].cpt > [n-1].cpt) & ([n].action == [n-1].action), swap(n,n-1)
  - rgulirement, diviser tous les compteurs (lors d'un dpassement par exemple)
- filtrage sur l'adresse IP source, et stocker le pointeur sur la dernire regex
  matche dans la "session" pour acclrer les regex.
- gestion keep-alive

+ handle parametrable HTTP health-checks replies
- differentiate http headers and http uris
- support environment variables in config file
- support keep-alive
- support SSL

===================== demandes ==========================
ok> 1) coute sur une plage de ports :
ok>   listen XXX 1.2.3.4:21000-21060
ok> 
ok> 2) coutes multiples :
ok>   listen XXX 1.2.3.4:21000
ok>   bind 2.3.4.5:21001
ok>   bind 2.3.4.5:21000-21060
ok> 
ok> => on en arrive  ceci :
ok> 
ok> listen XXX [ address:port ]
ok>    bind addr:plage-port[,[addr:]plage-port]*
ok>    bind ...
ok>    ...
ok> 
ok>    => proxy->listen_fd et proxy->listen_addr doivent tre
ok> 	  mis dans des listes
ok>    => OK pour listen, implmenter le BIND.
ok> 
ok> 3) reconnexion sur le mme port sur le serveur :
ok> 
ok>    server XXX 1.2.3.4[:port]
ok>    si <port> n'est pas spcifi, on utilise le mme port que celui qui a reu
ok>    la connexion. Dans ce cas, il faut pouvoir forcer le port du health-check
ok>    par un nouveau parametre "port".
ok> 
ok> => a permet les forwardings de plages :
ok> 
ok> listen XXX
ok>    bind 1.2.3.4:10000-11000
ok>    server 1.2.3.5
ok> 
4) paramtres par dfaut :
   crer une section "defaults" qui prcise les paramtres par dfaut pour les
   sections suivantes, concernant les paramtres suivants :
     ok- les logs
     ok- les modes (tcp/http)
     ok- le balancing (round-robin/source)
     ok- les time-outs
     ok- maxconn
     ok- redisp
     ok- les options
     ok- le retry
     ok- les checks
     ok- les cookies/captures
       - les options des serveurs ?
       - les filtres et regex ?

*  implmenter "balance source" pour faire un hash sur la source.
   permettre de spcifier un masque sur lequel s'applique le hachage,
   ainsi qu'une option pour hacher en fonction de l'adresse dans le
   champ "x-forwarded-for". Problme pour le support des pannes: ce
   type de hash est utile l o la persistence par cookie ne peut pas
   s'appliquer, donc comment faire pour assurer un maximum de persistence
   en cas de panne ?

6) possibilit d'un process spar par listen :
   listen XXX
      fork [ group_id ]

   le fait de spcifier group_id fera que toutes les instances utilisant le
   mme identifiant de groupe seront gres par un mme processus.

   -> plus souple et plus comprhensible de faire des sections par processus,
      ce qui rsoud galement le cas ci-dessous. Ex:
   process_group X
      nbproc X
      uid X
      chroot X
      listen ...

7) grer un chroot/uid/gid diffrents par process :
   listen XXX
      chroot /truc
      uid 123
      gid 456

8) beaucoup de paramtres pourraient tre spcifiques aux serveurs et non
   aux instances. Exemples :
   * adresse IP source pour atteindre le serveur
   - mthode de health-check (proto, ...)
   * mthode de health-check (port)
   - poids
   - alerte en cas de disparition
   - le nombre max de sessions  lui envoyer

ok> 9) ajouter des paramtres optionnels  l'option "httpchk" permettant
ok>    de forcer la mthode, la version HTTP et des headers.
ok>    ex: option httpchk        -> OPTIONS / HTTP/1.0
ok> 	   option httpchk /test  -> OPTIONS /test HTTP/1.0
ok> 	   option httpchk HEAD / HTTP/1.0\nHost:\ www   -> tel quel

Todo for 1.1
============
* "no more server" alert
* config check
- anti-flapping

Todo for 1.2
============
- direct <server> <regex> <match>
- new config syntax allowing braces to be able to shorten lines
- insert/learn/check/log unique request ID, and add the ability
  to block bad responses.
- IPv6 :
* listen [ip4.ip4.ip4.ip4]:port[-port]
* listen [ip6::...ip6]/port[-port]
- server xxx ipv4 | ipv4: | ipv4:port[-port] | ipv6/ | ipv6/port[-port]
* appcookie
* weighted round robin
- option to shutdown(listen_sock) when max connections reached
* epoll
- replace the event scheduler with an O(log(N)) one. The timer queue will
  need a tree with a known end (to speed up queueing of latest events), and
  no entry for eternity.
- refine memory management so that the request buffer is only allocated in
  cli_read() and response buffer during srv_read(). This would protect against
  attacks with thousands connections : 20000 connections consume 340 MB RSS and
  1.3 GB VSZ on Linux. Data should be in a separate buffer to prevent any
  activity on the buffer's pointers from touching the buffer page itself.
- make buffer size configurable in global options
* monitor number of simultaneous sessions in logs (per srv/inst/global)
* ignore leading empty lines in HTTP requests
+ limit the per-server number of sessions and queue incoming connections
  => still needs refinement (actions at servers UP/DOWN, timeouts)
- new 'timeout' keyword to set all timeouts (including the queue)
- ability to intercept an URI to report statistics
- ability to intercept an URI to return 404
- embedded error pages loaded in memory at startup time (eg: for expired time
  in connection queue)


TODO for 1.3
============
  - check all copyrights
  - fix Makefile.bsd
  - separate inline functions to put them in files covered by GPL
  - implement HTTP status 414 - request URI too long
  - implement 'use_filters <proxy>' and 'use_backend <proxy>'
  - fix the logs. The logs might be defined from the frontend and
    augmented depending on the backends' options. Another solution
    would be to support a 'log' type entity just like the frontend,
    filters and backend, on which every entity could rely.
  - implement 'on uri <uri> <proxy>', 'on host <host> <proxy>'
  - remove the first now useless hop in hdr_idx
  - balance on URI hash (specify length or depth)
  - balance on any header hash (eg: host)
  - balance with redirections to real servers
  - multi-site LB with weighted redirections to the remote one