Помилка Curl 52 Порожня відповідь із сервера


99

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

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

Останнім часом я отримую цю помилку, коли запускається Cron

curl: (52) Empty reply from server

Я поняття не маю, що це означає. Якщо я переходжу за посиланням безпосередньо у своєму браузері, сценарій працює нормально, і я отримую свій маленький резервний zip-файл.

Хтось може надати якусь інформацію про це?


Це насправді не має нічого спільного з PHP, оскільки curl не цікавить, що таке вихідний файловий процесор.
Кевін Пено,

1
Чи може ваш сценарій резервного копіювання працювати так довго, що спричиняє час curlочікування? Ви пробували збільшити очікування за вибором завитки за замовчуванням, щоб з’єднатись --connect-timeout <seconds>і взяти на себе всю операцію --max-time <seconds>?
Ізмір Рамірес

Код помилки тайм-ауту згортання @YzmirRamirez - 28. Src: ec.haxx.se/usingcurl-timeouts.html
Luckylooke,

З Docker + Uvicorn (FastAPI) мені допомогло встановити --host 0.0.0.0
TechWisdom

Відповіді:


74

Це може статися, якщо 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

1
Я щойно натрапив на це і повністю пропустив відсутні. Цікаво, чому немає більш чіткої помилки (навіть на зразок відмови у підключенні: це мало б більше сенсу).
ShinTakezou

45

Curl видає цю помилку, коли немає відповіді від сервера, оскільки помилкою є те, що HTTP нічого не відповідає на запит.

Я підозрюю, що проблема у вас полягає в тому, що між вами та відповідним хостом існує якась мережна інфраструктура, наприклад брандмауер або проксі. Тому, щоб це працювало, вам потрібно буде обговорити проблему з людьми, відповідальними за це обладнання.


19
Можливо, це неправильний підхід до усунення несправностей. Порожня відповідь означає, що він зміг підключитися до IP / порту, але сервер нічого не відповів у відповіді. Ймовірно, це проблема в самій службі.
Роберт Крістіан,

4
Ну, не зовсім. Коли це сталося зі мною, це було тому, що мій автентифікуючий проксі не підключався до віддаленого хосту. Тож насправді не було жодної проблеми з самою послугою.
Стів Найт,

У моєму випадку у мене є проксі-сервер, який вимкнено для інтерфейсу зворотного зв'язку, де працює сервер.
rbaleksandar

У моєму випадку сервер веб-кешу NGINX, на якому не залишилося місця на жорсткому диску.
Alien Life Form,


9

Це може статися, коли сервер не реагує через 100% використання процесора або пам'яті.

Я отримав цю помилку, коли намагався отримати доступ до API sonarqube, а сервер не реагував через повне використання пам'яті


8

Ще однією поширеною причиною порожньої відповіді є час очікування. Перевірте всі стрибки, звідки виконується завдання cron, на ваш PHP / цільовий сервер. Ймовірно, десь по лінії є пристрій / сервер / nginx / LB / проксі, який припиняє запит раніше, ніж ви очікували, що призводить до порожньої відповіді.


5

У випадку SSL-з'єднань це може бути спричинено проблемою у старих версіях сервера nginx, яка segfault під час запитів curl та Safari. Ця помилка була виправлена ​​навколо версії 1.10 nginx, але в Інтернеті є ще багато старих версій nginx.

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

Мені відомо, що OP запитував не-SSL-випадок, але оскільки це головна сторінка в goole для питання "порожня відповідь із сервера", я залишаю тут відповідь SSL, оскільки я був одним із багатьох, хто б'ється головою до стіни цим випуском.


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 повертає вам цю відповідь. Виявляється, цю проблему потрібно вирішувати на стороні сервера, а не на стороні клієнта. Тут я зрозумів.
Aashish Chaubey

1

У моєму випадку (curl 7.47.0) це тому, що я встановив заголовок content-lengthна команду curl вручну зі значенням, яке обчислюється листоношею (я використовував листоношу для генерації параметрів команди curl та копіювання їх у оболонку). Після видалення заголовка content-lengthвін працює нормально.


0

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

Ви намагаєтеся підключитися до веб-сайту, який має віртуальний хост на основі імен, тобто до нього неможливо отримати доступ через IP-адресу. Щось пішло не так з іменем хосту - можливо, ви щось неправильно ввели. Зауважте, що використання GET замість POST для параметрів дасть вам більш конкретну відповідь.

Випуск також може бути пов’язаний із заголовком 100 продовжень. Спробуйте запустити curl_getinfo($ch, CURLINFO_HTTP_CODE)і перевірте результат.


Цікавий момент. Я насправді зміг отримати HTML як відповідь з telnet hostnameіGET <url>
Ніно Шкопак

0

Моя справа була пов’язана із закінченням терміну дії сертифіката SSL


-1

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


-2

Це трапляється, коли ви намагаєтесь отримати доступ до безпечного веб-сайту, наприклад Https.

Сподіваюся, ви пропустили "s"

Спробуйте змінити URL на curl -sS -u "ім’я користувача: пароль" https://www.example.com/backup.php


3
Дуже ні. І до речі, що простого auth "username: password" пов'язане з https?
Ніно Шкопак,

частина авторизації відповіді здається, що ви не знаєте, чому це дивно додавати це до відповіді.
Skid Kadda
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.