Apache: uruchamianie, zatrzymywanie i restart – polecenia i różnica z graceful
Na serwerze Linux Apache uruchamia się, zatrzymuje i restartuje poleceniem systemctl, a nazwa usługi to httpd w rodzinie RHEL i apache2 w rodzinie Debian. Po przeczytaniu wyniku systemctl status, pliku unit httpd i skryptu apachectl na serwerze AlmaLinux 9 okazało się, że restart wyłącza Apache i uruchamia go ponownie, a graceful zostawia proces nadrzędny i tylko ponownie wczytuje konfigurację.
Ponieważ zatrzymanie i restart naprawdę wstrzymują usługę, na serwerze testowym nie uruchamialiśmy start, stop ani restart. Zamiast tego sprawdziliśmy działanie w oficjalnej dokumentacji Apache, w podręczniku httpd.service i w zapisach reload pozostawionych na serwerze. Nazwa hosta, numer portu, godziny i liczby żądań w wyniku poniżej to wartości przykładowe.
1️⃣ Polecenia do uruchamiania, zatrzymywania i restartu Apache
Nazwa usługi Apache zależy od rodziny dystrybucji. Rodzina RHEL, czyli RHEL, AlmaLinux i Rocky Linux, rejestruje ją w systemd jako httpd, a Ubuntu i Debian jako apache2.
| Zadanie | Rodzina RHEL (httpd) | Rodzina Debian (apache2) |
|---|---|---|
| Uruchomienie | systemctl start httpd | systemctl start apache2 |
| Zatrzymanie | systemctl stop httpd | systemctl stop apache2 |
| Restart | systemctl restart httpd | systemctl restart apache2 |
| Ponowne wczytanie konfiguracji (graceful) | systemctl reload httpd | systemctl reload apache2 |
| Sprawdzenie stanu | systemctl status httpd | systemctl status apache2 |
| Automatyczne uruchamianie przy starcie systemu | systemctl enable httpd | systemctl enable apache2 |
Polecenia z tabeli uruchamiaj jako root. Na zwykłym koncie dodaj sudo przed poleceniem.
Jeśli pomylisz rodziny i wpiszesz drugą nazwę, polecenie się nie wykona. Zapytanie o stan przez apache2 na serwerze z rodziny RHEL zwróciło błąd, że nie znaleziono unitu.
systemctl status apache2Unit apache2.service could not be found.Kod wyjścia wynosił wtedy 4, a po zmianie nazwy na httpd na tym samym serwerze pojawił się normalny wynik.
W rodzinie RHEL Apache uruchamia się, zatrzymuje i restartuje trzema poleceniami poniżej.
systemctl start httpdstart uruchamia zatrzymany Apache. Czy wystartował, sprawdzisz poleceniem systemctl status.
systemctl stop httpdstop zatrzymuje Apache. Dopóki go znowu nie uruchomisz, nie przyjmuje żądań WWW.
systemctl restart httpdrestart wykonuje po kolei stop i start. Jeśli zmieniasz tylko pliki konfiguracyjne, zastosuj je przez reload (graceful), który nie zrywa połączeń.
W AlmaLinux 9 apachectl to skrypt powłoki zainstalowany zamiast apachectl dostarczanego przez Apache. Po otrzymaniu start, stop, restart i status przekazuje je bez zmian do systemctl, więc apachectl restart i systemctl restart httpd robią to samo.
2️⃣ Sprawdzanie stanu usługi Apache
To, czy Apache teraz działa i kiedy wystartował, sprawdzisz poleceniem 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) w wierszu [Active] oznacza, że usługa właśnie działa, a godzina po since to moment startu. Ten serwer wystartował 11 dni wcześniej i ani razu się nie zatrzymał, a [Main PID] 741 to proces nadrzędny uruchomiony wtedy.
W [CGroup] pod 741 są wymienione procesy potomne, które faktycznie obsługują żądania (zobacz Procesy). Wiersz [Status] pokazuje liczbę dotąd obsłużonych żądań oraz liczbę wolnych i zajętych workerów.
Trzy wiersze logu na dole wyniku to zapisy reload pozostawiane raz dziennie o tej samej godzinie: narzędzie logrotate, które dzieli logi według dat, po zakończeniu rotacji wykonało systemctl reload httpd, a podręcznik httpd.service również podaje, że po logrotate httpd dostaje reload.
W skryptach i poleceniach kontrolnych używaj is-active i is-enabled, które wypisują tylko jedno słowo.
systemctl is-active httpdactiveGdy usługa działała, pojawiło się active i kod wyjścia 0. Nawet dla apache2, którego na serwerze nie ma, pojawiło się inactive i kod wyjścia 3, tak samo jak dla zatrzymanej usługi, więc w skryptach najpierw sprawdź, czy nazwa usługi jest poprawna.
systemctl is-enabled httpdenabledenabled oznacza, że Apache jest zarejestrowany do automatycznego uruchamiania przy starcie systemu.
3️⃣ Różnica między restartem Apache a graceful
restart i graceful (reload) inaczej traktują żądania w toku i proces nadrzędny. Tę różnicę najpierw sprawdziliśmy w wierszach pliku unit httpd używanych przy reload i stop.
systemctl cat httpd | grep -E "Exec|Kill"ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
KillSignal=SIGWINCH
KillMode=mixedWiersz ExecReload oznacza, że reload uruchamia httpd -k graceful, a wiersz KillSignal oznacza, że sygnał wysyłany przy stop to SIGWINCH (graceful-stop).
Dlatego systemctl restart httpd zatrzymuje Apache przez graceful-stop, a potem uruchamia go od nowa. Żądania w toku są kończone przed wyłączeniem, ale sam proces nadrzędny startuje od nowa, więc numer [Main PID] się zmienia. Między zatrzymaniem a startem port jest zamknięty i nowe połączenia nie są przyjmowane. Plik unit apache2.service z pakietu Debiana też przy zatrzymaniu uruchamia apachectl graceful-stop.
httpd -k restart wysyła do procesu nadrzędnego sygnał HUP. Według oficjalnej dokumentacji Apache proces nadrzędny zostaje, ale procesy potomne kończą się od razu, więc żądania w toku są przerywane, a statystyki żądań wracają do 0.
graceful wysyła do procesu nadrzędnego sygnał USR1. Proces nadrzędny ponownie wczytuje pliki konfiguracyjne, a każdy proces potomny jest zastępowany procesem z nową konfiguracją, gdy tylko skończy obsługiwane żądanie. Połączenia, które przychodzą w tym czasie, czekają w kolejce systemu operacyjnego, więc nie giną.
To tak, jakby sklep nie zamykał drzwi, a każdy kasjer po obsłużeniu klienta przekazywał stanowisko koledze z nowego grafiku.
Tę różnicę sprawdziliśmy po Main PID. Choć reload działał codziennie, Main PID 741 i czas Active pozostały takie jak 11 dni wcześniej, a numery procesów potomnych (2930111 itd.) następowały zaraz po 2930107 z wiersza [Process] ostatniego reload.
systemctl reload httpd, apachectl graceful i httpd -k graceful to ten sam graceful. W AlmaLinux 9 apachectl po otrzymaniu graceful wysyła przez systemctl kill sygnał SIGUSR1 do procesu nadrzędnego, a apachectl -k graceful z -k na początku pomija -k i robi to samo.
graceful tylko ponownie wczytuje konfigurację, więc nie nadaje się po aktualizacji pakietu httpd. Według podręcznika httpd.service reload nie jest bezpieczny, jeśli zaktualizowany moduł korzysta z funkcji, która istnieje tylko w nowym httpd, dlatego pakiet httpd przy aktualizacji automatycznie restartuje Apache poleceniem systemctl try-restart.
4️⃣ Sprawdzanie składni konfiguracji Apache
Nawet jeśli zmiany stosujesz przez graceful, żeby nie zrywać połączeń, Apache nie przejdzie na nową konfigurację, gdy w pliku konfiguracyjnym jest literówka. Według oficjalnej dokumentacji Apache restart i graceful przed wykonaniem najpierw sprawdzają składnię, a przy błędzie tylko wypisują komunikat błędu i nie restartują.
Dlatego po poprawieniu konfiguracji najpierw sprawdź składnię poleceniem apachectl -t.
apachectl -tSyntax OKapachectl -t wypisał jeden wiersz Syntax OK, a apachectl configtest dał ten sam wynik. apachectl z rodziny RHEL po otrzymaniu -t uruchamia po prostu httpd -t.
Sprawdzenie testowego pliku konfiguracyjnego z jedną błędnie wpisaną nazwą dyrektywy dało zamiast Syntax OK błąd AH00526 z numerem wiersza i nierozpoznaną dyrektywą ([Invalid command 'DirectoryIndx']), a kod wyjścia wyniósł 1. Popraw wiersz wskazany w komunikacie błędu i sprawdź ponownie.
systemctl reload httpdGdy sprawdzenie przejdzie, zastosuj konfigurację przez reload. Według oficjalnej dokumentacji Apache sprawdzenie składni patrzy tylko na składnię, więc zastosowanie może się nie udać, nawet jeśli sprawdzenie przeszło. Po reload jeszcze raz sprawdź wiersz [Active] w systemctl status i logi na samym dole.
🔲 Symulator poleceń Apache
Na wirtualnym serwerze w symulatorze poniżej możesz sam wpisywać polecenia systemctl, apachectl i httpd -k. Po reload Main PID zostaje ten sam i zmieniają się tylko numery procesów potomnych. Po restart nawet Main PID dostaje nowy numer.
🔢 FAQ & polecane treści
Apache · Błąd restartu
Błąd restartu Apache | (20014)Internal error: Error retrieving pid file logs/httpd.pid
Skąd bierze się błąd pliku pid przy poleceniach takich jak apachectl restart i jak uporządkować pusty httpd.pid.
Apache · php-fpm
Ostrzeżenie php-fpm max_children: ustal przyczynę w logach, zanim dodasz workery
Zapis tego, jak na serwerze WordPress z Nginx, Apache i php-fpm znaleźliśmy w logach przyczynę narastających ostrzeżeń max_children.
ℹ️ Informacja o linkach partnerskich
Treści tej witryny zawierają linki partnerskie. Jeśli odwiedzający kupi produkt lub usługę przez taki link, witryna otrzymuje od sprzedawcy prowizję. Kwota płacona przy tym przez kupującego (podczas promocji spada↓) nie wzrasta. Podane ceny, rabaty i dostępność odnoszą się do chwili pisania i mogą różnić się od stanu faktycznego, dlatego przed zakupem sprawdź je u sprzedawcy. Produkty wybieramy i oceniamy według własnych kryteriów, a prowizja nie wpływa ani na kolejność prezentacji, ani na treść ocen.