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.
curl
limitu czasu? Czy próbowałeś zwiększyć domyślne oczekiwanie curl na połączenie--connect-timeout <seconds>
i całą operację--max-time <seconds>
?Odpowiedzi:
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:
źródło
curl localhost:8443
dał mi pusty błąd odpowiedzi.curl -k https://localhost:8443
poprawnie obsłużył stronę.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.
źródło
W moim przypadku było to przekierowanie serwera;
curl -L
rozwiązał mój problem.źródło
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
źródło
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ź.
źródło
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;
dohttp
bloku 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.
źródło
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.
źródło
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
źródło
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.
źródło
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.źródło
W moim przypadku (curl 7.47.0) dzieje się tak dlatego, że
content-length
rę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łówkacontent-length
działa normalnie.źródło
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.źródło
telnet hostname
iGET <url>
Mój przypadek był spowodowany wygaśnięciem certyfikatu SSL
źródło
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
NGINX
iApache
. Dostępne polecenie dotyczy konkretnego kontenera, uruchomioneApache
. Okazało się, że mam równieżcron
pracę, wykonując czasami ciężkie podnoszenie ciężarów, pracując na tym samym kontenerze. W zależności od obciążenia tegocron
kontenera, nie był on w stanie odpowiedzieć na moje polecenie w odpowiednim czasie, co spowodowało,error 52 empty reply from server
a nawet502 Bad Gateway
.Odkryłem i zweryfikowałem to po prostu,
curl
gdy 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ącps aux
w kontenerze, widziałem uruchomiony i zrozumiany inny proces.Właściwie, to przeszkadza
502 Bad Gateway
zeNGINX
z 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 rzeczyApache
. 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 scale
i to wszystko.docker
samodzielne równoważenie obciążenia.źródło
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.
źródło
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
źródło