Curl Error 52 Пустой ответ от сервера

98

У меня есть настройка задания cron на одном сервере для запуска сценария резервного копирования на PHP, который размещен на другом сервере. Команда, которую я использовал, имеет следующий формат:

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

В последнее время я получаю эту ошибку при запуске Cron

curl: (52) Empty reply from server

Я без понятия что это значит. Если я перейду по ссылке прямо в браузере, скрипт будет работать нормально, и я получу свой небольшой архивный zip-файл.

Кто-нибудь может предоставить информацию об этом?

Пол Шелдрейк
источник
Это действительно не имеет ничего общего с PHP, поскольку curl не заботится о том, что такое процессор вывода файлов.
Кевин Пено
1
Может ли ваш сценарий резервного копирования работать так долго, что это вызывает curlтайм-аут? Вы пытались увеличить время ожидания curl по умолчанию для подключения --connect-timeout <seconds>и выполнения всей операции --max-time <seconds>?
Измир Рамирес
@YzmirRamirez код ошибки тайм-аута curl: 28. Src: ec.haxx.se/usingcurl-timeouts.html
Luckylooke
С Docker + Uvicorn (FastAPI) мне помогло установить --host 0.0.0.0
TechWisdom

Ответы:

73

Это может произойти, если curl попросят выполнить простой HTTP на сервере, который поддерживает HTTPS.

Пример:

$ curl http://google.com:443
curl: (52) Empty reply from server
Бенуа Дюффес
источник
7
Так было в моем случае. curl localhost:8443дал мне пустую ошибку ответа. curl -k https://localhost:8443правильно обслужил страницу.
lowly_junior_sysadmin 01
1
Я только что наткнулся на это, и я полностью пропустил недостающие s. Интересно, почему нет более явной ошибки (даже если в соединении отказано: было бы больше смысла).
ShinTakezou
45

Curl выдает эту ошибку, когда от сервера нет ответа, поскольку HTTP не отвечает ни на что на запрос.

Я подозреваю, что проблема в том, что между вами и рассматриваемым хостом есть какая-то часть сетевой инфраструктуры, например брандмауэр или прокси. Следовательно, чтобы это заработало, вам потребуется обсудить проблему с людьми, ответственными за это оборудование.

Стив Найт
источник
19
Вероятно, это неправильный подход к устранению неполадок. Пустой ответ означает, что он смог подключиться к IP / порту, но сервер ничего не вернул в ответе. Вероятно, проблема в самой службе.
Роберт Кристиан
4
Не совсем так. Когда это случилось со мной, это произошло из-за того, что мой прокси-сервер для аутентификации не подключался к удаленному хосту. Так что на самом деле никаких проблем с самой услугой не было.
Стив Найт,
В моем случае у меня есть прокси, который отключен для интерфейса обратной связи, на котором работает сервер.
rbaleksandar
В моем случае это сервер веб-кеша NGINX, на котором не осталось места на жестком диске.
Alien Life Form
8

В моем случае это было перенаправление сервера; curl -Lрешил мою проблему.

Гильермо Пранди
источник
8

Это может произойти, когда сервер не отвечает из-за 100% использования ЦП или памяти.

Я получил эту ошибку, когда пытался получить доступ к API sonarqube, но сервер не отвечал из-за полного использования памяти

Джаяпракаш
источник
7

Другой распространенной причиной пустого ответа является тайм-аут. Проверьте все переходы, с которых выполняется задание cron, на ваш PHP / целевой сервер. Вероятно, где-то в строке есть устройство / сервер / nginx / LB / прокси, которое завершает запрос раньше, чем вы ожидали, что приводит к пустому ответу.

уборщик мусора
источник
5

В случае SSL-соединений это может быть вызвано проблемой в более старых версиях сервера nginx, которая отказала во время запросов curl и Safari. Эта ошибка была исправлена ​​около версии 1.10 nginx, но в Интернете все еще есть много более старых версий nginx.

Для администраторов nginx: добавление ssl_session_cache shared:SSL:1m;в httpблок должно решить проблему.

