Co to jest błąd curl 52 „pusta odpowiedź z serwera”?

101

Mam konfigurację zadania cron na jednym serwerze, aby uruchomić skrypt kopii zapasowej w PHP, który jest hostowany na innym serwerze.

Polecenie, którego używałem, to

curl -sS http://www.example.com/backup.php

Ostatnio otrzymuję ten błąd, gdy Cron działa:

curl: (52) Empty reply from server

Jeśli przejdę do linku bezpośrednio w przeglądarce, skrypt działa dobrze i otrzymuję mały plik zapasowy ZIP.

Paul Sheldrake
źródło
To naprawdę nie ma nic wspólnego z PHP, ponieważ curl nie dba o to, jaki jest procesor plików wyjściowych.
Kevin Peno
1
Czy twój skrypt kopii zapasowej może działać tak długo, że powoduje przekroczenie curllimitu czasu? Czy próbowałeś zwiększyć domyślne oczekiwanie curl na połączenie --connect-timeout <seconds>i całą operację --max-time <seconds>?
Yzmir Ramirez
Kod błędu @YzmirRamirez przekroczenia limitu czasu curl to 28. Src: ec.haxx.se/usingcurl-timeouts.html
Luckylooke
Dzięki Docker + Uvicorn (FastAPI) pomogło mi to ustawić --host 0.0.0.0
TechWisdom

Odpowiedzi:

77

Może się to zdarzyć, jeśli curl zostanie poproszony o wykonanie zwykłego protokołu HTTP na serwerze, który obsługuje protokół HTTPS.

Przykład:

$ curl http://google.com:443
curl: (52) Empty reply from server
Benoit Duffez
źródło
8
Tak było w moim przypadku. curl localhost:8443dał mi pusty błąd odpowiedzi. curl -k https://localhost:8443poprawnie obsłużył stronę.
lowly_junior_sysadmin
1
Właśnie się o to natknąłem i kompletnie przegapiłem brakujące elementy. Zastanawiam się, dlaczego nie ma bardziej wyraźnego błędu (nawet jeśli odmówiono połączenia: miałoby to większy sens).
ShinTakezou
45

Curl podaje ten błąd, gdy nie ma odpowiedzi z serwera, ponieważ brak odpowiedzi na żądanie jest błędem HTTP.

Podejrzewam, że problem, który masz, polega na tym, że między Tobą a danym hostem istnieje jakaś infrastruktura sieciowa, taka jak zapora lub serwer proxy. W związku z tym, aby to zadziałało, będzie wymagało omówienia problemu z osobami odpowiedzialnymi za ten sprzęt.

Steve Knight
źródło
20
Jest to prawdopodobnie niewłaściwe podejście do rozwiązywania problemów. Pusta odpowiedź oznacza, że ​​był w stanie połączyć się z adresem IP / portem, ale serwer nic nie zwrócił w odpowiedzi. Prawdopodobnie jest to problem dotyczący samej usługi.
Robert Christian
4
Cóż, niezupełnie. Kiedy mi się to przydarzyło, było to spowodowane tym, że mój uwierzytelniający serwer proxy nie łączył się ze zdalnym hostem. Tak więc w rzeczywistości nie było problemu z samą usługą.
Steve Knight
W moim przypadku mam proxy, które jest wyłączone dla interfejsu sprzężenia zwrotnego, na którym działa serwer.
rbaleksandar
W moim przypadku serwer pamięci podręcznej WWW NGINX bez wolnego miejsca na dysku twardym.
Alien Life Form
9

W moim przypadku było to przekierowanie serwera; curl -Lrozwiązał mój problem.

Guillermo Prandi
źródło
9

Może się to zdarzyć, gdy serwer nie odpowiada z powodu 100% wykorzystania procesora lub pamięci.

Otrzymałem ten błąd, kiedy próbowałem uzyskać dostęp do sonarqube API, a serwer nie odpowiadał z powodu pełnego wykorzystania pamięci

Jayaprakash
źródło
8

Innym częstym powodem pustej odpowiedzi jest przekroczenie limitu czasu. Sprawdź wszystkie przeskoki, z których jest wykonywane zadanie crona, do twojego serwera PHP / docelowego. Prawdopodobnie gdzieś wzdłuż linii znajduje się urządzenie / serwer / nginx / LB / proxy, które kończy żądanie wcześniej niż oczekiwano, powodując pustą odpowiedź.

Śmieciarz
źródło
5

W przypadku połączeń SSL może to być spowodowane problemem w starszych wersjach serwera nginx, który segfaulta podczas żądań curl i Safari. Ten błąd został naprawiony w wersji 1.10 nginx, ale wciąż jest wiele starszych wersji nginx w Internecie.

Dla administratorów nginx: dodanie ssl_session_cache shared:SSL:1m;do httpbloku powinno rozwiązać problem.

Zdaję sobie sprawę, że OP prosił o przypadek bez SSL, ale ponieważ jest to pierwsza strona w goole dla problemu „pusta odpowiedź z serwera”, zostawiam tutaj odpowiedź SSL, ponieważ byłem jednym z wielu, którzy walili w głowę pod ścianą z tym problemem.

SiliconMind
źródło
3

W moim przypadku było to spowodowane problemem PHP APC. Pierwszym miejscem do obejrzenia byłyby dzienniki błędów Apache (jeśli używasz Apache).

Mam nadzieję, że to komuś pomoże.

Andrew McCombe
źródło
Czy możesz wyjaśnić trochę więcej? Jak może to być spowodowane przez APC? Nie uruchamiam tego nawet w PHP, po prostu używam wiersza poleceń.
Nino Škopac
To było tak dawno, że nie pamiętam powodu, dla którego APC było przyczyną tego problemu. Przepraszam, nie mogę pomóc.
Andrew McCombe,
2

