2013-08-02 12 views
8

Miałem losowe błędy 500 Internal Server na moich stronach opartych na PHP/MySQL na różnych współdzielonych hostach. Używam PHP 5.2.17 do CGI/FastCGI na współużytkowanym serwerze Linux. Kiedy patrzę w dzienniki, widzę to:Losowy PHP FastCGI/Połączenie resetowane przez peer/niekompletne nagłówki

[error] [client 75.71.176.224] (104)Connection reset by peer: FastCGI: comm with server "/dev/shm/blackmou-php.fcgi" aborted: read failed, referer: ... 
[error] [client 75.71.176.224] FastCGI: incomplete headers (0 bytes) received from server "/dev/shm/blackmou-php.fcgi", referer: ... 
[error] [client 75.71.176.224] (104)Connection reset by peer: FastCGI: comm with server "/dev/shm/blackmou-php.fcgi" aborted: read failed, referer: ... 
[error] [client 75.71.176.224] FastCGI: incomplete headers (0 bytes) received from server "/dev/shm/blackmou-php.fcgi", referer: ... 

Ktoś wie, jak rozwiązać ten problem?

+0

Ktoś wie, jak rozwiązać ten problem? –

+0

Czy przypadkiem nie jesteś w GoDaddy? Podobne problemy pojawiły się w jednej witrynie, którą tam hostujemy. – andrewsi

+0

Mamy błąd z 1 i 1 i Nexcess. Spędziliśmy dużo czasu na zaglądaniu w to. Nie znaleźliśmy dokładnego problemu, ale myślę, że to problem związany z pamięcią. Wysłaliśmy całą witrynę na innym hoście i nie mieliśmy żadnych problemów. –

Odpowiedz

11

Ten problem nie jest związany tylko z hostem, dotyczy również programisty, w zależności od konfiguracji. Jednak niektórzy gospodarze są raczej surowi z FastCGI i ograniczą twoje możliwości. Generalnie łatwiej jest uruchomić bez użycia FastCGI i po prostu użyć mod_php, chyba że masz konkretną potrzebę użycia FastCGI w swojej aplikacji.

Musielibyśmy zobaczyć twoje opakowanie fcgi (co znajduje się w /dev/shm/blackmou-php.fcgi) lub .htaccess dla odrodzenia FastCGI, aby lepiej Ci pomóc, nie wiedząc, które pliki i kod, który znajduje się na tych plikach Wystąpił problem z. Czy twoi gospodarze używają Apache, LightHttpd lub Nginx (lub kombinacji)? W tym momencie zdecydowanie zalecam aktualizację do używania PHP 5.3.9+

Ponieważ może to być spowodowane przez dowolną liczbę problemów, FastCGI skutecznie zapobiega atakowaniu witryny/skryptów przez Denial of Service lub awarię z powodu pamięci przecieki, itp. (EG: próbowanie obsługi 80 000 połączeń po prostu przez zrzucenie i ograniczenie liczby żądań lub utknięcie w nieskończonej pętli przez przekroczenie limitu czasu i zakończenie procesu)

Ten błąd w szczególności jest generowany przez idle_timeout (domyślnie 30 sekund) lub maksymalny limit procesów potomnych. Może to być również spowodowane przez osobę, która uruchamia długo działający skrypt i zamyka przeglądarkę/połączenie przed ukończeniem skryptu.

FastCGI uruchamia wrapper procesu, wykonuje polecenie, limit czasu przed zakończeniem procesu, połączenie widziane jako resetowane przez peer.

Innym przykładem jest to, że osiągnięto maksymalną liczbę dzieci (maxProcesses) (EG: wiele witryn pokazuje 2 lub 4 jako przykład, gdy w rzeczywistości może być potrzebne 20 lub 50 w zależności od średniego natężenia ruchu) Jeśli wszystkie dzieci są obecnie aktywne oraz dodatkowe żądanie/połączenie, dzieci są ograniczone do maxProcesses, do których FastCGI nie będzie dzielić aktywnych dzieci, więc musi najpierw zakończyć proces i rozpocząć nowy proces podrzędny, lub odrzucić żądanie, w zależności od konfiguracji .

Oto więcej informacji o ustawieniach:

http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html

http://www.fastcgi.com/drupal/node/10

Wrapper Przykład

PHP_FCGI_CHILDREN=0 #no limit 
export PHP_FCGI_CHILDREN 
PHP_FCGI_MAX_REQUESTS=10000 
export PHP_FCGI_MAX_REQUESTS 

UPDATE

Aby dodać do tego, może to być również spowodowane limitem pamięci php

Jeśli powyższe nie rozwiąże problemu, zaktualizuj swój php.ini zwiększyć memory_limit

+1

To było dokładnie to. Było to połączenie zbyt wielu procesów i funkcji zabijania pamięci w witrynie. –

+0

To jest świetna informacja, dziękuję! – workflow

0

dla każdego, kto szuka Więcej informacji:

w moim przypadku, nie było problemem kod. W przychodzącym żądaniu http wywoływano wewnętrzny kod URL z poziomu kodu, tworząc sytuację typu zakleszczenia.

Doprowadziło to do zawieszonych procesów PHP i spowodowało awarię serwera. używaliśmy funkcji file_get_contents ("URL") lub cURL() w naszej funkcji zwrotnej. Następnie zastąpiliśmy go prostą funkcją drupal, która dostarczyła nam wartości z DB.

Narzędzie NewRelic pomogło mi zidentyfikować funkcję, która wymagała dużo czasu.

Innym sposobem zidentyfikowania tego byłoby wykonanie drupal_watchdog na naszej funkcji wywołania zwrotnego i zweryfikowanie logów, gdy serwer się zawiesił.

mam nadzieję, że to pomoże.

+1

Innym doskonałym darmowym narzędziem do użycia jest profil i funkcje śledzenia Xdebug. Mogą porównywać aplikacje, informować o wszystkich żądaniach i przekierowaniach oraz określać, które funkcje są najdłuższe do wykonania. Działa podczas uruchamiania skryptu, zrzuca dzienniki w określonym miejscu i można użyć przeglądarki dziennika xdebug, aby wyświetlić wyniki. Również większość IDE można zintegrować, aby z niego korzystać, nawet ze zdalnych serwerów i przeglądarki. – fyrye

+0

dzięki za informacje. Próbuję spróbować. –

Powiązane problemy