Come aumentare le connessioni simultanee in Apache

Oggi vengo a parlarvi ancora una volta di uno dei servizi web più utilizzati al mondo: il web server Apache2.

È un argomento di cui si è parlato tante volte, ma ora vengo a parlarvi di un'altra caratteristica da tenere in considerazione con questo servizio: Il limite delle connessioni simultanee. Non importa se abbiamo un'astronave molto semplice o con un processore i7 e 32 GB di ram ...

Il limite delle connessioni simultanee sarà sempre lo stesso a meno che non si adottino misure appropriate, il che significa che se vogliamo avere molte persone connesse contemporaneamente, non solo avremo bisogno di un buon hardware, ma anche una buona configurazione.

In questo caso non è necessario installare nulla, tutto si basa su concetti semplici che devono essere presi in considerazione per configurare apache; concetti che devono essere molto chiari prima di voler apportare modifiche.

apache2_logo

La prima cosa a cui pensare è: che capacità ha la mia squadra? Quante connessioni simultanee può supportare la mia attrezzatura se la forzo il più possibile? Tutto questo dipende da un singolo fattore; RAM (memoria ad accesso casuale).

Maggiore è la RAM, maggiore è il numero di connessioni, anche se non esiste un valore fisso (cioè X client per ogni X ram), ecco perché prima di tutto è importante fare dei piccoli calcoli sul nostro web server, con per conoscere i nostri limiti.

La prima cosa che dovresti sapere è quanta memoria RAM consuma mediamente ogni connessione ad Apache, poiché ogni connessione stabilita presuppone un certo consumo di RAM nel sistema ... Ovviamente non tutte le connessioni consumano la stessa ram, con la quale dovresti fare un media ... Tutto questo può essere ottenuto con il seguente comando:

ps -ylC apache2 --sort: rss | awk "{SUM + = $ 8; I + = 1} END {print SUM / I / 1024} "

Il risultato ottenuto sarebbe rappresentato in megabyte e potrebbe variare a seconda del numero di connessioni attive, del tipo di pagine visitate, ecc ... Per questo motivo si consiglia di effettuare il test con diverse schede aperte; ognuno di essi mostra contenuti diversi, se possibile. Nel mio caso, ad esempio, il risultato è stato 9.5458, che se arrotondassimo per eccesso sarebbe 10 MB RAM consumata in media per connessione.

È anche importante sapere quanta RAM viene consumata dal resto dei processi attivi nel sistema, poiché il servizio web non è l'unico che gira nel sistema operativo ed è necessario lasciare memoria RAM libera sul server in modo che possa eseguire il resto delle attività. Questo può essere ottenuto con il comando mostrato di seguito:

ps -N -ylC apache2 --sort: rss | awk "{SUM + = $ 8} END {print SUM / 1024}"

Il risultato ottenuto sarebbe anche rappresentato in megabyte, e ci mostrerebbe abbastanza precisamente la quantità di RAM consumata dal resto dei processi; nel mio caso 800 MB. Con queste informazioni potremmo fare un calcolo generale del numero di connessioni simultanee che potremmo avere; Calcolo che si otterrebbe tramite un'operazione molto semplice.

(RAMTOTAL - RAM_RESTOPROCESOS) / RAM_POR_CONNEXIÓN

Con questa formula in mano, immaginiamo di avere un computer con 4 GB di RAM, cioè 4096 MB e che il nostro computer abbia mostrato i risultati di cui sopra; il calcolo sarebbe:

(4096-800) / 10 = 329 connessioni simultanee

Il problema con questo calcolo è che uno è troppo estremo, poiché consumerebbe tutta la RAM (facendo sì che il server consumi lo swap) e inoltre, nel caso di avere un database, come MySQL o qualsiasi altro, le connessioni ad esso consumerebbero anche RAM , con il quale il numero ottenuto potrebbe essere qualificato come numero utopico. Pertanto, al fine di liberare la memoria per eventuali processi aggiuntivi e considerare anche la possibilità che vengano eseguite connessioni a un database, ridurremo il numero di connessioni a 250.

