Avviare, fermare e riavviare Apache: comandi e differenza con graceful

Ambiente di testFamiglia RHELAlmaLinux 9.8account rootVerificato il 2026-10-29

Su un server Linux, Apache si avvia, si ferma e si riavvia con il comando systemctl, e il nome del servizio è httpd nella famiglia RHEL e apache2 nella famiglia Debian. Dopo aver letto l'output di systemctl status, il file unit di httpd e lo script apachectl su un server AlmaLinux 9, abbiamo visto che restart spegne Apache e lo riaccende, mentre graceful mantiene il processo padre e rilegge solo la configurazione.

Poiché arresto e riavvio fermano davvero il servizio, sul server di test non abbiamo eseguito start, stop né restart. Abbiamo invece verificato il comportamento con la documentazione ufficiale di Apache, il manuale di httpd.service e le registrazioni di reload rimaste sul server. Nome host, numero di porta, orari e numero di richieste nell'output qui sotto sono valori di esempio.

1️⃣ Comandi per avviare, fermare e riavviare Apache

Il nome del servizio di Apache cambia a seconda della famiglia della distribuzione. La famiglia RHEL, come RHEL, AlmaLinux e Rocky Linux, lo registra in systemd come httpd, mentre Ubuntu e Debian come apache2.

AttivitàFamiglia RHEL (httpd)Famiglia Debian (apache2)
Avviosystemctl start httpdsystemctl start apache2
Arrestosystemctl stop httpdsystemctl stop apache2
Riavviosystemctl restart httpdsystemctl restart apache2
Rilettura della configurazione (graceful)systemctl reload httpdsystemctl reload apache2
Controllo dello statosystemctl status httpdsystemctl status apache2
Avvio automatico al bootsystemctl enable httpdsystemctl enable apache2

Esegui i comandi della tabella come root. Da un account normale, metti sudo davanti al comando.

Se confondi le famiglie e usi l'altro nome, il comando non viene eseguito. Chiedendo lo stato con apache2 su un server della famiglia RHEL, è comparso un errore secondo cui l'unità non è stata trovata.

systemctl status apache2
Unit apache2.service could not be found.

Il codice di uscita era 4, e cambiando il nome in httpd sullo stesso server è comparso l'output normale.

Nella famiglia RHEL avvii, fermi e riavvii Apache con i tre comandi qui sotto.

systemctl start httpd

start avvia un Apache fermo. Per verificare che sia partito, usa systemctl status.

systemctl stop httpd

stop ferma Apache. Finché non lo riavvii, non accetta richieste web.

systemctl restart httpd

restart esegue stop e start uno dopo l'altro. Se hai cambiato solo file di configurazione, applicali con reload (graceful), che non interrompe le connessioni.

Su AlmaLinux 9, apachectl è uno script di shell installato al posto dell'apachectl distribuito da Apache. Quando riceve start, stop, restart e status, li passa così come sono a systemctl, quindi apachectl restart e systemctl restart httpd fanno la stessa cosa.

2️⃣ Controllare lo stato del servizio Apache

Per sapere se Apache è in esecuzione ora e quando è partito, usa systemctl status.

systemctl status httpd
● httpd.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; preset: disabled)
     Active: active (running) since Sat 2026-10-17 08:30:49 UTC; 1 week 4 days ago
       Docs: man:httpd.service(8)
    Process: 2930107 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS)
   Main PID: 741 (httpd)
     Status: "Total requests: 52418; Idle/Busy workers 75/0;Requests/sec: 0.0528; Bytes served/sec: 3.9KB/sec"
      Tasks: 224 (limit: 4615)
     Memory: 184.3M (peak: 593.8M)
        CPU: 47min 33.944s
     CGroup: /system.slice/httpd.service
             ├─    741 /usr/sbin/httpd -DFOREGROUND
             ├─2930111 /usr/sbin/httpd -DFOREGROUND
             ├─2930143 /usr/sbin/httpd -DFOREGROUND
             └─2930144 /usr/sbin/httpd -DFOREGROUND

Oct 28 15:00:00 server systemd[1]: Reloading The Apache HTTP Server...
Oct 28 15:00:00 server systemd[1]: Reloaded The Apache HTTP Server.
Oct 28 15:00:00 server httpd[741]: Server configured, listening on: port 80

active (running) nella riga [Active] significa che è in esecuzione, e l'orario dopo since indica quando è partito. Questo server era partito 11 giorni prima senza mai fermarsi, e [Main PID] 741 era il processo padre avviato allora.