ten błąd może również wystąpić, jeśli serwer przetwarza dane. Zwykle zdarza mi się, gdy wysyłam pliki do witryn REST API, które mają wiele wpisów i zajmują dużo czasu tworzenie i zwracanie rekordów

Thiago Conrado
źródło
1

możesz wypróbować to curl -sS " http://www.example.com/backup.php ", umieszczając swój adres URL w "", który działał w moim przypadku Nie znam dokładnego powodu, ale przypuszczam, że umieszczenie adresu URL w "" „kończy żądanie do serwera lub po prostu kończy żądanie nagłówka.

omar
źródło
1

Miałem ten problem wcześniej. Okazało się, że mam inną aplikację używającą tego samego portu (3000).

Łatwy sposób, aby to sprawdzić:

W terminalu wpisz netstat -a -p TCP -n | grep 3000(zastąp port, którego używasz, jako „3000”). Jeśli nasłuchuje więcej niż jeden, coś innego już zajmuje ten port. Powinieneś zatrzymać ten proces lub zmienić port dla nowego procesu.

ginna
źródło
2
To bardzo szczególny przypadek, o którym wspomniałeś. Ogólnie nie jest to powód, dla którego curl zwraca tę odpowiedź. Okazuje się, że tą kwestią trzeba zająć się po stronie serwera, a nie po stronie klienta. Tutaj zrozumiałem.
Aashish Chaubey
1

W moim przypadku (curl 7.47.0) dzieje się tak dlatego, że content-lengthręcznie ustawiłem nagłówek polecenia curl z wartością, która jest obliczana przez listonosza (użyłem listonosza do wygenerowania parametrów polecenia curl i skopiowania ich do powłoki). Po usunięciu nagłówka content-lengthdziała normalnie.

YouCL
źródło
0

Spróbuj tego -> Zamiast przechodzić przez cURL, spróbuj pingować witrynę, do której próbujesz dotrzeć za pomocą Telnetu. Odpowiedź zwrócona przez twoją próbę połączenia będzie dokładnie tym, co cURL widzi, kiedy próbuje się połączyć (ale którą niepomocnie maskuje przed tobą). Teraz, w zależności od tego, co tu widzisz, możesz wyciągnąć jeden z kilku wniosków:

Próbujesz połączyć się z witryną internetową, która jest hostem wirtualnym opartym na nazwie, co oznacza, że ​​nie można uzyskać do niej dostępu za pośrednictwem adresu IP. Coś poszło nie tak z nazwą hosta - być może coś zostało wpisane błędnie. Zauważ, że użycie GET zamiast POST dla parametrów da ci bardziej konkretną odpowiedź.

Problem może być również powiązany z nagłówkiem 100-continue. Spróbuj biegać curl_getinfo($ch, CURLINFO_HTTP_CODE)i sprawdź wynik.

Felix
źródło
Ciekawy punkt. Właściwie udało mi się uzyskać HTML jako odpowiedź za pomocą telnet hostnameiGET <url>
Nino Škopac
0

Mój przypadek był spowodowany wygaśnięciem certyfikatu SSL

Druvan
źródło
0

Sporadycznie natrafiałem na ten błąd i nie mogłem zrozumieć. Googlowanie nie pomogło.

W końcu się dowiedziałem. Prowadzę kilka kontenerów docker, między innymi NGINXi Apache. Dostępne polecenie dotyczy konkretnego kontenera, uruchomione Apache. Okazało się, że mam również cronpracę, wykonując czasami ciężkie podnoszenie ciężarów, pracując na tym samym kontenerze. W zależności od obciążenia tego cronkontenera, nie był on w stanie odpowiedzieć na moje polecenie w odpowiednim czasie, co spowodowało, error 52 empty reply from servera nawet 502 Bad Gateway.

Odkryłem i zweryfikowałem to po prostu, curlgdy zauważyłem, że proces, który badałem, zajął mniej niż 2 sekundy i nagle otrzymałem błąd 52, a następnie błąd 502, a potem znowu mniej niż 2 sekundy - więc zdecydowanie nie był to mój kod który pozostał niezmieniony. Używając ps auxw kontenerze, widziałem uruchomiony i zrozumiany inny proces.

Właściwie, to przeszkadza 502 Bad Gatewayze NGINXz pracy długo działających i nie można go naprawić z odpowiednimi parametrami, więc w końcu poddał się i włącza te rzeczy Apache. Dlatego jeszcze bardziej zaskoczyły mnie te błędy.

Rozwiązanie jest proste. Właśnie odpaliłem kilka instancji tego kontenera za pomocą docker service scalei to wszystko. dockersamodzielne równoważenie obciążenia.

kklepper
źródło
-1

W moim przypadku używałem uwsgi, dodałem właściwość http-timeout na ponad 60 sekund, ale nie działała z powodu dodatkowej przestrzeni i plik konfiguracyjny nie ładował się poprawnie.

Ankit Adlakha
źródło
-2

Dzieje się tak, gdy próbujesz uzyskać dostęp do bezpiecznej witryny internetowej, takiej jak Https.

Mam nadzieję, że przegapiłeś „s”

Spróbuj zmienić adres URL na curl -sS -u "nazwa użytkownika: hasło" https://www.example.com/backup.php

Muthukrishnan
źródło
3
Bardzo nie. A tak przy okazji, co ma wspólnego z prostym uwierzytelnianiem „nazwa użytkownika: hasło” z https?
Nino Škopac
część auth odpowiedzi sprawia, że ​​wydaje się, że nie wiesz, dlaczego dodawanie tego do odpowiedzi jest dziwne.
Skid Kadda