Avviare, fermare e riavviare Apache: comandi e differenza con graceful
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) |
|---|---|---|
| Avvio | systemctl start httpd | systemctl start apache2 |
| Arresto | systemctl stop httpd | systemctl stop apache2 |
| Riavvio | systemctl restart httpd | systemctl restart apache2 |
| Rilettura della configurazione (graceful) | systemctl reload httpd | systemctl reload apache2 |
| Controllo dello stato | systemctl status httpd | systemctl status apache2 |
| Avvio automatico al boot | systemctl enable httpd | systemctl 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 apache2Unit 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 httpdstart avvia un Apache fermo. Per verificare che sia partito, usa systemctl status.
systemctl stop httpdstop ferma Apache. Finché non lo riavvii, non accetta richieste web.
systemctl restart httpdrestart 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 80active (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 httpdactiveCon 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 httpdenabledenabled 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=mixedLa 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.
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 -tSyntax OKEseguendo 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 httpdSe 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.
🔢 FAQ & contenuti consigliati
Apache · Errore di riavvio
Errore di riavvio di Apache | (20014)Internal error: Error retrieving pid file logs/httpd.pid
Perché comandi come apachectl restart danno un errore sul file pid e i passaggi per sistemare un httpd.pid vuoto.
Apache · php-fpm
Avviso max_children di php-fpm: trova la causa nei log prima di aumentare i worker
Il resoconto di come abbiamo trovato nei log la causa degli avvisi max_children accumulati su un server WordPress con Nginx, Apache e php-fpm.
ℹ️ 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.