Otrzymuj żądania dziennika Apache, kiedy przychodzą, a nie kiedy kończą

9

Próbuję zdiagnozować dziwny problem z awarią serwera ( serwer reaguje na polecenia ping, ale nie przyjmuje połączeń SSH do momentu ponownego uruchomienia. 0% procesora ), gdy ponowne uruchomienie serwera przywraca wszystko do normy. Chciałbym, aby moje dzienniki dostępu Apache (lub jakiś inny dziennik) zawierały wszystkie żądania, które zostały wykonane poprawnie w momencie awarii, ale niestety Apache nie rejestruje żądań, dopóki nie zostaną ukończone. Oznacza to, że jeśli żądanie powoduje awarię serwera, to żądanie nigdy się nie kończy i dlatego nie pojawia się w logach.

Czy jest jakiś sposób, aby skonfigurować Apache, aby tworzył plik dziennika, do którego zapisywane są przy nadejściu żądań?

Ben Dilts
źródło
Spójrz również na swoją konfigurację DNS, zepsuty lub zawieszający się serwer DNS może powodować wszelkiego rodzaju problemy z SSH i nie może się zalogować. [Kto wie, co może zrobić z Apache - upewnij się, że wyszukiwanie nazw hosta jest wyłączone.]
Sean Kimball,

Odpowiedzi:

15

Myślę, że potrzebujesz rejestrowania kryminalistycznego, zobacz ten link: http://httpd.apache.org/docs/current/mod/mod_log_forensic.html

skrawek:

Format dziennika kryminalistycznego:

Każde żądanie jest rejestrowane dwa razy. Pierwszy raz jest zanim zostanie przetworzony dalej (to znaczy po otrzymaniu nagłówków). Drugi wpis dziennika jest zapisywany po przetworzeniu żądania w tym samym czasie, w którym następuje normalne rejestrowanie.

Aby zidentyfikować każde żądanie, przypisywany jest unikalny identyfikator żądania. Ten identyfikator sądowy może być rejestrowany krzyżowo w normalnym dzienniku transferu przy użyciu ciągu formatu% {forensic-id} n. Jeśli używasz mod_unique_id, zostanie użyty wygenerowany identyfikator.

Pierwszy wiersz rejestruje identyfikator sądowy, wiersz żądania i wszystkie odebrane nagłówki, oddzielone znakami potoku (|). Przykładowa linia wygląda następująco (wszystkie w jednym wierszu):

+ yQtJf8CoAB4AAFNXBIEAAAAA | GET /manual/de/images/down.gif HTTP / 1.1 | Host: localhost% 3a8080 | Agent użytkownika: Mozilla / 5.0 (X11; U; Linux i686; en-US; rv% 3a1.6) Gecko / 20040216 Firefox / 0.8 | Akceptuj: obraz / png itp.

Znak plus na początku wskazuje, że jest to pierwszy wiersz dziennika tego żądania. Drugi wiersz zawiera tylko znak minus i identyfikator:

-yQtJf8CoAB4AAFNXBIEAAAAA

Skrypt check_forensic przyjmuje jako argument nazwę pliku dziennika. Szuka tych par +/- ID i narzeka, jeśli prośba nie została zakończona.

sandroid
źródło
Właśnie tego szukałem, ale nie wygląda na to, że mogę okresowo wymazywać ten dziennik (rm /var/log/apache2/forensic.log co godzinę) lub rejestrowanie danych sądowych po prostu psuje się, dopóki nie uruchomię ponownie apache. Pomysły?
Ben Dilts,
na pewno, jeśli masz jakieś logi Apache, tak się stanie. Spróbuj użyć logrotate lub innego odpowiednika w twoim środowisku, aby okresowo tworzyć dzienniki (pod względem czasu lub rozmiaru). Jeśli nie, zamiast go usunąć, spróbuj przenieść plik, a następnie dotknij /var/log/apache2/forensic.log (choć sprawdź uprawnienia)
sandroid
2

Odpowiedź Sandroida jest odpowiednia na twoje pytanie, ale powinieneś naprawdę rozważyć uruchomienie przechwytywania pakietów sieciowych. Jeśli masz zasoby, wykonanie kopii lustrzanej portu w przełączniku i użycie drugiego komputera z systemem WireShark do zarejestrowania całego ruchu IP może naprawdę pomóc. Jeśli coś zabiera serwer do punktu, w którym usługi inne niż HTTP nie odpowiadają, może to oznaczać usunięcie stosu IP, zanim złe dane dotrą do Apache.

Jeśli możesz się upewnić, że komputer z przechwytywaniem ma inny sprzęt sieciowy i / lub sterowniki niż inny. Ssałbym rozbijać dwa za cenę jednego. ;-)

znak
źródło