Curl Error 52 Balasan kosong dari server

98

Saya memiliki pengaturan pekerjaan cron di satu server untuk menjalankan skrip cadangan di PHP yang di-host di server lain. Perintah yang saya gunakan memiliki format seperti ini:

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

Akhir-akhir ini saya mendapatkan kesalahan ini saat Cron bekerja

curl: (52) Empty reply from server

Saya tidak tahu apa artinya ini. Jika saya membuka tautan langsung di browser saya, skrip berjalan dengan baik dan saya mendapatkan file zip cadangan kecil saya.

Adakah yang bisa memberikan informasi tentang itu?

Paul Sheldrake
sumber
Ini benar-benar tidak ada hubungannya dengan PHP karena curl tidak peduli apa prosesor file keluarannya.
Kevin Peno
1
Mungkinkah skrip cadangan Anda berjalan begitu lama sehingga menyebabkan curlwaktu tunggu? Sudahkah Anda mencoba meningkatkan curl default menunggu untuk terhubung dengan --connect-timeout <seconds>dan untuk seluruh operasi --max-time <seconds>?
Yzmir Ramirez
@YzmirRamirez curl kode kesalahan batas waktu adalah 28. Src: ec.haxx.se/usingcurl-timeouts.html
Luckylooke
Dengan Docker + Uvicorn (FastAPI), ini membantu saya untuk mengatur --host 0.0.0.0
TechWisdom

Jawaban:

73

Ini bisa terjadi jika curl diminta untuk melakukan HTTP biasa di server yang melakukan HTTPS.

Contoh:

$ curl http://google.com:443
curl: (52) Empty reply from server
Benoit Duffez
sumber
7
Ini adalah situasi dalam kasus saya. curl localhost:8443memberi saya kesalahan balasan kosong. curl -k https://localhost:8443menyajikan halaman dengan benar.
lowly_junior_sysadmin
1
Saya baru saja tersandung tentang ini dan saya benar-benar merindukan yang hilang. Saya bertanya-tanya mengapa tidak ada kesalahan yang lebih jelas (bahkan seperti koneksi ditolak: itu akan lebih masuk akal).
ShinTakezou
45

Curl memberikan kesalahan ini ketika tidak ada balasan dari server, karena itu adalah kesalahan HTTP untuk tidak menanggapi permintaan apa pun.

Saya menduga masalah yang Anda hadapi adalah ada beberapa bagian dari infrastruktur jaringan, seperti firewall atau proxy, antara Anda dan host yang dimaksud. Oleh karena itu, agar ini berfungsi, Anda akan diminta untuk mendiskusikan masalah ini dengan orang yang bertanggung jawab atas perangkat keras tersebut.

Steve Knight
sumber
19
Ini mungkin pendekatan pemecahan masalah yang salah. Balasan kosong berarti dapat terhubung ke IP / port, tetapi server tidak mengembalikan apa pun dalam balasan. Sepertinya ada masalah pada layanan itu sendiri.
Robert Christian
4
Yah, kurang tepat. Saat ini terjadi pada saya, itu karena proxy pengautentikasi saya tidak terhubung ke host jarak jauh. Jadi sebenarnya tidak ada masalah pada layanan itu sendiri.
Steve Knight
Dalam kasus saya, saya memiliki proxy, yang dinonaktifkan untuk antarmuka loopback tempat server berjalan.
rbaleksandar
Dalam kasus saya, server cache web NGINX tanpa ruang hard drive tersisa.
Alien Life Form
8

Dalam kasus saya itu adalah pengalihan server; curl -Lmemecahkan masalah saya.

Guillermo Prandi
sumber
8

Itu bisa terjadi ketika server tidak merespons karena penggunaan CPU atau Memori 100%.

Saya mendapat kesalahan ini ketika saya mencoba mengakses API sonarqube dan server tidak merespons karena penggunaan memori penuh

Jayaprakash
sumber
7

Alasan umum lainnya untuk balasan kosong adalah waktu tunggu. Periksa semua lompatan dari tempat tugas cron dijalankan dari ke server PHP / target Anda. Mungkin ada perangkat / server / nginx / LB / proxy di suatu tempat di sepanjang baris yang menghentikan permintaan lebih awal dari yang Anda harapkan, menghasilkan respons kosong.

pemulung
sumber
5

Dalam kasus koneksi SSL, ini mungkin disebabkan oleh masalah di versi lama server nginx yang segfault selama permintaan curl dan Safari. Bug ini telah diperbaiki sekitar versi 1.10 dari nginx tetapi masih ada banyak versi lama nginx di internet.

Untuk admin nginx: menambahkan ssl_session_cache shared:SSL:1m;ke httpblok seharusnya menyelesaikan masalah.