Я знаю, что OP запрашивал случай, отличный от SSL, но поскольку это верхняя страница в goole по проблеме «пустой ответ с сервера», я оставляю здесь ответ SSL, так как я был одним из многих, кто бился головой к стене с этим вопросом.

SiliconMind
источник
3

В моем случае это было вызвано проблемой PHP APC. В первую очередь нужно посмотреть журналы ошибок Apache (если вы используете Apache).

Надеюсь, это кому-то поможет.

Эндрю МакКомб
источник
Не могли бы вы объяснить немного больше? Как это может быть вызвано APC? Я даже не запускаю это внутри PHP, я просто использую командную строку.
Нино Шкопач
Это было так давно, я не могу вспомнить причину, по которой APC была причиной этой проблемы. Извините, я не могу помочь.
Эндрю МакКомб,
2

эта ошибка также может произойти, если сервер обрабатывает данные. Обычно это случается со мной, когда я публикую файлы на веб-сайтах REST API, которые содержат много записей и требуют много времени для создания и возврата записей.

Тьяго Конрадо
источник
1

вы можете попробовать этот curl -sS " http://www.example.com/backup.php ", поместив свой URL-адрес в "", который сработал для меня. Я не знаю точной причины, но я полагаю, что поместив URL-адрес в " "завершает запрос к серверу или просто завершает заголовок запроса.

омар
источник
1

У меня была эта проблема раньше. Выяснилось, что у меня было другое приложение, использующее тот же порт (3000).

Легкий способ узнать это:

В терминале введите netstat -a -p TCP -n | grep 3000(замените порт, который вы используете, на «3000»). Если прослушивающих устройств несколько, значит, этот порт уже занят чем-то другим. Вы должны остановить этот процесс или изменить порт для нового процесса.

джинна
источник
2
Это очень конкретный случай, о котором вы упомянули. В общем, не поэтому curl возвращает вам этот ответ. Оказывается, эту проблему нужно решать на стороне сервера, а не на стороне клиента. Вот где я понял.
Аашиш Чаубей
1

В моем случае (curl 7.47.0) это связано с тем, что я content-lengthвручную установил заголовок в команде curl со значением, которое рассчитывается почтальоном (я использовал почтальона для создания параметров команды curl и копирования их в оболочку). После удаления заголовка content-lengthнормально работает.

YouCL
источник
0

Попробуйте это -> Вместо того, чтобы проходить через cURL, попробуйте проверить связь с сайтом, который вы пытаетесь достичь, с помощью Telnet. Ответ, который возвращает ваша попытка подключения, будет именно тем, что cURL видит, когда пытается подключиться (но который он бесполезно скрывает от вас). Теперь, в зависимости от того, что вы здесь видите, вы можете сделать один из нескольких выводов:

Вы пытаетесь подключиться к веб-сайту, который является виртуальным хостом на основе имени, то есть к нему нельзя получить доступ через IP-адрес. Что-то пошло не так с именем хоста - возможно, вы что-то опечатали. Обратите внимание, что использование GET вместо POST для параметров даст вам более конкретный ответ.

Проблема также может быть связана с заголовком 100-continue. Попробуйте запустить curl_getinfo($ch, CURLINFO_HTTP_CODE)и проверьте результат.

Феликс
источник
Интересный момент. Я был на самом деле в состоянии получить HTML в ответ с telnet hostnameиGET <url>
Нино Škopac
0

Мой случай был связан с истечением срока действия сертификата SSL

Друван
источник
-1

В моем случае я использовал uwsgi, добавил свойство http-timeout более 60 секунд, но он не работал из-за дополнительного места, а файл конфигурации не загружался должным образом.

Анкит Адлаха
источник
-2

Это происходит, когда вы пытаетесь получить доступ к защищенному веб-сайту, например Https.

Надеюсь, ты пропустил 's'

Попробуйте изменить URL-адрес на curl -sS -u "username: password" https://www.example.com/backup.php

Мутукришнан
источник
3
Совершенно нет. И, кстати, какое отношение простой auth "username: password" имеет к https?
Нино Шкопач
часть ответа auth создает впечатление, что вы не знаете, почему странно добавлять это к ответу.
Skid Kadda