2013-02-26 13 views
13

opis Issue - Apache logujeUndestanding „408 Przekroczenie limitu czasu żądania” na Apache z PHP

znalazłem przedmioty podobne do tego w pliku dziennika Apache:

166.147.68.243 [24/Feb/2013:06:06:25 -0500] 19 web-site.com "-" 408 - "-" 

mam niestandardowy format dziennika i 408 oznacza tutaj status. Format dziennika jest:

LogFormat "%h %t %D %V \"%r\" %>s %b \"%{User-agent}i\"" detailed 

i normalnie linia w pliku dziennika wygląda

184.73.232.108 [26/Feb/2013:08:38:16 -0500] 30677 www.site.com "GET /api/search... HTTP/1.1" 200 205 "Zend_Http_Client" 

Dlatego linie 408 błędach wyglądać dziwnie na mnie. Żadne żądanie nie jest rejestrowane i nie mam pojęcia, co należy zoptymalizować.

Pytania

Jak rozwiązać problem? Jakie dodatkowe informacje lub dzienniki należy gromadzić? Co może powodować problem? Czy coś jest nie tak na serwerze? Czy jest to absolutnie problem z połączeniem sieciowym?

Zajmuję się tym, ponieważ nasz klient skarżył się, że ma błąd 408 na swoim telefonie komórkowym. Znalazłem wiele zapisów w pliku dziennika, ale muszę przyznać, że nie wiem, co z tym zrobić.


Moje własne badania

Istnieje kilka pytań na ten temat już tutaj. Ale ludzie są znacznie bardziej konkretni. Tak jak omawiają problemy z konkretnym oprogramowaniem klienckim i skryptami. Tutaj właśnie dostałem błąd podczas otwierania strony na iPhonie.

Na przykład w HTTP, 408 Request timeout sugeruje się wykonanie żądania GET przed testem POST. Jeśli mam niestandardowego klienta, mogę to zrobić. Nie mogę jednak kontrolować zachowania przeglądarki użytkownika.

Guess # 1

Podczas przeszukiwania Internetu i myślenia o problemie znalazłem https://serverfault.com/questions/383290/too-many-408-error-codes-in-access-log

Sugestia jest aktualizacja parametru Timeout config z powrotem do wartości domyślnej.

# 
# Timeout: The number of seconds before receives and sends time out. 
# 
Timeout 300 

Najpierw wypróbowałem wartość 30, ponieważ myślałem, że 30 sekund powinno wystarczyć. Ale nawet z domyślną wartością 300 sekund, nadal otrzymuję błędy w dzienniku. Zrobiłem tail -f kiedy pisałem ten tekst i otrzymałem więcej niż 10 linii w ciągu kilku minut.

Dla mnie to nie wygląda kompletne rozwiązanie.

+0

Właśnie znalazłem pytanie http://serverfault.com/questions/383290/too-many-408-error-codes-in-access-log –

+0

Nasz limit czasu został ustawiony na 5 zamiast domyślnych 30. I Zmieniłem go z powrotem na wartość domyślną 30. Niedługo wprowadzę aktualizację, jeśli nadal otrzymuję te błędy w pliku dziennika. –

+1

Daj odpowiedź, wyjaśniając, dlaczego inne pytanie na serverfault jest takie samo i zaakceptuj to później. – mliebelt

Odpowiedz

10

Po kilku badaniach na ten temat doszedłem do następującej odpowiedzi. Jest on dostarczany przez naszego głównego programistę i myślę, że daje on dobre wyjaśnienie tematu.

Te błędy są całkowicie normalne.Nie są one oznaką większego problemu, ale normalne połączenia, które utrzymują Apache, są otwarte dłużej niż dozwolone.

Na przykład, zapytania klienta, które uruchamiały je w kółko, utrzymywały Apache otwarte. Apache odpowiedział, odpowiednio go zamykając.

Gdyby tak nie było, garstka ludzi mogłaby przejąć nasz serwer i nie pozwolić nikomu na połączenie.

Najczęściej błędy te pochodzą z systemów szukających exploitów i można je odtworzyć, otwierając sesję Telnet i pozostawiając ją otwartą.

W tym samym czasie, w dzienniku dostępu i w czasie X (KeepAliveTimeout) zobaczysz wyskakujące okno IP z tymi samymi kodami błędów.

Powrót w czasach Apache 1.3, ten błąd był powszechny, ale potem 2.2 wyszedł i usunięto go, dopóki nie poprosiliśmy o jego zwrot, ponieważ daje nam pomysły na to, ile osób otwiera właśnie portu, a nie żądanie rzeczywistego zasobu, itp.

Myślę, że nic więcej nie powinno się tutaj robić, z wyjątkiem upewnienia się, by ustawić Limit czasu na jakąś rozsądną wartość, jak opisałem w oryginalnym pytaniu.

+0

Nie sądzę, że znaczenie ma tutaj "KeepAliveTimeout" - to ustawienie służy do kontrolowania funkcjonalności, która pozostawia połączenia otwarte po wysłaniu odpowiedzi. Kluczowe ustawienie tutaj (jak można znaleźć) to 'Timeout' (całkowity czas oczekiwania/odpowiedzi), ale może się okazać, że' mod_reqtimeout' jest włączone i skonfigurowane do wcześniejszego oczekiwania na puste żądania (za pomocą 'RequestReadTimeout'). – simpleigh

+0

Właściwie ważna jest wartość KeepAliveTimeout. Jeśli KeepAlive jest włączone, a żądanie HTTP nie zostanie ukończone w czasie KeepAliveTimeout, spowoduje to błąd 408. Jeśli opcja KeepAlive jest wyłączona, pierwszeństwo ma dyrektywa Timeout. Testowałem to z wolnymi osadzonymi urządzeniami z serwerami Apache. –

Powiązane problemy