Saya menyadari bahwa OP meminta kasus non-SSL tetapi karena ini adalah halaman teratas di goole untuk masalah "balasan kosong dari server", saya meninggalkan jawaban SSL di sini karena saya adalah salah satu dari banyak yang membenturkan kepala saya melawan dinding dengan masalah ini.

SiliconMind
sumber
3

Dalam kasus saya, ini disebabkan oleh masalah PHP APC. Tempat pertama untuk melihat adalah log kesalahan Apache (jika Anda menggunakan Apache).

Semoga ini bisa membantu seseorang.

Andrew McCombe
sumber
Bisakah Anda menjelaskan lebih banyak? Bagaimana ini bisa disebabkan oleh APC? Saya bahkan tidak menjalankan ini di dalam PHP, saya hanya menggunakan baris perintah.
Nino Škopac
Ini sudah lama sekali, saya tidak dapat mengingat alasan APC menjadi penyebab masalah ini. Maaf saya tidak bisa membantu.
Andrew McCombe
2

kesalahan ini juga dapat terjadi jika server sedang memproses data. Ini biasanya terjadi pada saya ketika saya memposting beberapa file ke situs web REST API yang memiliki banyak entri dan membutuhkan waktu lama untuk pembuatan dan pengembalian catatan

Thiago Conrado
sumber
1

Anda dapat mencoba curl -sS ini " http://www.example.com/backup.php " dengan memasukkan URL Anda ke "" yang berhasil bagi saya, saya tidak tahu alasan tepatnya, tetapi saya rasa meletakkan url ke " "menyelesaikan permintaan ke server atau hanya menyelesaikan permintaan header.

omar
sumber
1

Saya pernah mengalami masalah ini sebelumnya. Tahu saya punya aplikasi lain menggunakan port yang sama (3000).

Cara mudah untuk mengetahuinya:

Di terminal, ketik netstat -a -p TCP -n | grep 3000(gantikan port yang Anda gunakan untuk '3000'). Jika ada lebih dari satu yang mendengarkan, sesuatu yang lain sudah menempati port itu. Anda harus menghentikan proses itu atau mengubah port untuk proses baru Anda.

ginna
sumber
2
Ini adalah kasus yang sangat spesifik yang Anda sebutkan. Ini bukan, secara umum, mengapa curl mengembalikan Anda respons ini. Ternyata masalah ini perlu ditangani di sisi server dan bukan di sisi klien. Ini adalah tempat saya mengerti.
Aashish Chaubey
1

Dalam kasus saya (curl 7.47.0), itu karena saya mengatur header content-lengthpada perintah curl secara manual dengan nilai yang dihitung oleh tukang pos (saya menggunakan tukang pos untuk menghasilkan parameter perintah curl dan menyalinnya ke shell). Setelah saya menghapus header content-length, ini berfungsi normal.

YouCL
sumber
0

Coba ini -> Alih-alih melalui cURL, coba ping situs yang Anda coba jangkau dengan Telnet. Respons yang dikembalikan oleh upaya koneksi Anda akan persis seperti yang dilihat cURL saat mencoba menyambungkan (tetapi tidak dapat membantu mengaburkannya dari Anda). Sekarang, bergantung pada apa yang Anda lihat di sini, Anda mungkin menarik salah satu dari beberapa kesimpulan:

Anda mencoba menyambung ke situs web yang merupakan host virtual berbasis nama, artinya tidak dapat dijangkau melalui alamat IP. Ada yang salah dengan nama host — Anda mungkin salah mengetik. Perhatikan bahwa menggunakan GET daripada POST untuk parameter akan memberi Anda jawaban yang lebih konkret.

Masalahnya mungkin juga terkait dengan header 100-lanjutkan. Coba lari curl_getinfo($ch, CURLINFO_HTTP_CODE), dan periksa hasilnya.

Felix
sumber
Hal yang menarik. Saya sebenarnya bisa mendapatkan HTML sebagai tanggapan dengan telnet hostnamedanGET <url>
Nino Škopac
0

Kasus saya karena sertifikat SSL kedaluwarsa

Druvan
sumber
-1

Dalam kasus saya, saya menggunakan uwsgi, menambahkan properti http-timeout selama lebih dari 60 detik tetapi tidak berfungsi karena beberapa ruang ekstra dan file konfigurasi tidak dimuat dengan benar.

Ankit Adlakha
sumber
-2

Itu terjadi ketika Anda mencoba mengakses Situs Web aman seperti Https.

Saya harap Anda melewatkan 's'

Coba Ubah URL menjadi curl -sS -u "username: password" https://www.example.com/backup.php

Muthukrishnan
sumber
3
Sangat tidak. Dan btw apa hubungan "username: password" auth sederhana dengan https?
Nino Škopac
bagian autentikasi dari jawaban membuat Anda seolah-olah tidak tahu mengapa aneh menambahkannya ke jawaban.
Skid Kadda