| * x-forwarded-for |
| * implémenter l'option "log global" au niveau proxy pour utiliser les logs |
| globaux. |
| * matching case-insensitive |
| * implémenter outgoing addr |
| * loguer t_cnx, t_data, t_total |
| + factoriser la fonction de log (send_log = send_syslog+warning+alert) |
| + désactivation 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 requêtes |
| 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)) |
| * implémenter limitation fd dans la conf : setrlimit(RLIMIT_NOFILE, ...) |
| - implémenter core/no-core dans la conf : setrlimit(RLIMIT_CORE, ...) |
| - optimiser les regex pour accélérer les matches : |
| - compter les matches |
| - si match(n) & ([n].cpt > [n-1].cpt) & ([n].action == [n-1].action), swap(n,n-1) |
| - régulièrement, diviser tous les compteurs (lors d'un dépassement par exemple) |
| - filtrage sur l'adresse IP source, et stocker le pointeur sur la dernière regex |
| matchée dans la "session" pour accélérer 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, implémenter le BIND. |
| ok> |
| ok> 3) reconnexion sur le même port sur le serveur : |
| ok> |
| ok> server XXX 1.2.3.4[:port] |
| ok> si <port> n'est pas spécifié, on utilise le même port que celui qui a reçu |
| 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) paramètres par défaut : |
| créer une section "defaults" qui précise les paramètres par défaut pour les |
| sections suivantes, concernant les paramètres 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 ? |
| |
| * implémenter "balance source" pour faire un hash sur la source. |
| permettre de spécifier 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". Problème 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 séparé par listen : |
| listen XXX |
| fork [ group_id ] |
| |
| le fait de spécifier group_id fera que toutes les instances utilisant le |
| même identifiant de groupe seront gérées par un même processus. |
| |
| -> plus souple et plus compréhensible de faire des sections par processus, |
| ce qui résoud également le cas ci-dessous. Ex: |
| process_group X |
| nbproc X |
| uid X |
| chroot X |
| listen ... |
| |
| 7) gérer un chroot/uid/gid différents par process : |
| listen XXX |
| chroot /truc |
| uid 123 |
| gid 456 |
| |
| 8) beaucoup de paramètres pourraient être spécifiques aux serveurs et non |
| aux instances. Exemples : |
| * adresse IP source pour atteindre le serveur |
| - méthode de health-check (proto, ...) |
| * méthode de health-check (port) |
| - poids |
| - alerte en cas de disparition |
| - le nombre max de sessions à lui envoyer |
| |
| ok> 9) ajouter des paramètres optionnels à l'option "httpchk" permettant |
| ok> de forcer la méthode, 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 |
| |