2013-06-06 24 views
6

Tak więc miałem tylko godzinę na odkrycie, dlaczego moje logi przeszły beserk z powolnymi ostrzeżeniami skryptu php dosłownie kilka razy co minutę przez ostatnie kilka godzin.php5-fpm + nginx + google bot = zerowanie połączenia przez równorzędnego użytkownika

Początkowo koncentrowałem się na php slow logach i dziennikach błędów php odmieniających myślenie, że to mój kod. Tak się składa, że ​​wprowadzałem pewne poprawki DNS, dlatego też zostałem wprowadzony na złą drogę.

W końcu sprawdziłem dziennik błędów nginx, który ujawnił linię po linii resetu połączenia przez równorzędny od prawie tego samego adresu IP.

Przeszukałem adresy IP i stwierdziłem, że należą do google, więc był to najwyraźniej bot google/pająk odwiedzający witrynę.

Oto klip błędu zalogować

2013/06/06 14:04:05 [error] 12313#0: *7435269 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 209.85.238.187, server: www.domain.com, request: "GET /c.html?q=xyz HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.domain.com" 
2013/06/06 14:04:05 [error] 12308#0: *7435135 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 209.85.238.167, server: www.domain.com, request: "GET /c.html?q=xyz HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.domain.com" 
2013/06/06 14:04:05 [error] 12308#0: *7435994 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 209.85.238.199, server: www.domain.com, request: "GET /c.html?q=xyz HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.domain.com" 
2013/06/06 14:04:12 [error] 12309#0: *7436209 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 209.85.238.168, server: www.domain.com, request: "GET /c.html?q=xyz HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.domain.com" 
2013/06/06 14:05:12 [error] 12309#0: *7441608 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 209.85.238.177, server: www.domain.com, request: "GET /c.html?q=xyz HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.domain.com" 
2013/06/06 14:05:15 [error] 12310#0: *7440634 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 209.85.238.219, server: www.domain.com, request: "GET /c.html?q= xyz HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.domain.com" 
2013/06/06 14:05:15 [error] 12313#0: *7441634 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 209.85.238.194, server: www.domain.com, request: "GET /c.html?q=xyz HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.domain.com" 
2013/06/06 14:06:02 [error] 12310#0: *7444721 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 209.85.238.221, server: www.domain.com, request: "GET /c.html?q=xyz HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.domain.com" 
2013/06/06 14:06:05 [error] 12308#0: *7443911 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 209.85.238.203, server: www.domain.com, request: "GET /c.html?q=xyz HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.domain.com" 
2013/06/06 14:06:05 [error] 12309#0: *7445423 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 209.85.238.164, server: www.domain.com, request: "GET /c.html?q=xyz HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.domain.com" 
2013/06/06 14:06:05 [error] 12310#0: *7445640 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 209.85.238.222, server: www.domain.com, request: "GET /c.html?q=xyz HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.domain.com" 

Co jest przyczyną resetowania połączenia Peer. Czy bot google rzeczywiście odwiedzałby stronę i kończyłby tę prośbę, aby sprawdzić, czy żyje?

To niezbyt miłe, ponieważ wywołuje moje polecenia zwijania, które następnie należą do wątku sierocego, ponieważ klient zakończył działanie. Oznacza to, że po prostu przestają działać, powodując powolne skrypty php.

Czy przeczytałem to niepoprawnie?

+0

Gogle Gogle nie przerywają próśb w normalnym przypadku. Odwiedzają strony w normalny sposób. Czasem stawki trafień są bardzo wysokie, ale nie kończą połączeń. –

Odpowiedz

0

Jeśli spojrzeć komunikat błędu, to mówi

podczas czytania nagłówka odpowiedzi od góry

co oznacza, że ​​problem nie jest to, że Google jest kończące wniosek, ale raczej, że nginx na Upstream, którym jest php-fpm, kończy żądanie. Zwykle jest to spowodowane błędem, w którym uruchomiony jest kod php.

Biorąc pod uwagę, że nie mamy kod, tutaj są pewne ogólne kroki rozwiązywania problemów:

  • w konfiguracji PHP-FPM za zwiększ wartości request_terminate_timeout, max_input_time i max_execution_time.
  • Aktywuj rejestrowanie błędów w plikach konfiguracyjnych php.ini lub puli .conf (ale nie "display_error", jeśli jest to witryna produkcyjna).
  • Spróbuj uruchomić debugger na uruchomionym kodzie (xdebug jest bardzo użyteczny), aby przejść przez kod, a natkniesz się na większość problemów.