In [CGroup], le voci elencate sotto 741 sono i processi figli che gestiscono davvero le richieste (vedi Processi). La riga [Status] mostra il numero di richieste gestite finora e quanti worker sono liberi e quanti occupati.

Le tre righe di log in fondo all'output erano registrazioni di reload lasciate una volta al giorno alla stessa ora: lo strumento logrotate, che divide i log per data, ha eseguito systemctl reload httpd dopo aver finito la rotazione, e anche il manuale di httpd.service indica che httpd viene ricaricato dopo logrotate.

Negli script e nei comandi di controllo si usano is-active e is-enabled, che stampano una sola parola.

systemctl is-active httpd
active

Con il servizio in esecuzione è uscito active con codice di uscita 0. Anche con apache2, che sul server non esiste, è uscito inactive con codice di uscita 3, come per un servizio fermo, quindi negli script verifica prima che il nome del servizio sia giusto.

systemctl is-enabled httpd
enabled

enabled significa che Apache è registrato per avviarsi automaticamente al boot.

3️⃣ Differenza tra riavvio di Apache e graceful

restart e graceful (reload) trattano in modo diverso le richieste in corso e il processo padre. Abbiamo verificato prima questa differenza nelle righe del file unit di httpd usate per reload e stop.

systemctl cat httpd | grep -E "Exec|Kill"
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
KillSignal=SIGWINCH
KillMode=mixed

La riga ExecReload significa che reload esegue httpd -k graceful, e la riga KillSignal significa che il segnale inviato allo stop è SIGWINCH (graceful-stop).

Per questo systemctl restart httpd ferma Apache con graceful-stop e poi lo riavvia. Le richieste in corso vengono completate prima dello spegnimento, ma il processo padre stesso riparte, quindi il numero di [Main PID] cambia. Tra l'arresto e l'avvio la porta resta chiusa e le nuove connessioni non vengono accettate. Anche il file unit apache2.service del pacchetto Debian esegue apachectl graceful-stop all'arresto.

httpd -k restart invia un segnale HUP al processo padre. Secondo la documentazione ufficiale di Apache, il padre resta, ma i processi figli vengono terminati subito, quindi le richieste in corso si interrompono e anche le statistiche delle richieste tornano a 0.

graceful invia un segnale USR1 al processo padre. Il padre rilegge i file di configurazione, e ogni processo figlio viene sostituito da un figlio con la nuova configurazione appena finisce la richiesta che stava gestendo. Le connessioni che arrivano nel frattempo vengono messe in attesa dal sistema operativo, quindi non vanno perse.

È come un negozio che resta aperto mentre ogni cassiere, finito con il cliente, passa il turno a un collega del nuovo orario.

🔁 Cosa cambia nei tre modi di riavviare Apache
Diagramma esplicativo
🔁 Comando
$ systemctl restart httpdhttpd -k restartsystemctl reload httpd
① Processo padre (Main PID)Si spegne e riparteIl numero di Main PID cambia.invariatoRiceve il segnale HUP e rilegge i file di configurazione.invariatoRiceve il segnale USR1 e rilegge i file di configurazione.
② Richieste in corsoCompletate, poi arrestoL'arresto è graceful-stop (WINCH), quindi le richieste in corso vengono completate.Interrotte subitoTermina subito i processi figli e avvia nuovi figli.Gestite fino alla fineOgni figlio viene sostituito da uno con la nuova configurazione appena finisce la sua richiesta.
③ Nuove connessioniNon accettate finché non riparteChiude la porta durante l'arresto.Gestite quando partono i nuovi figliLascia la porta aperta e le gestisce quando partono i nuovi figli.Non interrotteLascia la porta aperta così il sistema operativo mette in attesa le connessioni.
systemctl restart httpd ferma Apache e poi lo riavvia, quindi riparte anche il processo padre e nel frattempo le nuove connessioni non vengono accettate.
httpd -k restart invia un segnale HUP al processo padre e termina subito i processi figli, quindi le richieste in corso si interrompono.
systemctl reload httpd e apachectl graceful lasciano il processo padre com'è e sostituiscono i processi figli man mano che le loro richieste finiscono.

Abbiamo verificato questa differenza con il Main PID. Anche se reload veniva eseguito ogni giorno, il Main PID 741 e l'orario di Active erano rimasti quelli di 11 giorni prima, e i numeri dei processi figli (2930111 ecc.) venivano subito dopo il 2930107 della riga [Process] dell'ultimo reload.

