Lỗi Curl 52 Trả lời trống từ máy chủ


96

Tôi có một thiết lập cron job trên một máy chủ để chạy một tập lệnh sao lưu bằng PHP được lưu trữ trên một máy chủ khác. Lệnh tôi đang sử dụng có định dạng như sau:

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

Gần đây, tôi đã gặp lỗi này khi Cron chạy

curl: (52) Empty reply from server

Tôi không biết cái này nghĩa là gì. Nếu tôi truy cập liên kết trực tiếp trong trình duyệt của mình, tập lệnh sẽ chạy tốt và tôi nhận được tệp zip dự phòng nhỏ của mình.

Bất cứ ai có thể cung cấp bất kỳ thông tin về nó?


Điều này thực sự không liên quan gì đến PHP vì curl không quan tâm bộ xử lý tệp xuất ra là gì.
Kevin Peno

1
Tập lệnh sao lưu của bạn có thể chạy quá lâu đến mức gây ra curlthời gian chờ không? Bạn đã thử tăng thời gian chờ cuộn dây mặc định để kết nối --connect-timeout <seconds>và thực hiện toàn bộ thao tác --max-time <seconds>chưa?
Yzmir Ramirez

Mã lỗi thời gian chờ của @YzmirRamirez curl là 28. Src: ec.haxx.se/usingcurl-timeouts.html
Luckylooke,

Với Docker + Uvicorn (FastAPI), nó đã giúp tôi đặt --host 0.0.0.0
TechWisdom

Câu trả lời:


72

Điều này có thể xảy ra nếu curl được yêu cầu thực hiện HTTP thuần túy trên máy chủ có HTTPS.

Thí dụ:

$ curl http://google.com:443
curl: (52) Empty reply from server

7
Đây là tình huống trong trường hợp của tôi. curl localhost:8443đã cho tôi lỗi trả lời trống. curl -k https://localhost:8443phục vụ trang đúng cách.
lowly_junior_sysadmin

1
Tôi vừa vấp phải điều này và tôi đã bỏ lỡ hoàn toàn những điều còn thiếu. Tôi tự hỏi tại sao không có lỗi rõ ràng hơn (ngay cả như kết nối bị từ chối: nó sẽ có ý nghĩa hơn).
ShinTakezou

45

Curl đưa ra lỗi này khi không có phản hồi từ máy chủ, vì đó là lỗi khi HTTP không phản hồi bất kỳ yêu cầu nào.

Tôi nghi ngờ vấn đề bạn gặp phải là có một số phần của cơ sở hạ tầng mạng, như tường lửa hoặc proxy, giữa bạn và máy chủ được đề cập. Do đó, để điều này hoạt động sẽ yêu cầu bạn thảo luận vấn đề với những người chịu trách nhiệm về phần cứng đó.


18
Đây có thể là cách tiếp cận sai để khắc phục sự cố. Trả lời trống có nghĩa là nó có thể kết nối với IP / cổng, nhưng máy chủ không trả lại gì trong thư trả lời. Nó có thể là một vấn đề trên chính dịch vụ.
Robert Christian

4
Chà, không hoàn toàn. Khi điều này xảy ra với tôi, đó là do proxy xác thực của tôi không kết nối thông qua máy chủ từ xa. Vì vậy, trên thực tế không có vấn đề gì về bản thân dịch vụ.
Steve Knight

Trong trường hợp của tôi, tôi có proxy bị vô hiệu hóa đối với giao diện lặp lại nơi máy chủ đang chạy.
rbaleksandar

Trong trường hợp của tôi, máy chủ bộ nhớ cache web NGINX không còn dung lượng ổ cứng.
Dạng sống ngoài hành tinh vào

8

Trong trường hợp của tôi, đó là chuyển hướng máy chủ; curl -Lđã giải quyết vấn đề của tôi.


8

Nó có thể xảy ra khi máy chủ không phản hồi do sử dụng 100% CPU hoặc Bộ nhớ.

Tôi gặp lỗi này khi cố gắng truy cập API sonarqube và máy chủ không phản hồi do sử dụng đầy bộ nhớ


7

Một lý do phổ biến khác cho câu trả lời trống là thời gian chờ. Kiểm tra tất cả các bước nhảy từ nơi công việc cron đang chạy từ máy chủ PHP / đích của bạn. Có thể có một thiết bị / máy chủ / nginx / LB / proxy ở đâu đó trên đường thẳng kết thúc yêu cầu sớm hơn bạn mong đợi, dẫn đến phản hồi trống.


5

Trong trường hợp kết nối SSL, điều này có thể do sự cố trong các phiên bản cũ hơn của máy chủ nginx, lỗi này xảy ra khi yêu cầu curl và Safari. Lỗi này đã được sửa xung quanh phiên bản 1.10 của nginx nhưng vẫn còn rất nhiều phiên bản nginx cũ hơn trên internet.

Đối với quản trị viên nginx: thêm ssl_session_cache shared:SSL:1m;vào httpkhối sẽ giải quyết được vấn đề.

