Blog

  • Come verificare e cambiare il fuso orario in CentOS Stream 9

    Come verificare e cambiare il fuso orario in CentOS Stream 9

    Fuso orario su CentOS Stream 9: prima si verifica, poi si cambia

    Su CentOS Stream 9 il fuso orario non è un dettaglio cosmetico: entra nei log, nei job pianificati, nelle scadenze TLS, nelle finestre di manutenzione e nelle analisi di incidenti. Se il server registra un orario diverso da quello atteso, il problema può sembrare banale ma finisce per sporcare diagnosi, rotazione log e correlazione tra servizi. La strada corretta è semplice: leggere lo stato reale, capire quale timezone è attiva, cambiare solo se serve e verificare che il sistema abbia recepito la modifica.

    Qui il punto non è solo “impostare Europe/Rome”. Il punto è farlo senza introdurre ambiguità: prima si guarda l’ora locale e l’ora UTC, poi si controlla il link simbolico usato da systemd, infine si conferma che la modifica sia visibile anche in applicazioni e servizi che tengono conto del timezone del sistema.

    Come capire quale fuso orario è attivo

    Il comando di riferimento è timedatectl. Su CentOS Stream 9 è il modo più pulito per leggere lo stato di ora locale, ora universale, RTC e timezone attuale.

    Esegui questo controllo iniziale:

    timedatectl status

    Nel risultato cerca almeno queste righe: Local timeUniversal timeRTC time e Time zone. Se il sistema è configurato correttamente, Time zone mostrerà qualcosa come Europe/Rome (CEST, +0200) o il valore coerente con la tua area geografica. Se invece vedi un fuso inatteso, il problema è già confermato senza dover toccare nulla.

    Un controllo utile è confrontare l’ora locale con UTC. La differenza deve combaciare con il fuso atteso, tenendo conto di eventuale ora legale. Se il delta non torna, non fidarti di una sola riga: verifica anche il link del timezone a livello filesystem.

    Il file che conta è /etc/localtime. Su sistemi moderni è spesso un collegamento simbolico verso un file dentro /usr/share/zoneinfo/. Per vedere dove punta davvero:

    readlink -f /etc/localtime

    Se il comando restituisce, per esempio, /usr/share/zoneinfo/Europe/Rome, la configurazione locale è coerente con il fuso italiano. Se invece il percorso punta a un’altra zona, hai trovato la causa dell’anomalia. Questo controllo è utile anche quando timedatectl e l’output di un’applicazione non sembrano allineati: il sistema può essere a posto, ma il servizio può avere una gestione autonoma dell’ora.

    Quando cambiare il timezone e quando non farlo

    Il timezone va cambiato solo se il server deve esporre orari locali comprensibili all’operatore o se un’applicazione lo richiede esplicitamente. In molti ambienti, soprattutto quando i sistemi sono distribuiti tra più sedi o cloud region, tenere tutto in UTC è più pulito. L’UTC semplifica la correlazione dei log e riduce gli errori durante i passaggi di orario legati all’ora legale.

    Se però il server è un nodo applicativo usato da un team che lavora in un solo paese, o se un pannello di controllo mostra gli orari di backup e job in formato locale, il fuso corretto evita fraintendimenti. Il punto è scegliere in modo coerente: o UTC come standard tecnico e conversione lato interfaccia, oppure timezone locale per esigenze operative ben definite.

    Un errore tipico è cambiare il timezone per “far tornare” una dashboard, quando in realtà il problema è nell’applicazione che formatta male le date. In quel caso il sistema operativo è innocente: intervenire a livello host può mascherare il bug e creare confusione altrove.

    Elenco dei timezone disponibili senza andare a tentativi

    CentOS Stream 9 usa la base dati di tzdata. Per elencare i timezone disponibili puoi filtrare la lista e cercare la zona corretta invece di affidarti alla memoria:

    timedatectl list-timezones | grep -i rome

    Il comando restituisce in genere una o poche corrispondenze. Se non sai quale timezone scegliere, non improvvisare: definisci prima il requisito operativo. Devi allinearti alla sede fisica del server, al team che lo gestisce o a un fuso usato da un’applicazione legacy? Sono tre casi diversi e producono scelte diverse.

    Per un controllo più mirato, puoi cercare anche aree geografiche complete:

    timedatectl list-timezones | grep -E 'Europe/(Rome|Milan|Paris|Berlin)'

    Ricorda che il nome corretto deve esistere nel database di timezone. Se inserisci una stringa errata, timedatectl la rifiuta subito: meglio così, perché evita configurazioni ambigue o non riproducibili.

    Impostare il fuso orario con timedatectl

    La modifica vera e propria è una sola riga. Prima di eseguirla, assicurati di aver capito l’impatto: cambieranno l’ora mostrata da shell, log, cron e servizi che leggono il timezone di sistema. Non cambia invece il tempo reale del server, che continua a scorrere normalmente.

    Per esempio, per impostare il fuso di Roma:

    sudo timedatectl set-timezone Europe/Rome

    Dopo il comando, verifica subito il nuovo stato:

    timedatectl status

    Il valore di Time zone deve aggiornarsi immediatamente. Se non succede, controlla eventuali errori di permessi o problemi sul filesystem. In condizioni normali la modifica è istantanea perché timedatectl agisce sulla configurazione di sistema senza richiedere riavvio.

    Il vantaggio di usare timedatectl è che non devi manipolare a mano /etc/localtime in casi normali. Eviti passaggi inutili e riduci il rischio di lasciare il sistema in uno stato incoerente tra file, link e stato letto da systemd.

    Verifica a livello file e link simbolico

    Dopo il cambio, conviene confermare che /etc/localtime sia allineato. Questo è particolarmente utile se stai gestendo macchine con configurazioni manuali o ereditate da anni di interventi diversi.

    ls -l /etc/localtime
    readlink -f /etc/localtime

    Un esito sano mostra il file come link simbolico verso la zona corretta dentro /usr/share/zoneinfo. Se invece trovi un file copiato a mano, la configurazione può comunque funzionare, ma diventa più difficile da mantenere e da auditare. In ambienti gestiti, meglio un link coerente e documentato.

    Se vuoi anche verificare che il database dei timezone sia presente e aggiornato, controlla il pacchetto:

    rpm -q tzdata

    Su CentOS Stream 9 tzdata è il riferimento per i fusi orari. Se il pacchetto manca o è danneggiato, il sistema può non riconoscere alcune zone o mostrare dati non aggiornati rispetto alle regole più recenti di ora legale.

    Controllare che anche i servizi vedano l’ora giusta

    Il sistema operativo può essere corretto e una singola applicazione può continuare a mostrare un orario diverso. Succede con servizi che usano impostazioni proprie, container con timezone montato male, ambienti PHP con date.timezone forzato o JVM con configurazioni esplicite. Per questo il controllo non deve fermarsi all’host.

    Per un test rapido, esegui un comando che stampi ora locale e UTC nello stesso momento:

    date
    date -u

    Se date mostra il fuso atteso e date -u mostra UTC, il kernel e la userland stanno leggendo correttamente la configurazione. A quel punto, se un’app continua a sbagliare orario, il problema è quasi certamente dentro il software o nella sua configurazione specifica.

    Per i servizi systemd puoi anche leggere l’ambiente del processo o la configurazione di startup. In molti casi non serve toccare nulla, ma è utile sapere dove guardare se il comportamento non cambia dopo la modifica del sistema.

    Se l’app è PHP-FPM, controlla se il timezone è definito nel php.ini o nella pool. Un esempio classico è un sito che mostra log corretti a livello sistema ma date sbagliate nelle pagine: lì il server è a posto, è PHP che sta forzando un fuso diverso.

    php -i | grep -i timezone

    Se usi database o middleware, ricorda che anche loro possono serializzare timestamp in UTC e convertirli in lettura. In quel caso non c’è un errore da correggere nel fuso del server: va chiarita la convenzione usata dal stack applicativo.

    Ora legale, UTC e perché i log vanno letti con disciplina

    Un timezone corretto non elimina gli errori di lettura dei log se non si tiene conto dell’ora legale. Durante i cambi stagionali, la stessa località può passare da CET a CEST o viceversa, e la differenza rispetto a UTC cambia. Questo è normale, ma va gestito con metodo.

    Per incident response, la prassi più pulita resta la stessa: salva i timestamp in UTC e converti solo in visualizzazione. Se invece un team opera quotidianamente con gli orari locali, documenta bene il fuso in uso e fai in modo che gli strumenti di monitoraggio mostrino anche il riferimento UTC. Così eviti discussioni del tipo “ma era le 2 o le 3?” quando l’analisi dell’evento è già complicata di suo.

    Una regola pratica: se l’orario serve per correlare eventi tra più sistemi, UTC; se serve per un operatore che deve eseguire una procedura in una fascia oraria locale, timezone esplicito e documentato. Mischiare i due modelli senza disciplina è il modo più veloce per sbagliare finestra di manutenzione o interpretazione di un log.

    Se il cambio non ha effetto: cosa controllare subito

    Quando timedatectl set-timezone sembra funzionare ma il sistema continua a mostrare un fuso sbagliato, le cause più comuni sono poche e verificabili in fretta.Un’applicazione sta sovrascrivendo il timezone con una propria variabile o configurazione. Verifica la documentazione del servizio e cerca stringhe come TZ= o date.timezone./etc/localtime è stato sostituito manualmente o non punta al file atteso. Controlla con readlink -f /etc/localtime.Il pacchetto tzdata è mancante, vecchio o incoerente. Verifica con rpm -q tzdata e aggiorna il sistema se necessario.

    Se gestisci una macchina in produzione, non fare pulizie aggressive a occhi chiusi. Prima osserva lo stato, poi cambia il minimo indispensabile, poi verifica di nuovo. Il timezone non è un componente fragile, ma una modifica fatta male può confondere log, cron e troubleshooting per ore.

    Procedura sintetica da usare quando devi farlo al volo

    Se ti serve una sequenza breve e ripetibile, questa è quella giusta: leggi lo stato, imposta il timezone, ricontrolla e valida con un comando che mostri l’ora locale.

    timedatectl status
    sudo timedatectl set-timezone Europe/Rome
    timedatectl status
    date

    Se lavori su una macchina remota e vuoi evitare errori, annota prima il valore corrente di Time zone. In caso di necessità, tornare indietro è immediato: basta reimpostare il timezone precedente con lo stesso comando timedatectl set-timezone. Questo è il tuo rollback pratico e non richiede passaggi complessi.

    In ambienti gestiti da automazione, conviene anche documentare il valore in inventario o nel playbook. Il vantaggio non è estetico: quando tra sei mesi qualcuno dovrà capire perché un server è in UTC e un altro in Europe/Rome, la risposta deve stare in un file, non nella memoria di chi ha fatto l’ultimo intervento.

    Quando usare UTC come standard operativo

    Se stai progettando una nuova infrastruttura, UTC è spesso la scelta più solida per host, log e servizi back-end. Riduce le ambiguità durante i cambi di ora, semplifica l’integrazione tra sistemi distribuiti e rende più lineare la lettura dei timestamp in incidenti multi-livello.

    Il timezone locale può restare a livello di interfaccia utente, dashboard o report. Così il server parla una lingua unica e l’operatore vede l’ora nella forma più utile al proprio lavoro. È una divisione pulita, soprattutto se la piattaforma cresce e coinvolge più paesi o più team.

    Se invece il requisito è esplicitamente locale, allora il cambio su CentOS Stream 9 è banale. La parte importante non è il comando, ma la coerenza della scelta e la verifica finale. Un timezone corretto non risolve problemi applicativi, però toglie di mezzo una fonte di errore molto comune e spesso sottovalutata.

  • Installare cPanel/WHM su AlmaLinux 9 passo dopo passo

    Installare cPanel/WHM su AlmaLinux 9 passo dopo passo

    Prerequisiti reali prima di partire

    cPanel/WHM su AlmaLinux 9 non è un’installazione “click-next” da fare su una macchina qualsiasi. Il punto critico è partire da un sistema pulito, con hostname corretto, DNS coerente e niente stack web o mail già attivi che si pestino i piedi con i servizi di cPanel.

    Il caso tipico che crea problemi è il server appena provisionato con pacchetti extra, repository terzi, firewall già molto personalizzato o una configurazione di rete improvvisata. Se vuoi evitare metà dei ticket post-installazione, tratta l’installazione come un change controllato: prima osservi, poi modifichi, poi verifichi.

    Serve un AlmaLinux 9 minimale, accesso root o sudo completo, un IP pubblico statico, e un hostname FQDN valido. In produzione conviene anche avere una finestra di manutenzione e un snapshot della VM o un backup del provider. Non è un dettaglio: se qualcosa va storto, il rollback più rapido è tornare all’immagine precedente.

    Controlli preliminari che evitano errori banali

    Prima di lanciare l’installer, verifica tre cose: nome host, risoluzione DNS e versione del sistema. Sono i punti che più spesso bloccano l’installazione o generano un WHM funzionante solo a metà.

    Esegui questi controlli:

    hostnamectl status
    cat /etc/redhat-release
    getent hosts $(hostname -f)
    

    Il risultato atteso è un hostname completo, una release coerente con AlmaLinux 9 e una risoluzione che ritorna l’IP corretto del server. Se hostname -f non restituisce un FQDN valido, correggi prima quello: cPanel usa l’hostname come base per certificati, servizi e notifiche.

    Controlla anche che non ci siano servizi web o mail preinstallati. Su sistemi “sporchi” trovi spesso Apache, Nginx, MariaDB, Dovecot o Postfix già configurati in modo non compatibile con il layout che cPanel si aspetta. Non sempre è un blocco immediato, ma quasi sempre è una fonte di ambiguità.

    Architettura minima: cosa fa cPanel e cosa non deve trovare

    WHM è il pannello amministrativo, cPanel è il pannello utente. Sul server, l’installer porta dentro un insieme di componenti: web server, mail stack, DNS, FTP, database, servizi di monitoraggio e gli strumenti di gestione. Il punto non è “installare un pannello”, ma accettare che il pannello diventi il gestore principale di quei servizi.

    Per questo motivo è sconsigliato installarlo sopra un host già usato per altro, a meno di sapere esattamente quali servizi vuoi sacrificare o migrare. Se il nodo ospita già applicazioni custom con configurazioni manuali, il rischio non è il crash immediato: è la deriva lenta, con file sovrascritti, service unit modificate e troubleshooting inutile dopo qualche settimana.

    In pratica: cPanel vuole essere il centro di gravità del server. Se il server è già “di tutti”, prima si ripulisce, poi si installa.

    Step 1: aggiorna il sistema e riduci il rumore

    Parti da un aggiornamento completo. Non perché “sia buona norma” in astratto, ma perché riduce la distanza tra kernel, librerie e dipendenze che l’installer dovrà sistemare.

    dnf -y update
    reboot
    

    Dopo il reboot, conferma che il sistema sia tornato pulito e che non ci siano errori evidenti all’avvio:

    systemctl --failed
    journalctl -p err -b --no-pager | tail -n 50
    

    Se trovi unità fallite, non ignorarle. Un server con problemi di base prima dell’installazione di cPanel tende a trasformare piccoli warning in problemi operativi più difficili da leggere dopo.

    Step 2: imposta hostname, FQDN e risoluzione corretta

    L’hostname deve essere un FQDN stabile, del tipo server1.example.com. Evita nomi generici come localhost, alias ambigui o hostnames che puntano a record DNS non ancora pubblicati.

    hostnamectl set-hostname server1.example.com
    hostname -f
    

    Controlla poi /etc/hosts. In molti ambienti l’installer funziona meglio se il FQDN risolve localmente verso l’IP del server, senza dipendere solo dal DNS esterno.

    cat /etc/hosts
    

    Un esempio coerente è questo:

    203.0.113.10 server1.example.com server1
    

    Se il server è dietro NAT o in un cloud con IP privato e pubblico separati, definisci bene quale IP deve comparire nell’hostname e quale nei record DNS. Qui non si improvvisa: WHM e i servizi di mail soffrono molto più di altri stack quando l’identità di rete è incoerente.

    Step 3: prepara il sistema senza installazioni inutili

    La regola pratica è semplice: meno roba c’è prima dell’installazione, meno conflitti avrai dopo. Se il sistema è stato creato con un template generico, verifica e rimuovi i servizi che non servono.

    dnf list installed | egrep 'httpd|nginx|mariadb|mysql|postfix|dovecot|bind|named|vsftpd'
    

    Se trovi componenti già presenti e non necessari, la scelta corretta è decidere prima se vuoi davvero migrare su cPanel oppure rifare il nodo. Disinstallare alla cieca su un host in uso è un’operazione a rischio, soprattutto se ci sono dati o configurazioni da preservare.

    Per un’installazione pulita, il controllo più utile è anche quello delle porte in ascolto:

    ss -tulpn
    

    Se vedi servizi inattesi su 80, 443, 25, 53 o 3306, fermati e chiarisci la baseline. È molto più semplice correggere prima che cPanel inizi a installare i propri demoni.

    Step 4: scarica e lancia l’installer ufficiale

    Il metodo standard resta l’installer ufficiale. Va eseguito come root e richiede connettività verso i repository e i mirror di cPanel.

    cd /home
    curl -o latest -L https://securedownloads.cpanel.net/latest
    sh latest
    

    Durante l’installazione possono comparire lunghi periodi senza output apparente: non è necessariamente un blocco. Il processo scarica pacchetti, prepara dipendenze e costruisce la configurazione iniziale. Se vuoi osservare il progresso, tieni aperto un secondo terminale e monitora i log dell’installer.

    tail -f /var/log/cpanel-install.log
    

    In caso di errore, il log è la prima fonte da leggere, non il browser. È lì che trovi il pacchetto fallito, la dipendenza mancante o il problema di rete. Se il download si interrompe, verifica anche DNS e reachability verso l’esterno:

    curl -I https://securedownloads.cpanel.net/
    ping -c 3 1.1.1.1
    getent hosts securedownloads.cpanel.net
    

    Step 5: primo accesso a WHM e verifica delle porte

    A installazione completata, l’accesso avviene su WHM via HTTPS, tipicamente sulla porta 2087. Il primo login richiede credenziali di root o un utente amministrativo autorizzato.

    Verifica che il servizio stia ascoltando:

    ss -tulpn | egrep ':2087|:2083|:2096|:53|:25'
    

    Le porte utili da controllare subito sono quelle di WHM/cPanel, DNS e mail. Se una di queste manca, non dare per scontato che il problema sia nel browser: spesso è il firewall o un servizio non partito correttamente.

    Apri quindi l’interfaccia amministrativa e verifica tre elementi: stato generale del server, notifica di eventuali problemi di licenza e presenza dei servizi principali. Se la GUI non si apre ma il processo risulta in ascolto, il sospetto va al firewall locale, al security group del provider o a una policy di rete intermedia.

    Firewall, SELinux e rete: il minimo indispensabile da non sbagliare

    Su AlmaLinux 9 è normale avere firewalld attivo. Il punto non è disattivarlo per comodità, ma aprire solo ciò che serve. Se il server è esposto a Internet, lasciare tutto aperto è una cattiva abitudine che prima o poi presenta il conto.

    Le porte da considerare dipendono dal ruolo del nodo, ma per l’accesso amministrativo e i servizi base conviene almeno verificare queste:

    firewall-cmd --list-ports
    firewall-cmd --list-services
    

    Se devi aprire una porta, fallo in modo esplicito e documentato. Ad esempio, per WHM:

    firewall-cmd --permanent --add-port=2087/tcp
    firewall-cmd --reload
    

    Con SELinux, la strategia migliore è non spegnerlo per abitudine. Se qualcosa non funziona, prima osserva gli AVC:

    getenforce
    ausearch -m AVC -ts recent
    

    Se il problema è reale e non un falso positivo, correggi il contesto o la policy. Disabilitare SELinux di default su un server esposto non è una soluzione tecnica, è solo un modo per spostare il rischio più avanti.

    Primo hardening operativo dopo l’installazione

    Finita l’installazione, il lavoro non è concluso. Il primo hardening utile è pratico: accesso amministrativo protetto, password robuste o meglio ancora autenticazione a più fattori dove disponibile, e limitazione delle superfici che non ti servono.

    Se il server non deve ospitare DNS autoritativo, mail o FTP, valuta di non attivarli o di ridurne l’esposizione. Molti ambienti cPanel nascono con tutto abilitato e poi si scopre che l’80% delle funzioni non serve davvero. Meno servizi significa meno patch, meno log, meno punti di guasto.

    Controlla anche gli aggiornamenti automatici e la finestra di manutenzione. cPanel è un ecosistema che si aggiorna spesso: lasciare il server fermo per mesi senza monitoraggio è il modo più rapido per accumulare drift tra versione, plugin e configurazioni locali.

    Verifiche post-installazione che vale la pena fare subito

    Le verifiche immediate non devono essere teoriche. Devi guardare servizi, log e reachability reale.

    1. Apri WHM su https://IP:2087 e verifica che il login funzioni senza errori di certificato o redirect anomali.
    2. Controlla lo stato dei servizi principali con /scripts/restartsrv_all solo se necessario, oppure usa il pannello “Service Status” per vedere cosa è up/down.
    3. Verifica la presenza dei log di installazione e di sistema, in particolare /var/log/cpanel-install.log e /usr/local/cpanel/logs/.
    4. Controlla che il server risolva il proprio hostname in modo corretto con hostname -f e getent hosts $(hostname -f).
    5. Conferma che le porte amministrative e di servizio siano raggiungibili dal tuo IP di gestione.

    Se una di queste verifiche fallisce, non saltare subito alla reinstallazione. Di solito il problema è più piccolo: firewall, DNS, hostname o un servizio non partito.

    Errori tipici e come leggerli senza perdere tempo

    Il primo errore comune è l’installazione su sistema non pulito. Sintomo: conflitti di pacchetti, servizi duplicati, configurazioni sovrascritte. La correzione è decidere se bonificare davvero il nodo o rifare la VM da zero.

    Il secondo errore è l’hostname sbagliato. Sintomo: WHM raggiungibile ma certificato incoerente, mail con identità non corretta, warning ripetuti in pannello. La correzione è sistemare hostname e DNS prima di tutto il resto.

    Il terzo errore è la rete filtrata male. Sintomo: installazione completata ma accesso a WHM o ai servizi bloccato dall’esterno. La correzione è verificare security group del provider, firewall locale e eventuali ACL intermedie.

    Rollback sensato se qualcosa va storto

    Se sei in un ambiente virtualizzato o cloud, il rollback più pulito è il ripristino dello snapshot pre-installazione. È la scelta migliore quando l’installazione ha modificato troppi componenti o quando il nodo era già usato per altro.

    Se non hai snapshot, la via meno rischiosa è fermarti prima di toccare dati applicativi e ripristinare la configurazione di rete e i pacchetti al minimo indispensabile. In pratica, non trasformare un problema di provisioning in una migrazione manuale improvvisata.

    Per ambienti di test, conserva sempre una nota con: versione AlmaLinux, data installazione, IP, hostname, repository usati e qualsiasi modifica al firewall. Quando devi fare troubleshooting dopo giorni, questi dettagli valgono più di dieci screenshot.

    Decisione pratica: quando ha senso usare cPanel su AlmaLinux 9

    Ha senso se vuoi un server orientato a hosting classico, con gestione centralizzata di domini, account, mail e DNS, e se il team preferisce lavorare da pannello con una struttura abbastanza standardizzata. Ha meno senso se il nodo deve ospitare stack applicativi molto personalizzati o se vuoi il massimo controllo manuale su ogni singolo servizio.

    Il criterio utile non è “cPanel sì o no” in astratto, ma quanto il tuo caso reale tollera un layer di astrazione che gestisce per te gran parte del sistema. Se accetti quel modello, AlmaLinux 9 è una base solida. Se non lo accetti, meglio fermarsi prima e scegliere un’architettura diversa.

  • Bilanciare le connessioni su una server farm con HAProxy

    Bilanciare le connessioni su una server farm con HAProxy

    Quando HAProxy è il punto giusto per bilanciare una server farm

    Se hai più nodi web dietro un front-end unico, HAProxy è spesso la scelta più lineare per distribuire le connessioni senza reinventare la ruota. Il punto non è “mettere un bilanciatore davanti” e basta: il punto è decidere come distribuire, cosa considerare sano e quando togliere un nodo dal giro. In una server farm fatta bene, il bilanciamento non maschera i problemi: li isola, li rende visibili e limita il danno.

    In pratica, HAProxy sta tra client e backend e prende decisioni su ogni nuova connessione o richiesta, a seconda del protocollo e della modalità usata. Se il traffico è HTTP, puoi ragionare su header, cookie, path, rate e health check applicativi. Se il traffico è TCP puro, ti sposti su criteri più bassi: disponibilità della porta, tempi di risposta e stabilità della sessione. La differenza sembra teorica, ma in produzione cambia tutto: un bilanciatore che “vede” solo la porta aperta può continuare a mandare traffico a un nodo che in realtà sta restituendo errori applicativi.

    La decisione architetturale che evita metà dei guai

    Prima di scrivere una riga di configurazione, conviene scegliere il modello. Per una farm web classica hai quasi sempre tre opzioni pratiche:

    • Round robin: distribuzione semplice e prevedibile, adatta quando i nodi sono omogenei.
    • Leastconn: utile quando le richieste hanno durata variabile e vuoi evitare che un nodo si riempia prima degli altri.
    • Hash o stickiness: serve quando la sessione utente deve rimanere coerente sullo stesso backend, per esempio con applicazioni che non condividono lo stato.

    La tentazione è usare stickiness ovunque. È una scorciatoia che spesso risolve un problema di sessioni locali, ma ne crea altri: sbilanciamento, recovery più lento, failover meno pulito. Se puoi, sposta lo stato fuori dal web tier: Redis, database, session store condiviso o token stateless. HAProxy deve distribuire traffico, non compensare un’architettura che conserva sessioni solo in RAM sul nodo.

    Modalità HTTP e TCP: non sono dettagli da ignorare

    HAProxy può lavorare in mode http o mode tcp. La scelta condiziona il tipo di osservabilità e le regole che puoi applicare. In HTTP hai visibilità su host, path, cookie, status code e header. Puoi fare redirect, riscritture, ACL più intelligenti e controlli più fini sui backend. In TCP, invece, sei più vicino al trasporto: ottimo per TLS passthrough, database, SMTP, o quando non vuoi terminare il protocollo sul bilanciatore.

    Per una server farm web standard, terminare TLS su HAProxy è spesso utile: semplifica i certificati lato backend, abilita regole applicative e centralizza la gestione del cifrario. Ma non è sempre la scelta migliore. Se hai vincoli di compliance, end-to-end encryption o la necessità di far vedere al backend il traffico cifrato, puoi lasciare TLS in passthrough. In quel caso però perdi parte del controllo fine sul layer applicativo.

    Health check: il vero filtro tra nodo vivo e nodo utile

    Il controllo di salute è il pezzo che fa la differenza tra un bilanciatore decorativo e uno che protegge davvero la disponibilità. Un backend può rispondere su porta 80, ma non essere in grado di servire correttamente l’app. Per questo conviene usare controlli che misurino qualcosa di significativo: un endpoint dedicato, una pagina di stato, una query minima al database se è sostenibile, oppure un check applicativo che verifichi dipendenze essenziali.

    Il criterio non deve essere “il server risponde”, ma “il server risponde in modo utile”. Se il check è troppo pesante, però, rischi di trasformarlo in un carico inutile proprio quando il nodo è sotto stress. La regola pratica è semplice: il check deve essere abbastanza profondo da scoprire il guasto che ti interessa, ma abbastanza leggero da non peggiorare la situazione.

    Un esempio tipico: per un sito PHP dietro Nginx o Apache, un endpoint /health che restituisce 200 solo se il web server e la connessione al backend critico sono OK. Se il sito ha problemi di database, quel check deve fallire e il nodo deve uscire dalla rotazione. Se invece il DB è solo uno dei servizi secondari, puoi separare il controllo “liveness” da quello “readiness”, così eviti di togliere un nodo per un malfunzionamento non bloccante.

    Configurazione essenziale: il minimo che serve davvero

    Una configurazione base, leggibile e manutenibile, batte sempre una configurazione “furba” ma opaca. Il pattern più sano è separare frontend, backend e controlli, con timeout espliciti e log utili. Ecco uno scheletro realistico per una farm HTTP semplice:

    global
        log /dev/log local0
        log /dev/log local1 notice
        maxconn 20000
        user haproxy
        group haproxy
        daemon
    
    defaults
        log global
        mode http
        option httplog
        option dontlognull
        timeout connect 5s
        timeout client  30s
        timeout server  30s
        timeout http-request 10s
    
    frontend fe_http
        bind *:80
        default_backend be_web
    
    backend be_web
        balance leastconn
        option httpchk GET /health
        http-check expect status 200
        server web1 10.0.0.11:80 check
        server web2 10.0.0.12:80 check
        server web3 10.0.0.13:80 check

    Ci sono tre scelte da notare. Primo: timeout espliciti, perché i default impliciti sono spesso troppo permissivi o troppo stretti. Secondo: leastconn, che in molti casi distribuisce meglio di round robin quando le richieste non sono uniformi. Terzo: httpchk, che verifica un endpoint controllato, non solo la porta aperta.

    Se vuoi fare terminazione TLS su HAProxy, il frontend cambia poco come concetto, ma aggiungi certificato e policy TLS. In quel caso il bilanciatore diventa anche punto di gestione della cifratura, quindi il blast radius di una modifica ai certificati o ai parametri TLS è più ampio: tocca direttamente la capacità di servire traffico pubblico.

    Distribuzione delle connessioni: round robin, leastconn e pesi

    Round robin è facile da capire, ma non sempre è il più giusto. Se i backend sono identici e le richieste hanno durata simile, funziona bene. Se invece una parte delle richieste è lenta e un’altra è veloce, round robin può mandare in saturazione un nodo mentre un altro resta sottoutilizzato. In quel caso, leastconn tende a essere più robusto perché guarda al numero di connessioni attive, non solo al turno.

    pesi servono quando i nodi non sono uguali. Puoi assegnare più traffico a server più capienti o più vicini al carico atteso. È una soluzione pratica durante una migrazione graduale, oppure quando una parte della farm è su hardware diverso. Però attenzione: i pesi non risolvono problemi di saturazione applicativa. Se un nodo ha CPU più alta ma il database è lo stesso collo di bottiglia per tutti, aumentare il peso può solo spostare il punto di rottura.

    Un dettaglio che in molti trascurano è il comportamento in caso di degradazione parziale. Se hai un backend che risponde ma con latenza alta, i check base non lo escludono. Per questo, oltre al successo/fallimento, conviene osservare metriche come p95 latency, error rate e backlog delle code. HAProxy può dirti molto, ma non può leggere la salute dell’app al posto tuo se l’app risponde comunque con lentezza cronica.

    Stickiness: quando serve davvero e quando è un debito tecnico mascherato

    La persistenza di sessione ha senso quando non puoi eliminare lo stato locale in tempi brevi. Per esempio, una vecchia applicazione che salva la sessione in memoria o un flusso utente che non tollera il cambio di nodo a metà transazione. In HAProxy puoi usare cookie di persistenza, hashing su IP o altre chiavi applicative. Ma ogni forma di stickiness riduce la libertà del bilanciatore: se un nodo diventa caldo, i client già “attaccati” continueranno a gravitarci sopra.

    Il consiglio operativo è semplice: usa stickiness come misura temporanea o mirata, non come architettura di base. Se la tua farm cresce, la persistenza può diventare una trappola: rende i failover meno puliti, complica i deploy rolling e crea distribuzioni sbilanciate difficili da leggere. Quando possibile, preferisci sessioni condivise o applicazioni stateless. È meno comodo all’inizio, ma più pulito nel tempo.

    Osservabilità: senza log e metriche stai guidando al buio

    Un bilanciatore senza osservabilità ti dice poco oltre il “funziona/non funziona”. In produzione ti serve sapere almeno: quante richieste arrivano, quante falliscono, quali backend sono in salute, quanto tempo impiegano le connessioni e dove si accumula la coda. Il log HTTP di HAProxy è utile perché conserva status code, tempi e backend selezionato; con quei dati puoi capire se il problema è a monte o a valle.

    Se hai un sistema di monitoring, esporta le metriche e guarda trend e non solo istantanee. Un backend che passa da 20 ms a 300 ms di latenza media prima di cadere ti sta già dando un segnale. Anche il numero di connessioni attive per server è un indicatore utile: se uno sale costantemente sopra gli altri, il bilanciamento o la performance applicativa stanno diverging. Non aspettare il 502 per accorgertene.

    Per una verifica rapida, puoi usare:

    sudo systemctl status haproxy
    sudo journalctl -u haproxy --since "15 min ago"
    ss -ltnp | grep haproxy

    Il primo comando conferma che il servizio sia attivo, il secondo ti mostra errori recenti o reload falliti, il terzo verifica le porte effettivamente in ascolto. Se il servizio è up ma il traffico non passa, spesso il problema sta nei backend, nei firewall o nei controlli di salute.

    Failover, manutenzione e rollout senza tagliare il ramo su cui sei seduto

    Una server farm non si amministra solo in condizioni normali. Devi sapere come togliere un nodo dalla rotazione senza interrompere il servizio. HAProxy supporta la manutenzione in modo abbastanza pulito: puoi disabilitare un server, attendere che le connessioni esistenti finiscano e poi applicare patch o riavvii. Questo è il classico caso in cui il bilanciamento fa risparmiare tempo, ma solo se i timeout e la gestione delle connessioni sono stati pensati bene prima.

    Nel rollout, la sequenza corretta è quasi sempre: aggiornare un backend alla volta, verificare health check e risposta applicativa, poi proseguire. Se fai un deploy simultaneo su tutti i nodi, il bilanciatore non può proteggerti da un bug introdotto nello stesso momento su tutta la farm. Qui il blast radius è evidente: più nodi tocchi insieme, più alta è la probabilità di trasformare un difetto locale in un outage globale.

    Il rollback va tenuto semplice: versione precedente della configurazione, pacchetto precedente se necessario, e un modo rapido per riattivare i backend stabili. In altre parole, la via di ritorno deve essere più corta della via di andata. Se per tornare indietro devi ricostruire tutto a mano, il tuo bilanciatore è già un rischio operativo.

    Errori tipici che vedo ripetersi

    Il primo errore è confondere bilanciamento con alta disponibilità. HAProxy distribuisce il traffico, ma se il punto unico di ingresso è uno solo, hai comunque un single point of failure. Per questo in ambienti seri il layer di bilanciamento va ridondato con un IP virtuale, un cluster, un servizio cloud o un meccanismo equivalente.

    Il secondo errore è usare check troppo banali. “Porta aperta” non significa “servizio sano”. Il terzo è non allineare timeout di HAProxy, web server e applicazione. Se il backend chiude dopo 60 secondi ma il proxy si aspetta una risposta in 300, il comportamento percepito dagli utenti sarà incoerente e difficile da diagnosticare. Il quarto è non testare il failover con traffico reale o almeno realistico: in laboratorio tutto sembra ok, poi in produzione emergono sessioni appese, keep-alive troppo lunghe o nodi che rientrano in rotazione troppo presto.

    Una regola pratica per tenere la farm stabile

    Se vuoi una sintesi operativa, tieni questa: bilancia il traffico in base a ciò che sai misurare, togli dalla rotazione ciò che non è affidabile e non usare HAProxy per coprire debiti architetturali permanenti. Una configurazione sobria, con health check sensati, timeout coerenti e metriche leggibili, vale più di una configurazione piena di eccezioni che nessuno vuole più toccare.

    Quando la farm cresce, il valore vero non è “quanti server regge”, ma quanto rapidamente riesci a capire dove si sta rompendo e quanto poco traffico perdi mentre lo capisci. È lì che HAProxy fa la differenza: non solo distribuisce connessioni, ma ti dà una disciplina operativa per gestire il carico senza improvvisare.

  • Come installare Webmin su AlmaLinux 9

    Come installare Webmin su AlmaLinux 9

    Webmin su AlmaLinux 9: scelta del repository e impatto operativo

    Su AlmaLinux 9 Webmin si installa senza forzature, ma conviene farlo con una logica da produzione: prima capire da dove arriva il pacchetto, poi validare il servizio, infine aprire l’accesso solo dove serve. Il punto non è “metterlo su” e basta, ma evitare una installazione opaca che poi diventa difficile da mantenere quando arrivano aggiornamenti, firewall più stretti o policy di accesso più rigide.

    Webmin espone un’interfaccia web amministrativa sul server Linux. Questo significa superficie d’attacco aggiuntiva, porta dedicata da gestire e credenziali da trattare come un asset sensibile. Se il server è esposto su Internet, il minimo sindacale è limitare l’accesso per IP, usare HTTPS valido e verificare che il servizio sia effettivamente quello atteso dopo ogni upgrade.

    La procedura sotto assume AlmaLinux 9 recente, accesso root o sudo e un sistema con dnfsystemd e firewalld attivi. Se il server è dietro CDN, reverse proxy o security group cloud, il firewall locale non basta: va allineato con il layer di rete esterno.

    Prerequisiti minimi prima di installare

    Prima di toccare i repository, conviene verificare tre cose: risoluzione DNS funzionante, connettività in uscita verso il repository e stato del firewall locale. Sono controlli banali, ma fanno risparmiare tempo quando l’installazione si ferma su errori poco leggibili.

    Esegui questi comandi e controlla che non ci siano errori di rete o di risoluzione:

    ping -c 2 1.1.1.1
    curl -I https://download.webmin.com/
    firewall-cmd --state

    Se curl -I fallisce, non ha senso andare avanti a cercare problemi su Webmin: il problema è a monte, quasi sempre DNS, proxy o filtro in uscita. Se firewall-cmd --state restituisce running, sai già che dovrai aprire la porta 10000 dopo l’installazione.

    Aggiungere il repository Webmin in modo pulito

    Su AlmaLinux 9 il metodo più lineare è usare il repository ufficiale di Webmin. In questo modo ricevi aggiornamenti coerenti e non devi installare pacchetti manuali scaricati a mano, che sono più scomodi da auditare e da aggiornare.

    Importa la chiave e crea il file repo. Qui il punto è sapere cosa stai aggiungendo al sistema, non copiare e incollare senza verificare. Dopo l’operazione, il repository deve comparire in elenco e il pacchetto deve essere firmato dalla chiave attesa.

    sudo rpm --import https://download.webmin.com/jcameron-key.asc
    sudo tee /etc/yum.repos.d/webmin.repo > /dev/null <<'EOF'
    [Webmin]
    name=Webmin Distribution Neutral
    baseurl=https://download.webmin.com/download/yum
    enabled=1
    gpgcheck=1
    gpgkey=https://download.webmin.com/jcameron-key.asc
    EOF
    sudo dnf clean all
    sudo dnf makecache

    Se dnf makecache termina senza errori, il repository è pronto. Se invece vedi problemi TLS o di certificato, controlla ora data e ora del server: un clock sballato rompe spesso validazioni HTTPS e firma pacchetti.

    Per confermare che il repo sia stato registrato correttamente, puoi usare:

    dnf repolist | grep -i webmin

    Installazione del pacchetto e avvio del servizio

    A questo punto l’installazione è diretta. Il pacchetto principale è webmin; la dipendenza su Perl e componenti di sistema viene risolta da dnf. Su un server sano l’operazione è rapida e non richiede interventi manuali particolari.

    sudo dnf install -y webmin

    Terminata l’installazione, verifica subito che il servizio esista e sia attivo. Non dare per scontato che il pacchetto abbia anche avviato il demone senza errori.

    systemctl status webmin --no-pager
    systemctl is-enabled webmin

    Lo stato desiderato è active (running) e abilitato all’avvio. Se il servizio non parte, il primo posto da guardare è il journal di systemd, che in genere dà il motivo reale del fallimento, non solo il sintomo.

    journalctl -u webmin -b --no-pager

    Un errore abbastanza comune in ambienti particolarmente chiusi è il binding sulla porta 10000 bloccato da policy o conflitti locali. In quel caso il journal lo mostra chiaramente. Prima di cambiare configurazione, però, conviene confermare che nessun altro processo stia già ascoltando sulla stessa porta.

    ss -ltnp | grep ':10000'

    Apertura della porta 10000 nel firewall locale

    Webmin ascolta di default sulla porta TCP 10000. Se firewalld è attivo, senza regola dedicata la UI non sarà raggiungibile dall’esterno. Qui il criterio giusto è aprire solo ciò che serve, non allargare il profilo del server più del necessario.

    La regola minima è questa:

    sudo firewall-cmd --permanent --add-port=10000/tcp
    sudo firewall-cmd --reload
    sudo firewall-cmd --list-ports | grep 10000

    Se il server è in un ambiente con zone multiple, verifica anche la zona effettivamente assegnata all’interfaccia:

    firewall-cmd --get-active-zones

    Un errore classico è aprire la porta nella zona sbagliata e poi chiedersi perché il servizio non risponde. Se la zona attiva non è public, la regola va aggiunta lì o la NIC va riallineata alla zona corretta.

    Primo accesso via browser e verifica del certificato

    Il primo accesso avviene su https://IP_DEL_SERVER:10000/ oppure sul nome host del server, se il DNS è già corretto. Webmin usa HTTPS di default e presenta un certificato che, in molte installazioni fresh, può essere autofirmato o comunque non allineato al nome pubblico. Questo non è un bug: è semplicemente il punto da sistemare subito dopo il login iniziale.

    Dal browser controlla due cose: che la pagina di login si apra e che il certificato corrisponda al nome con cui intendi usare il pannello. Se stai entrando via IP e il certificato è emesso per un FQDN, il warning è normale. Per un uso serio, però, conviene spostarsi presto su un hostname valido e su una PKI coerente.

    Se vuoi verificare da shell cosa sta presentando il servizio, usa:

    openssl s_client -connect 127.0.0.1:10000 -servername localhost < /dev/null | sed -n '1,20p'

    La verifica locale è utile perché separa il problema di rete da quello applicativo: se in locale il servizio risponde e da remoto no, il colpevole è quasi sempre il firewall, il security group o un layer intermedio come NAT o reverse proxy.

    Accesso sicuro: account, privilegi e limitazione per IP

    Webmin va trattato come una console amministrativa, non come una normale pagina web. L’errore più frequente è lasciarlo esposto a Internet con credenziali deboli o riutilizzate. La correzione più efficace è combinare password robuste, accesso ristretto per IP e, se possibile, un livello ulteriore di protezione davanti al servizio.

    Se devi operare in ambienti più stretti, puoi limitare l’accesso a livello firewall. Esempio con sorgente singola autorizzata:

    sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.10/32" port port="10000" protocol="tcp" accept'
    sudo firewall-cmd --permanent --remove-port=10000/tcp
    sudo firewall-cmd --reload

    Questa scelta riduce drasticamente il rumore sulla porta amministrativa, ma ha un effetto collaterale evidente: se cambi IP di amministrazione, perdi accesso finché non aggiorni la regola. Il rollback è semplice: riapri temporaneamente la porta o modifica la rich rule con il nuovo indirizzo sorgente.

    In alternativa, se il server è dietro un jump host o una VPN, è preferibile non esporre direttamente 10000 su rete pubblica. In quel caso il design corretto è accesso solo da rete privata o tunnel cifrato, lasciando la porta chiusa all’esterno.

    Verifica post-installazione: servizio, porta e log

    Dopo l’installazione non basta “vedere la pagina”. Serve una verifica minima e ripetibile. Il set essenziale è: servizio attivo, porta in ascolto, login raggiungibile e nessun errore ricorrente in log. Questo è il punto in cui una buona installazione si distingue da una installazione solo apparentemente funzionante.

    systemctl status webmin --no-pager
    ss -ltnp | grep ':10000'
    journalctl -u webmin -n 50 --no-pager

    Se il servizio è attivo e la porta ascolta, ma il browser non raggiunge la UI, il problema è quasi certamente fuori dal demone: firewall, ACL cloud, routing o DNS. Se invece il demone non ascolta, torna al journal e non perdere tempo sul frontend.

    Per una verifica sintetica via HTTPs puoi usare:

    curl -kI https://127.0.0.1:10000/

    Il codice atteso è una risposta valida del server, tipicamente 200 o un redirect di login. Se ottieni timeout o connection refused, il problema è a livello di servizio o binding. Se ottieni risposta in locale ma non da remoto, il problema è di rete.

    Impostazioni utili subito dopo il primo login

    Una volta dentro, la priorità non è esplorare i menu ma mettere in sicurezza e rendere coerente l’accesso. Le prime tre cose da fare sono: cambiare la password se non l’hai già fatto in fase di provisioning, verificare il timezone del server e controllare che l’hostname sia quello corretto per i certificati e per i log.

    Se usi Webmin per gestire servizi di sistema, ricordati che molte azioni amministrative toccano file in /etc e richiedono disciplina operativa. Prima di salvare modifiche importanti, avere un backup del file o almeno una copia del contenuto precedente è una buona abitudine. Su un server in produzione, questa non è formalità: è tempo guadagnato quando qualcosa va storto.

    Un esempio pratico: se cambi la configurazione del servizio Webmin o dei moduli collegati, conserva sempre un riferimento al file originale e verifica poi il riavvio del servizio. La sequenza corretta è modifica, validazione, reload o restart, controllo del journal.

    Problemi comuni e lettura rapida dei sintomi

    Quando Webmin non si comporta come previsto, i sintomi aiutano a capire il layer rotto. Pagina irraggiungibile con connection refused indica servizio fermo o porta non in ascolto. Timeout suggerisce firewall, routing o ACL esterne. Certificato non valido segnala un mismatch di hostname o una CA non fidata. Login che fallisce può essere un problema di credenziali, account bloccato o policy PAM.

    Se compare un errore dopo l’installazione, il journal resta il primo artefatto da leggere. In genere basta questo blocco per evitare tentativi casuali:

    journalctl -u webmin -b --no-pager | tail -n 100

    Se invece il problema è solo di accesso remoto, conviene testare anche il layer di rete con una prova da un host esterno autorizzato. Il valore non è il ping, ma la porta TCP 10000 effettivamente raggiungibile.

    nc -vz IP_DEL_SERVER 10000

    Disinstallazione o rollback se qualcosa non torna

    Se l’installazione introduce un problema operativo e vuoi tornare indietro, il rollback è lineare: fermare il servizio, rimuovere il pacchetto, eliminare la regola firewall dedicata e ripristinare eventuali file di configurazione modificati. Prima di farlo, però, verifica che non ci siano dipendenze operative che stavi usando per amministrare il server.

    sudo systemctl stop webmin
    sudo dnf remove -y webmin
    sudo firewall-cmd --permanent --remove-port=10000/tcp
    sudo firewall-cmd --reload

    Se hai applicato una rich rule per IP specifico, rimuovi anche quella. L’obiettivo del rollback non è solo disinstallare il pacchetto, ma tornare a uno stato di esposizione equivalente a quello precedente.

    Assunzioni: procedura eseguita su AlmaLinux 9 con accesso sudo, firewalld attivo e repository Webmin ufficiale raggiungibile; eventuali ACL cloud o reverse proxy non sono stati modificati in questa guida.