systemctl reload httpd, apachectl graceful e httpd -k graceful sono tutti lo stesso graceful. Su AlmaLinux 9, apachectl invia SIGUSR1 al processo padre con systemctl kill quando riceve graceful, e anche apachectl -k graceful, con -k davanti, toglie il -k e fa la stessa cosa.

graceful rilegge solo la configurazione, quindi non è adatto dopo l'aggiornamento del pacchetto httpd. Secondo il manuale di httpd.service, reload non è sicuro se un modulo aggiornato usa una funzione che esiste solo nel nuovo httpd; per questo il pacchetto httpd, quando viene aggiornato, riavvia Apache automaticamente con systemctl try-restart.

4️⃣ Controllare la sintassi della configurazione di Apache

Anche se applichi le modifiche con graceful per non interrompere le connessioni, Apache non passa alla nuova configurazione se un file di configurazione contiene un errore di battitura. Secondo la documentazione ufficiale di Apache, restart e graceful fanno prima un controllo della sintassi e, se c'è un errore, mostrano solo il messaggio di errore senza riavviare.

Per questo, dopo aver modificato la configurazione, controlla prima la sintassi con apachectl -t.

apachectl -t
Syntax OK

Eseguendo apachectl -t è uscita una sola riga Syntax OK, e con apachectl configtest il risultato è stato lo stesso. L'apachectl della famiglia RHEL, quando riceve -t, esegue httpd -t così com'è.

Controllando un file di configurazione di prova con un nome di direttiva scritto male, al posto di Syntax OK è uscito l'errore AH00526 insieme al numero di riga e alla direttiva non riconosciuta ([Invalid command 'DirectoryIndx']), con codice di uscita 1. Correggi la riga indicata nel messaggio di errore e controlla di nuovo.

systemctl reload httpd

Se il controllo passa, applica la configurazione con reload. Secondo la documentazione ufficiale di Apache, il controllo guarda solo la sintassi, quindi l'applicazione può fallire anche se passa. Dopo reload, controlla ancora una volta la riga [Active] di systemctl status e i log in fondo.

🔲 Simulatore di comandi Apache

Nel server virtuale del simulatore qui sotto puoi digitare tu stesso comandi systemctl, apachectl e httpd -k. Dopo reload il Main PID resta lo stesso e cambiano solo i numeri dei processi figli. Dopo restart cambia anche il Main PID.

Simulatore di comandi Apachehttpd famiglia RHEL
[root@server work]#
Con i tasti ↑↓ richiami i comandi digitati prima.

🔢 FAQ & contenuti consigliati

Digitando apachectl fullstatus su AlmaLinux 9 è uscito un errore secondo cui l'opzione fullstatus non è supportata (not supported), con codice di uscita 2. L'apachectl della famiglia RHEL è uno script installato al posto dell'apachectl distribuito da Apache, quindi accetta solo start, stop, restart, status, graceful, graceful-stop, configtest, -t e -v.

Secondo il manuale di httpd.service, l'unità httpd è disattivata (disabled) per impostazione predefinita, e preset: disabled nella riga [Loaded] di systemctl status è proprio quel valore. Se esegui una volta systemctl enable httpd, si avvia a ogni boot, e aggiungendo --now a enable si avvia anche subito.

Secondo il manuale di httpd.service, se esegui httpd direttamente da una shell root, il servizio parte fuori da systemd e le restrizioni di sicurezza predefinite come SELinux non vengono applicate. Per questo avvia e ferma il servizio con systemctl o apachectl, e usa il comando httpd solo per opzioni che non avviano il servizio, come il controllo della sintassi -t.

ℹ️ Informativa sull'affiliazione
I contenuti di questo sito includono link di affiliazione. Se un visitatore acquista un prodotto o un servizio tramite uno di questi link, il sito riceve una commissione dal venditore. In questo processo l'importo pagato dall'acquirente (durante le promozioni l'importo scende↓) non aumenta. Prezzi, sconti e disponibilità indicati si riferiscono al momento della stesura e possono differire da quelli reali: prima di acquistare verifica sempre presso il venditore. I prodotti vengono scelti e valutati secondo criteri propri, e le commissioni non influiscono sull'ordine di presentazione né sul contenuto delle valutazioni.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Dimostra di essere umano: 7   +   1   =