Ora che abbiamo il nostro numero massimo di connessioni simultanee, dovremmo preparare Apache a ricevere questo numero, che viene fatto nel file di configurazione di questa chiamata apache2.conf, che è ospitato in / etc / apache2.

Il file in questione segue una struttura basata su moduli, ciascuno con il nome corrispondente, ma a noi interesserebbe solo uno di essi, il cui nome è  mpm_prefork_module. Il modulo in questione ha i seguenti dati di default:

StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 150 MaxRequestsPerChild 0

Questo modulo ha una serie di parametri molto importanti, anche se ce n'è uno che ci interesserebbe particolarmente, chiamato MaxClients. Questo parametro specifica il numero massimo di connessioni simultanee e deve essere modificato in 250.

Un dettaglio da tenere a mente è che quando un valore diverso da quello di default è specificato in detto parametro, è necessario aggiungerne un altro ancora PRIMA di questo. Questo parametro è chiamato ServerLimit e imposta il limite di connessioni che il server può "mantenere" anche quando è al di fuori del limite.

Il parametro ServerLimit deve essere sempre leggermente superiore a MaxClients e qui, avendo poco margine di manovra, un limite di 270. Questo renderebbe il modulo simile a questo:

StartServers 5 MinSpareServers 5 MaxSpareServers 10 ServerLimit 270 MaxClients 250 MaxRequestsPerChild 0

Ora sarebbe solo necessario riavviare il servizio Apache utilizzando il comando: 

/etc/init.d/apache2 riavvio

Con questo potremmo già godere del nostro server web ottimizzato.

Saluti.


Lascia un tuo commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati con *

*