Tôi biết rằng OP đang yêu cầu trường hợp không phải SSL nhưng vì đây là trang hàng đầu trong goole về vấn đề "trả lời trống từ máy chủ", tôi để lại câu trả lời SSL ở đây vì tôi là một trong số nhiều người đang đập đầu chống lại bức tường với vấn đề này.


3

Trong trường hợp của tôi, điều này là do sự cố APC PHP. Nơi đầu tiên cần xem là nhật ký lỗi Apache (nếu bạn đang sử dụng Apache).

Hy vọng điều này sẽ giúp ai đó.


Bạn có thể giải thích thêm một chút không? Điều này có thể do APC gây ra như thế nào? Tôi thậm chí không chạy điều này bên trong PHP, tôi chỉ sử dụng dòng lệnh.
Nino Škopac

Điều này đã xảy ra rất lâu trước đây, tôi không thể nhớ lý do APC là nguyên nhân của vấn đề này. Xin lỗi tôi không giúp được gì.
Andrew McCombe

1

bạn có thể thử curl -sS này " http://www.example.com/backup.php " bằng cách đặt URL của bạn vào "" phù hợp với tôi. Tôi không biết lý do chính xác nhưng tôi cho rằng việc đặt url vào " "hoàn thành yêu cầu đến máy chủ hoặc chỉ hoàn thành yêu cầu tiêu đề.


1

Tôi đã gặp vấn đề này trước đây. Tìm ra rằng tôi có một ứng dụng khác sử dụng cùng một cổng (3000).

Cách dễ dàng để tìm ra điều này:

Trong thiết bị đầu cuối, nhập netstat -a -p TCP -n | grep 3000(thay thế cổng bạn đang sử dụng cho '3000'). Nếu có nhiều hơn một người đang nghe, một cái gì đó khác đã chiếm giữ cổng đó. Bạn nên dừng quá trình đó hoặc thay đổi cổng cho quá trình mới của mình.


2
Đây là một trường hợp rất cụ thể mà bạn đã đề cập. Nói chung, đây không phải là lý do tại sao curl trả về cho bạn phản hồi này. Hóa ra vấn đề này cần được xử lý ở phía máy chủ chứ không phải phía máy khách. Đây là nơi tôi đã hiểu.
Aashish Chaubey

1

Trong trường hợp của tôi (curl 7.47.0), đó là do tôi đặt tiêu đề content-lengthtrên lệnh curl theo cách thủ công với một giá trị được tính toán bởi người đưa thư (tôi đã sử dụng người đưa thư để tạo các tham số lệnh curl và sao chép chúng vào trình bao). Sau khi tôi xóa tiêu đề content-length, nó hoạt động bình thường.


1

lỗi này cũng có thể xảy ra nếu máy chủ đang xử lý dữ liệu. Điều này thường xảy ra với tôi khi tôi đăng một số tệp lên các trang web REST API có nhiều mục nhập và mất nhiều thời gian để tạo và trả lại bản ghi


0

Hãy thử cách này -> Thay vì duyệt qua cURL, hãy thử ping trang web bạn đang cố gắng truy cập bằng Telnet. Phản hồi mà nỗ lực kết nối của bạn trả về sẽ chính xác là những gì cURL nhìn thấy khi cố gắng kết nối (nhưng phản hồi mà nó vô tình làm xáo trộn bạn). Bây giờ, tùy thuộc vào những gì bạn thấy ở đây, bạn có thể rút ra một trong số các kết luận:

Bạn đang cố gắng kết nối với một trang web là máy chủ ảo dựa trên tên, nghĩa là không thể truy cập trang web đó qua địa chỉ IP. Đã xảy ra sự cố với tên máy chủ — có thể bạn đã nhập sai thứ gì đó. Lưu ý rằng việc sử dụng GET thay vì POST cho các tham số sẽ cho bạn câu trả lời cụ thể hơn.

Vấn đề cũng có thể liên quan đến tiêu đề 100 tiếp tục. Hãy thử chạy curl_getinfo($ch, CURLINFO_HTTP_CODE)và kiểm tra kết quả.


Điểm thú vị. Tôi đã thực sự có thể để có được HTML như phản ứng với telnet hostnameGET <url>
Nino Škopac

0

Trường hợp của tôi là do chứng chỉ SSL hết hạn


-1

Trong trường hợp của tôi, tôi đang sử dụng uwsgi, đã thêm thuộc tính http-timeout trong hơn 60 giây nhưng nó không hoạt động do có thêm một số dung lượng và tệp cấu hình không được tải đúng cách.


-2

Nó xảy ra khi bạn đang cố gắng truy cập Trang web an toàn như Https.

Tôi hy vọng bạn đã bỏ lỡ 's'

Thử thay đổi URL thành curl -sS -u "username: password" https://www.example.com/backup.php


3
Rất nhiều không. Và btw, "tên người dùng: mật khẩu" auth đơn giản có liên quan gì với https?
Nino Škopac

phần auth của câu trả lời khiến bạn có vẻ như không biết tại sao việc thêm phần đó vào câu trả lời là điều kỳ lạ.
Skid Kadda
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.