Powinieneś zaobserwować uruchomionych wiele procesów httpd w Twoim systemie,
ale nie powinieneś wysyałać żadnych sygnałów sterujących do nich z wyjątkiem procesu parent,
którego pid zapisany jest w PidFile. Wynika z tego, że
nie powinieneś potrzebować wysyłać żadnych sygnałów do jakiegokolwiek procesu z wyjątkiem
procesu parent. Są trzy sygnały które możesz wysłać do procesu parent:
TERM, HUP, i USR1, które zostaną za chwilę opisane.
Aby wysłać sygnał do procesu parent powinieneś wydać komendę:
kill -TERM `cat /usr/local/etc/httpd/logs/httpd.pid`
Możesz przeczytać o postępach wydając komendę:
tail -f /usr/local/etc/httpd/logs/error_log
Zmodyfikuj powyższe przykłady aby pasowały do Twoich ustawień
ServerRoot i
PidFile.
Wysyłanie sygnału TERM do procesu parent powoduje natychamistową próbę
zatrzymania wszystkich własnych procesów children. Może to zająć kilka sekund aby zatrzymać
wszystkie własne procesy children. Następnie proces parent zatrzymuje sam siebie. Wszystkie
prośby połączenia w czasie zatrzymywania i potem są odrzucane.
Wysyłanie sygnału HUP do procesu parent powoduje zatrzymanie procesów
children podobnie jak sygnał TERM ale nie zatrzymuje samego procesu parent.
Następuje ponowne odczytanie plików konfiguracyjnych, otwarcie logów, uruchomienie nowych
procesów children i kontynuacja pracy serwera.
Użytkownicy modułu
status module
powninni zaobserwować że statystyka serwera zostaje wyzerowana, kiedy zostanie wysłany
sygnał HUP.
Uwaga:Jeżeli Twoje pliki konfiguracyjne zawierają błędy i wydasz polecenie zrestartowania Twój proces parent nie zrestartuje się i zakończy błędnie pracę. Zobacz niżej metodę która zapobiega temu.
Uwaga: Do wersji 1.2b9 ten kod jest w miarę niestabilny i nie powinien być używany w całości.
Sygnał USR1 powoduje, że proces parent zawiadamia proces children
aby zakończyl pracę po skończeniu odpowiadania na prośby połączeń (lub do natychmiastowego
zakończenia pracy jeżeli dany proces nie serwuje żadnej usługi). Proces parent odczytuje ponownie
pliki konfiguracyjne i otwiera logi. Jeżeli jeden z procesów child zakończy pracę, proces
parent uruchomi nowy proces child w miejsce poprzedniego. Nowy proces child rozpoczyna pracę
natychmiast po wywołaniu go.
Kod ten jest zaprojektowany aby zawsze zwracał uwagę na ustawienia MaxClients, MinSpareServers, i MaxSpareServers. Idąc dalej, kod ten zwraca uwagę na StartServers w następujący sposób: Jeżeli po jednej sekundzie nie będzie utworzony choćby jeden proces children kod utworzy wystarczającą ilość procesów do zlikwidowania zastoju w pracy serwera. Można powiedzieć, że kod ten próbuje utrzymać odpowiednią liczbę procesów children stosowną do aktualnego obciążenia serwera.
Użytkownicy modułu
status module
powinni zaobserwować, że statystyka sewera nie zostaje wyzerowana podczas wysłania
sygnału USR1. Kod ten został napisany aby zminimalizować czas w którym serwer
nie jest aktywny i nie odpowiada na żądania połączeń (połączenia powinny być kolejkowane przez
system, także nie powinny nigdzie zaginąć) a także żeby respektował Twoje polecenia które
mają usprawnić działanie serwera.
W czasie wykonywania kodu, utrzymywany jest scoreboard wykorzystywany do
utrzymania ścieżek między wszystkimi procesami children.
Moduł status module wykorzystuje również G do wskazywania procesów
children, które nadal serwują prośby połączeń przed podaniem sygnału graceful restart.
Obecnie nie ma możliwości rotacji logów używając USR1 aby być pewnym,
że wszystkie procesy zakończyły zapisywanie do logów
proponujemy ustawić odpowiednie opóźnienie po wysłaniu sygnału USR1 przed
przystąpieniem do robienia czegokolwiek ze starymi logami. Na przykład jeżeli większość
z Twoich zadań zabiera mniej niż 10 minut do zakończenia przesyłania danych użytkownikom
mających wolne łącze, możesz poczekać 15 minut zanim będziesz robił cokolwiek ze starymi
logami.
Uwaga:Jeżeli Twoje pliki konfiguracyjne zawierają błędy i wydasz polecenie restartowania wtedy Twój proces parent nie zrestatuje się, zakończy błędnie działanie. W przypadku graceful restart zostawi działające procesy children a sam zakończy pracę. (Procesy te zakończą pracę po zakończeniu aktualnego połączenia.) To stworzy problem, jeżeli będziesz chciał zrestartować serwer -- nie będzie można powiązać portów na których były prowadzone nasłuchiwania. Aby temu zapobiec obecnie jedyną możliwością jest sprawdzenie składni swoich plików przed zrestartowaniem. Łatwiejszym sposobem jest uruchomienie httpd jako zwykły użytkownik. Jeżeli nie będzie błędów, httpd spróbuje otworzyć socket'y oraz logi. W tym momencie nie uda mu się to ponieważ nie ma praw administratora (lub działający w tym samym czasie inny httpd wykorzystuje już te porty). Jeżeli nie uda się to z jakiegokolwiek innego powodu oznacza to prawdopodobnie błąd pliku konfiguracyjnego. Błąd ten powinien zostać poprawiony przed ponownym restartem.
Wersje Apache'a do 1.2b9 miały kilka race condidions komplikujących restartowanie i "umieranie" sygnałów (prosty opis race condidion : problem wrażliwości na czas, jeżeli wydarzyło się coś w nie właściwym czasie, lub zachowało sie nie tak jak zostało to przewidziane). Dla tych systemów gdzie mieliśmy prawo modyfikacji wyeliminowaliśmy tak dużo jak tylko to możliwe. Ale mimo to problem race conditions z pewnością istnieje.
Systemy, które używają na dysku ScoreBoardFile
mogą potencjalnie uszkadzać własne scoreboard'y. Coś takiego może pojawić się gdy
adres jest już w użyciu (po sygnale HUP) lub po dłuższej utracie procesu child (po
sygnale USR1).
Pierwszy z dwóch wymienionych błędów jest nieunikniony, po chwili powoduje, że serwer traci
scoreboard slot. Zatem wskazane jest restartowanie serwera w trybie graceful (łagodnym) czasami
potrzebny jest "twardy" restart. Błędy te są uciążliwe przy ciągłej pracy, ale na szczęście
większość systemów nie wymaga pliku scoreboard. Zajrzyj do dokumentacji ScoreBoardFile
aby poznać metodę, która określa czy Twój system wykorzystuje ScoreBoard'y.
NEXT i MACHTEN (tylko dla procesorów 68k) mają małe race conditions,
które mogą powodować restartowanie/"umieranie" sygnałów ale nie powinno być to przyczyną innych
problemów z serwerem.
Wszystkie systemy posiadają niewielkie race conditions, każdy proces child pociąga za sobą coraz to kolejne żądania połączeń do procesu HTTP (KeepAlive). Proces ten może zakończyć działanie po odpowiedzi na żądanie połączenia ale przed przeczytaniem nagłówków. Istnieje rozwiązanie tego problemu, ale zostało odkryte zbyt późno aby zostało załączone do wersji 1.2. Teoretycznie nie powinno to przeszkadzać ponieważ klienci KeepAlive i tak oczekują takich zdarzeń spowodowanymi timeout'ami w sieci. W praktyce wygląda na to że na nic to nie ma wpływu -- podczas testu serwer był restartowany dwadzieścia razy na sekundę a klientom z powodzeniem wyświetlały się dokumenty, bez jakichkolwiek błędów.