*

  1. Responsabile dei dati: Miguel Ángel Gatón
  2. Scopo dei dati: controllo SPAM, gestione commenti.
  3. Legittimazione: il tuo consenso
  4. Comunicazione dei dati: I dati non saranno oggetto di comunicazione a terzi se non per obbligo di legge.
  5. Archiviazione dati: database ospitato da Occentus Networks (UE)
  6. Diritti: in qualsiasi momento puoi limitare, recuperare ed eliminare le tue informazioni.

  1.   zetatina suddetto

    Grazie per il post!

    1.    Drassil suddetto

      Sono contento che tu l'abbia trovato utile.

      Saluti.

  2.   Miguel Angelo suddetto

    C'è un modo per raggruppare con Apache e due server, puoi spiegare come funziona?

    1.    Drassil suddetto

      Sebbene abbia letto qualche teoria a riguardo, non l'ho mai applicata alla pratica. Anche così, forse questo articolo può darti qualche guida al riguardo, anche se ripeto che non ho avuto modo di metterlo in pratica:

      http://www.muspells.net/blog/2011/04/alta-disponibilidad-con-apache2-y-heartbeat-en-debian-squeeze/

    2.    Edoardo Khalil suddetto

      hai chiesto per un po ', se non hai risolto; Ho uno schema di bilanciamento con una terza parte che funge da file system, punti le cartelle che si trovano in var / www / html / (nel mio caso) al file system, in modo che condividano le stesse informazioni e forse avrai bisogno di un ip virtuale che risponda e reindirizzamento agli ips degli apache, per questo puoi occupare un haproxy e se lo vuoi in alta disponibilità puoi integrare keepalive nel caso uno cade, l'altro continua a rispondere, o anche se hai già un dominio per l'applicazione, puoi bilanciare con pound facendo backend a entrambi i server, per casi specifici come moodle o alcune applicazioni che si connettono a un database in mysql, dovresti creare un utente per app server che punta allo stesso database.

  3.   shamaru suddetto

    Grazie mille per il post, hai perfettamente ragione, la ram è il calcolo primario, anche se immagino che calcoliamo anche il numero massimo di processi che il nostro processore può gestire (ovviamente facendo prima il calcolo della memoria principale) e come il disco verrebbe distribuito in modo rigido (esempio partizioni / var = 1TR).

    1.    Drassil suddetto

      Hai ragione; tutto è importante, come il controllo della temperatura tra le altre cose. Ovviamente un potente processore può svolgere un maggior numero di task contemporaneamente con grande efficienza, ma l'obiettivo di questo post è stato quello di spiegare l'importanza della RAM rispetto al numero di connessioni simultanee.

      Un buon modo per controllare tutti questi fattori e vedere se il nostro processore non è saturo o se abbiamo poca RAM libera, sarebbe usare uno script bash. Forse vi interesserà questo post che ho fatto qualche giorno fa a riguardo, che vi lascio al seguente link; È un monitoraggio globale ma potrebbe essere interessante per uno:

      http://bytelearning.blogspot.com.es/2015/07/controlando-la-salud-del-equipo-con-bash.html

      saluti

  4.   Sergio S. suddetto

    Nota molto buona, grazie mille!

    1.    Drassil suddetto

      Molte grazie! Spero tu abbia potuto approfittarne.

  5.   clown suddetto

    Non voglio essere un coglione ...
    ... Ma aumentando il numero di connessioni non si rimane più vulnerabili a un attacco DDoS?

    1.    Drassil suddetto

      Non è una tranquilla domanda cretina. La verità è che aumentando il numero di connessioni simultanee, rafforziamo in parte Apache contro gli attacchi DDOS, perché devi tenere conto che il numero di connessioni massime simultanee stabilite sul server è il numero di connessioni massime totali, non quelle provenienti da un singolo utente. Quindi, mentre all'inizio potevamo supportare solo 150 connessioni simultanee (che si tratti di connessioni da una fonte legittima o meno) ora possiamo contare su tante quante ne supporta il nostro server, richiedendo un numero maggiore di connessioni contemporaneamente per essere senza servizio. Ovviamente, aumentare il numero massimo di connessioni non è un modo per proteggersi da questo tipo di attacco, ma piuttosto dovrebbero essere implementate policy firewall. Se, ad esempio, il servizio web che vuoi mettere sarà esposto a Internet, una misura di sicurezza che potrebbe essere implementata sarebbe l'aggiunta di queste linee al nostro firewall:

      iptables -A INPUT -p tcp –syn –dport 80 -m connlimit –connlimit-fino a 10 -m state –state NEW -j ACCEPT

      iptables -A INPUT -p tcp –dport 80 -m state –state ESTABLISHED, RELATED -j ACCEPT

      iptables -A INPUT -p tcp –dport 80 -j DROP

      1.    clown suddetto

        Una delle caratteristiche degli attacchi DDoS è che può sembrare che un utente malintenzionato invii pacchetti da diverse direzioni, il che impedisce al flusso di pacchetti di provenire da una sola direzione.

    2.    Drassil suddetto

      Hai ragione nel senso che un firewall come quello che ho impostato non è molto efficiente contro un attacco DDOS, poiché proviene da fonti diverse. Tuttavia, è meglio limitare il numero di connessioni a 10 per ciascuna di queste sorgenti piuttosto che non avere un limite, in modo che ciascuna sorgente possa stabilire un centinaio di connessioni o più.

      In ogni caso, il kit della domanda è che più connessioni simultanee supporta il server, più difficile sarà eliminarlo con un attacco DDOS, il che renderebbe più difficile la rimozione della pagina da parte di un attaccante .

      Saluti.

  6.   eliotime3000 suddetto

    Buona. Per ora continuo con NGINX sul mio sito per non torturare il VPS che ho.

  7.   Bruno cascio suddetto

    Buon post @Drassill!

    Volevo contribuire con qualcosa di forse più statistico della configurazione.
    Sebbene il modo più semplice e veloce per calcolare il parametro di consumo sia con la media, forse potremmo essere più rigorosi e utilizzare la "mediana" invece della "media". Da cosa ci salverebbe? Che i numeri si spengano nel caso in cui una connessione abbia consumato molta memoria. Ad esempio, si supponga che i seguenti client che consumano i seguenti valori, nell'unità di memoria desiderata (KB, MB, MiB, ecc.):

    10, 15, 150, 5, 7, 10, 11, 12

    La media darebbe circa ~ 30

    E questo perché abbiamo una fine molto grande (150), ei calcoli sono pazzi. La mediana consiste nell'ordinare questi dati, dividendo il numero di campioni per 2 (il nostro centro) e quindi ottenendo il numero di quella posizione. Con questo avremmo qualcosa di simile

    5, 7, 10, 10, 11, 12, 15, 150

    Quindi la nostra media sarebbe: 8/2 = 4 cioè ~ 10

    Qui puoi vedere che non importa quanto folle possa essere l'estremo, ci darà sempre un valore più realistico. Se aggiungiamo un cliente che ne consuma 200, la nostra mediana sarà 11, mentre la media potrebbe arrivare a …….

    È solo un contributo, ed è molto discutibile, perché con le connessioni non è avvitato.

    Abbraccia le persone linuxera 🙂

  8.   Carlos suddetto

    Ciao, ho avuto un problema sul mio server dedicato, ovvero ogni volta che il numero di circa 250 persone online si avvicina, secondo google analytics in tempo reale, il mio server come se crolla e la connessione diventa lenta fino a quando non si interrompe la connessione al sito web e non carica mai più di quel numero di utenti online, ma quando vedo le prestazioni del server dedicato che è 8gb ram mostra il 10% di utilizzo, la cpu: 5% di utilizzo e l'hard disk in: 1.99 % d'uso.
    Mi potete aiutare? Non riesco a trovare cosa fare, eseguire questi passaggi è la soluzione?

    1.    Drassil suddetto

      Bravo Carlos.

      Il problema che descrivi è molto comune quando il server non è adeguatamente preparato. Il tuo server probabilmente accetterà un numero molto inferiore di connessioni simultanee e quando raggiungerà 250 connessioni andrà in crash. Seguendo il manuale dovresti essere in grado di risolvere il problema, anche se se hai un database su quel server dovresti anche ottimizzare quel database.

      Saluti.

      1.    Carlos suddetto

        Drassill, ho fatto la configurazione che hai citato ed è stata soddisfacente, ieri ho raggiunto 280 utenti online e il server non è andato in crash, sono molto contento di questo risultato, e voglio fare anche l'altra cosa che mi dici per ottimizzare il database, ¿ Come ottengo questo?

    2.    Drassil suddetto

      Il concetto di database è abbastanza aperto; usare mysql non è lo stesso di postgres (per esempio). Ovviamente non conosco tutti i database; Ho provato mysql e postgres, e l'aumento delle connessioni simultanee in questi sarebbe basato sul parametro max connections; L'ottimizzazione di mysql verrebbe eseguita in /etc/my.conf e il parametro max connections dovrebbe essere modificato (tra gli altri). Per postgres invece, ho un articolo sul mio blog che spiega come ottimizzarlo che può esserti utile o che puoi utilizzare come riferimento per il tuo database:

      http://bytelearning.blogspot.com.es/2016/02/postgresql-una-alternativa-mysql-en.html

      Saluti.

  9.   Erickson vasquez suddetto

    Ciao, quando lancio il primo comando, mi mostra il valore 0. Cosa potrebbe essere?

  10.   Daniele Ojeda suddetto

    Grazie per questo post.

  11.   Rolando Aguilera Salazar suddetto

    Che buon manuale, quell'informazione fa parte di quello che sto cercando... grazie!

    Ma ora, se voglio che quando vengono superati quei 250 visitatori, il visitatore 251 vada su una pagina di attesa o una coda virtuale, posso farlo da questa stessa configurazione?

    Saluti e grazie!