Démarrer, arrêter et redémarrer Apache : commandes et différence avec graceful
Sur un serveur Linux, on démarre, arrête et redémarre Apache avec la commande systemctl ; le nom du service est httpd dans la famille RHEL et apache2 dans la famille Debian. Après avoir lu la sortie de systemctl status, le fichier d'unité de httpd et le script apachectl sur un serveur AlmaLinux 9, nous avons constaté que restart arrête Apache puis le relance, alors que graceful garde le processus parent et relit seulement la configuration.
Comme l'arrêt et le redémarrage interrompent réellement le service, nous n'avons pas exécuté start, stop ni restart sur le serveur de test. Nous avons plutôt vérifié le comportement à l'aide de la documentation officielle d'Apache, du manuel httpd.service et des traces de reload présentes sur le serveur. Le nom d'hôte, le numéro de port, les heures et le nombre de requêtes de la sortie ci-dessous sont des valeurs d'exemple.
1️⃣ Commandes pour démarrer, arrêter et redémarrer Apache
Le nom du service Apache dépend de la famille de distribution. La famille RHEL, comme RHEL, AlmaLinux et Rocky Linux, l'enregistre dans systemd sous le nom httpd, et Ubuntu et Debian sous le nom apache2.
| tâches | Famille RHEL (httpd) | Famille Debian (apache2) |
|---|---|---|
| Démarrer | systemctl start httpd | systemctl start apache2 |
| Arrêter | systemctl stop httpd | systemctl stop apache2 |
| Redémarrer | systemctl restart httpd | systemctl restart apache2 |
| Relire la configuration (graceful) | systemctl reload httpd | systemctl reload apache2 |
| Vérifier l'état | systemctl status httpd | systemctl status apache2 |
| Démarrage automatique au boot | systemctl enable httpd | systemctl enable apache2 |
Exécutez les commandes du tableau en root. Depuis un compte ordinaire, ajoutez sudo devant la commande.
Si vous confondez les familles et saisissez l'autre nom, la commande ne s'exécute pas. En demandant l'état avec apache2 sur un serveur de la famille RHEL, nous avons obtenu une erreur indiquant que l'unité était introuvable.
systemctl status apache2Unit apache2.service could not be found.Le code de sortie était 4, et en remplaçant le nom par httpd sur le même serveur, la sortie normale est apparue.
Dans la famille RHEL, les trois commandes ci-dessous démarrent, arrêtent et redémarrent Apache.
systemctl start httpdstart lance un Apache arrêté. Pour vérifier qu'il a bien démarré, utilisez systemctl status.
systemctl stop httpdstop arrête Apache. Il n'accepte plus de requêtes web tant que vous ne le relancez pas.
systemctl restart httpdrestart exécute stop puis start. Si vous n'avez modifié que des fichiers de configuration, appliquez-les avec reload (graceful), qui ne coupe pas les connexions.
Sous AlmaLinux 9, apachectl est un script shell installé à la place de l'apachectl fourni par Apache. Il transmet tels quels start, stop, restart et status à systemctl, si bien que apachectl restart et systemctl restart httpd font la même chose.
2️⃣ Vérifier l'état du service Apache
Pour savoir si Apache tourne en ce moment et quand il a démarré, utilisez 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) sur la ligne [Active] signifie qu'il est en cours d'exécution, et l'heure après since indique quand il a démarré. Ce serveur avait démarré 11 jours plus tôt sans jamais s'arrêter, et [Main PID] 741 était le processus parent lancé à ce moment-là.
Sous [CGroup], les entrées alignées sous 741 sont les processus enfants qui traitent réellement les requêtes (voir Processus). La ligne [Status] indique le nombre de requêtes traitées jusqu'ici ainsi que le nombre de workers inactifs et occupés.
Les trois lignes de journal en bas de la sortie étaient des traces de reload laissées une fois par jour à la même heure : l'outil logrotate, qui découpe les journaux par date, a exécuté systemctl reload httpd après la rotation, et le manuel httpd.service indique lui aussi que httpd est rechargé après logrotate.
Dans les scripts et les commandes de vérification, on utilise is-active et is-enabled, qui n'affichent qu'un seul mot.
systemctl is-active httpdactiveQuand le service tournait, nous avons obtenu active et le code de sortie 0. Même avec apache2, absent du serveur, nous avons obtenu inactive et le code de sortie 3, comme pour un service arrêté ; dans un script, vérifiez donc d'abord que le nom du service est correct.
systemctl is-enabled httpdenabledenabled signifie qu'Apache est enregistré pour démarrer automatiquement au boot.
3️⃣ Redémarrage d'Apache et graceful : la différence
restart et graceful (reload) traitent différemment les requêtes en cours et le processus parent. Nous avons d'abord vérifié cette différence dans les lignes du fichier d'unité de httpd utilisées pour reload et 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 ligne ExecReload signifie que reload exécute httpd -k graceful, et la ligne KillSignal signifie que le signal envoyé à l'arrêt est SIGWINCH (graceful-stop).
C'est pourquoi systemctl restart httpd arrête Apache avec graceful-stop puis le relance. Les requêtes en cours sont terminées avant l'arrêt, mais le processus parent lui-même redémarre, donc le numéro [Main PID] change. Entre l'arrêt et le démarrage, le port est fermé et les nouvelles connexions ne sont pas acceptées. Le fichier d'unité apache2.service du paquet Debian exécute lui aussi apachectl graceful-stop à l'arrêt.
httpd -k restart envoie un signal HUP au processus parent. Selon la documentation officielle d'Apache, le parent reste en place mais met fin immédiatement aux processus enfants, si bien que les requêtes en cours sont coupées et que les statistiques de requêtes repartent de 0.
graceful envoie un signal USR1 au processus parent. Le parent relit les fichiers de configuration, et chaque processus enfant est remplacé par un enfant utilisant la nouvelle configuration dès qu'il a terminé la requête qu'il traitait. Les connexions qui arrivent entre-temps sont mises en attente par le système d'exploitation et ne sont donc pas perdues.
C'est comme un magasin qui reste ouvert pendant que chaque caissier, après avoir servi son client, passe le relais à un collègue du nouveau planning.
Nous avons vérifié cette différence avec le Main PID. Bien que reload ait été exécuté chaque jour, le Main PID 741 et l'heure Active étaient restés ceux d'il y a 11 jours, et les numéros des processus enfants (2930111, etc.) suivaient directement le 2930107 de la ligne [Process] du dernier reload.
systemctl reload httpd, apachectl graceful et httpd -k graceful sont tous le même graceful. Sous AlmaLinux 9, apachectl envoie SIGUSR1 au processus parent avec systemctl kill lorsqu'il reçoit graceful, et apachectl -k graceful, avec -k devant, retire le -k et fait la même chose.
graceful ne fait que relire la configuration ; il ne convient donc pas après une mise à jour du paquet httpd. Selon le manuel httpd.service, reload n'est pas sûr si un module mis à jour utilise une fonction qui n'existe que dans le nouveau httpd ; c'est pourquoi le paquet httpd redémarre automatiquement Apache avec systemctl try-restart lors d'une mise à jour.
4️⃣ Vérifier la syntaxe de la configuration Apache
Même si vous appliquez les changements avec graceful pour ne pas couper les connexions, Apache ne passe pas à la nouvelle configuration si un fichier de configuration contient une faute de frappe. Selon la documentation officielle d'Apache, restart et graceful effectuent d'abord une vérification de syntaxe et, en cas d'erreur, se contentent d'afficher le message d'erreur sans redémarrer.
Après avoir modifié la configuration, vérifiez donc d'abord la syntaxe avec apachectl -t.
apachectl -tSyntax OKapachectl -t a affiché une seule ligne Syntax OK, et apachectl configtest a donné le même résultat. L'apachectl de la famille RHEL exécute httpd -t tel quel lorsqu'il reçoit -t.
En vérifiant un fichier de configuration de test contenant un nom de directive mal orthographié, nous avons obtenu, au lieu de Syntax OK, l'erreur AH00526 avec le numéro de ligne et la directive non reconnue ([Invalid command 'DirectoryIndx']), et le code de sortie était 1. Corrigez la ligne indiquée dans le message d'erreur, puis vérifiez à nouveau.
systemctl reload httpdUne fois la vérification réussie, appliquez la configuration avec reload. Selon la documentation officielle d'Apache, la vérification ne porte que sur la syntaxe ; l'application peut donc échouer même si elle réussit. Après reload, vérifiez encore une fois la ligne [Active] de systemctl status et les journaux tout en bas.
🔲 Simulateur de commandes Apache
Sur le serveur virtuel du simulateur ci-dessous, vous pouvez saisir vous-même des commandes systemctl, apachectl et httpd -k. Après reload, le Main PID reste le même et seuls les numéros des processus enfants changent. Après restart, même le Main PID prend un nouveau numéro.
🔢 FAQ & contenus recommandés
Apache · Erreur au redémarrage
Erreur au redémarrage d'Apache | (20014)Internal error: Error retrieving pid file logs/httpd.pid
Pourquoi des commandes comme apachectl restart provoquent une erreur de fichier pid, et les étapes pour nettoyer un httpd.pid vide.
Apache · php-fpm
Avertissement php-fpm max_children : trouver la cause dans les journaux avant d'ajouter des workers
Le compte rendu d'une recherche dans les journaux pour trouver pourquoi des avertissements max_children s'accumulaient sur un serveur WordPress avec Nginx, Apache et php-fpm.
ℹ️ Mention d'affiliation
Le contenu de ce site contient des liens d'affiliation. Lorsqu'un visiteur achète un produit ou un service via l'un de ces liens, le site perçoit une commission du vendeur. Le montant payé par l'acheteur(il baisse lors des promotions ↓), lui, n'augmente pas. Les prix, remises et stocks indiqués correspondent à la date de rédaction et peuvent différer ; vérifiez-les donc auprès du vendeur avant d'acheter. Les produits sont choisis et évalués selon nos propres critères, et les commissions n'influencent ni l'ordre de présentation ni le contenu des évaluations.