rilascio del bilanciatore di carico , che consente di distribuire il traffico HTTP e le richieste TCP arbitrarie tra un gruppo di server, tenendo conto di molti fattori (ad esempio, verifica la disponibilità dei server, valuta il livello di carico, dispone di misure contro DDoS) e svolge un filtro iniziale dei dati (ad esempio, è possibile analizzare le intestazioni HTTP, filtrare la trasmissione di parametri di richiesta non validi, bloccare l'inserimento di SQL e XSS, collegare agenti di elaborazione dei contenuti). HAProxy può anche per coordinare l'interazione dei componenti in sistemi basati su architettura a microservizi. Il codice del progetto è scritto in linguaggio C e è sotto licenza GPLv2. Il progetto è utilizzato su molti grandi siti, tra cui Airbnb, Alibaba, GitHub, Imgur, Instagram, Reddit, StackOverflow, Tumblr, Twitter e Vimeo.
Caratteristiche principali del rilascio:
- È stato presentato un nuovo API , che consente di gestire al volo le impostazioni di HAProxy tramite REST Web API. È possibile inoltre aggiungere e rimuovere dinamicamente backend e server, creare ACL, modificare il routing delle richieste, cambiare le associazioni degli handler agli IP;
- È stata aggiunta la direttiva nbthread, che consente di configurare il numero di thread utilizzati da HAProxy per ottimizzare il funzionamento su CPU multicore. Di default, il numero di thread di lavoro viene scelto in base ai core CPU disponibili nell'ambiente attuale, mentre negli ambienti cloud è impostato un thread di default. Per impostare limiti rigidi sono state aggiunte opzioni di build MAX_THREADS e MAX_PROCS, che limitano il numero massimo di thread e processi;
- È stato semplificato l'uso della direttiva bind per associare gli handler agli indirizzi di rete. Nella configurazione, non è più necessario definire i parametri del processo: per impostazione predefinita, le connessioni verranno distribuite tra i thread in base al numero di connessioni attive.
- È stata semplificata la configurazione dei log all'avvio in contenitori isolati: il log può ora essere indirizzato a stdout e stderr, nonché a qualsiasi descrittore di file esistente (ad esempio, “log fd@1 local0”);
- Supporto HTX (Rappresentazione HTTP nativa) abilitato per impostazione predefinita, che consente un bilanciamento utilizzando funzionalità avanzate come HTTP/2 end-to-end, Layer 7 Retries e gRPC. HTX non sostituisce gli header in loco, ma riduce l'operazione di modifica alla rimozione e all'aggiunta di un nuovo header alla fine dell'elenco, consentendo di manipolare qualsiasi variante avanzata del protocollo HTTP, mantenendo la semantica originale degli header e permettendo una maggiore efficienza nella traduzione di HTTP/2 in HTTP/1.1 e viceversa;
- Aggiunto supporto ufficiale per la modalità End-to-End HTTP/2 (gestione di tutte le fasi in HTTP/2, inclusi i richiami al backend, non solo le interazioni del proxy con il cliente);
- Implementato supporto completo per il proxying bidirezionale del protocollo gRPC con la capacità di analizzare i flussi gRPC, evidenziando messaggi individuali, registrando il traffico gRPC nel log e filtrando i messaggi tramite ACL. gRPC consente di organizzare il lavoro dei microservizi in diversi linguaggi di programmazione, che interagiscono tra loro tramite un'API universale. L'interazione in rete in gRPC è implementata sopra il protocollo HTTP/2 e si basa sull'uso dei Protocol Buffers per la serializzazione dei dati.
- Aggiunta la supporto per la modalità "Layer 7 Retries", che consente di inviare richieste HTTP ripetute in caso di errori software non legati a problemi di connessione di rete (ad esempio, in assenza di risposta o risposta vuota a una richiesta POST). Per disattivare la modalità, è stato aggiunto il flag "disable-l7-retry" all'opzione "http-request", e per la configurazione fine sono state introdotte le opzioni "retry-on" nelle sezioni defaults, listen e backend. I seguenti indicatori sono disponibili per l'invio ripetuto: all-retryable-errors, none, conn-failure, empty-response, junk-response, response-timeout, 0rtt-rejected, così come la possibilità di legare ai codici di stato restituiti (404, ecc.);
- Implementato un nuovo gestore di processi (Process Manager), che consente di configurare la chiamata a file eseguibili esterni con gestori per HAProxy.
Ad esempio, un gestore esterno come API Data Plan (/usr/sbin/dataplaneapi) è stato implementato, così come vari motori di offload per l'elaborazione dei flussi; - Per .NET Core, Go, Lua e Python sono stati aggiunti dei binding per lo sviluppo di estensioni SPOE (Stream Processing Offload Engine) e SPOP (Stream Processing Offload Protocol). In precedenza, era supportato solo lo sviluppo di estensioni in C;
- Aggiunto il gestore esterno spoa-mirror (\/usr\/sbin\/spoa-mirror) per il mirroring delle richieste su un server separato (ad esempio, per copiare parte del traffico di lavoro per testare un ambiente sperimentale sotto carico reale);
- Presentato per garantire l'integrazione con la piattaforma Kubernetes;
- Aggiunta la supporto integrato per l'esportazione delle statistiche nel sistema di monitoraggio. ;
- Espanso il protocollo Peers Protocol, utilizzato per lo scambio di informazioni tra altri nodi con HAProxy. Inclusa la supporto per Heartbeat e trasmissione dati crittografata;
- Aggiunto il parametro "sample" nella direttiva "log" per consentire di registrare solo una parte delle richieste, ad esempio 1 su 10, per la generazione di un campione analitico;
- Aggiunta la modalità di profiling automatico (direttiva profiling.tasks, che può assumere i valori auto, on e off). Il profiling automatico è attivato se la latenza media supera il valore di 1000 ms. Per visualizzare i dati del profiling nell'API Runtime è stata aggiunta il comando "show profiling" o è possibile resettare le statistiche nel log;
- Aggiunta la supporto per l'accesso ai server backend utilizzando il protocollo SOCKS4;
- Aggiunta la supporto end-to-end (nel proprio percorso di elaborazione della richiesta, coprendo il backend) per il meccanismo di apertura rapida delle connessioni TCP (TFO — TCP Fast Open, RFC 7413), che riduce il numero di passaggi per stabilire una connessione combinando in una richiesta i primi due passaggi del classico processo di handshake a 3 fasi e consente l'invio di dati nella fase iniziale di stabilimento della connessione;
- Aggiunte nuove azioni:
- "http-request replace-uri" per la sostituzione dell'URL utilizzando espressioni regolari;
- "tcp-request content do-resolve" e "http-request do-resolve" per la risoluzione del nome host;
- "tcp-request content set-dst" e "tcp-request content set-dst-port" per la sostituzione dell'indirizzo IP di destinazione e della porta.
- Aggiunti nuovi moduli di conversione:
- aes_gcm_dev per la decodifica di flussi utilizzando algoritmi AES128-GCM, AES192-GCM e AES256-GCM;
- protobuf per l'estrazione dei campi dai messaggi Protocol Buffers;
- ungrpc per l'estrazione dei campi dai messaggi gRPC.
Fonte: opennet.ru
