首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Curl返回错误52或56,其中REST调用超过5分钟。

Curl返回错误52或56,其中REST调用超过5分钟。
EN

Server Fault用户
提问于 2015-08-14 16:54:03
回答 1查看 9K关注 0票数 1

所以我已经想了一个星期了。下面是下面的情况:

我在PHP中使用CURL从API中提取数据。随着对API调用的响应变得更大(同时查看15k记录),我注意到,任何需要5分钟或更长时间(在几秒钟内)的API调用都无法在我的CentOS和Suse服务器上返回。因此,我通过CURL测试了来自CLI的API调用,并得到了相同的问题。奇怪的是,如果我通过OS运行CURL命令,该命令运行良好,并在大约7分钟后返回。

下面是我通过CURL运行的命令(受审查的creds):

代码语言:javascript
复制
curl -m 0 -k --trace-ascii trace.txt --trace-time -X GET -H "tenant-code: 1cmPx7tqVDVTdN1GSelwycFUmICmASnLCmNQsV72" -H "Authorization: Basic JxHAsXeUiHMRkS8Msiu6pWb3PvY20p6am3QvXCY3knXTAntlxTBS3EyEDgly" -H "Content-Type: application/json" -H "Cache-Control: no-cache" 'https://api.endpoint.com/API/v1/system/users/search?groupid=555' > dump.txt

以下是CURL为每个平台提供的版本输出:

CentOS (这是我真正需要的地方)-

代码语言:javascript
复制
curl 7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2
Protocols: tftp ftp telnet dict ldap ldaps http file https ftps scp sftp 
Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz 

苏西-

代码语言:javascript
复制
curl 7.19.7 (x86_64-suse-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8j zlib/1.2.7 libidn/1.10
Protocols: tftp ftp telnet dict ldap ldaps http file https ftps 
Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz

OS X-

代码语言:javascript
复制
curl 7.37.1 (x86_64-apple-darwin14.0) libcurl/7.37.1 SecureTransport zlib/1.2.5
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smtp smtps telnet tftp 
Features: AsynchDNS GSS-Negotiate IPv6 Largefile NTLM NTLM_WB SSL libz 

这些是我从Centos获得的错误代码:

代码语言:javascript
复制
curl: (56) SSL read: errno -5961

我找不到文档中引用的代码。https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/SSL_函数/sslerr.html

我得到一个与Suse稍有不同的错误:

代码语言:javascript
复制
curl: (52) SSL read: error:00000000:lib(0):func(0):reason(0), errno 104

错误104使我相信服务器正在停止/重置连接,但是服务器端日志没有显示它被删除,并且OS可以在没有问题的情况下提取数据。我甚至试图欺骗用户代理,以确保这不是问题。

因此,在这一点上,我假设SSL包SecureTransport正在做OpenSSL和NSS没有做的事情。问题是什么,如果不是,问题是什么?

EN

回答 1

Server Fault用户

回答已采纳

发布于 2015-08-14 17:16:09

在MacOSX机器上运行curl命令,但不要重定向输出,让它流到您的shell窗口。注意看是否有任何缓冲,IE,你是从一开始就得到输出,一次有点,还是在5分钟内什么也得不到,然后一次得到大量的数据?

在超时的机器上再次运行curl命令,并比较其行为。如果您的输出是由API服务器上的某个后台进程缓冲的,则在它完成其查询之前,您可能无法获得结果。客户端应用程序、客户端操作系统、服务器操作系统、服务器REST以及它们之间的SSL之间的某些内容可能具有非零的超时值,如果定时器在5分钟内没有看到任何数据流动,它可能会关闭您的连接,而不多说原因。我看到这种情况在基于HTTP的服务中经常发生。在perl中,我习惯于在代码的顶部放置一个$|=1;,以禁用服务器端的输出缓冲。

也有可能是第三方设备,如思科ASA可能有NAT规则,超时和触发问题。我对阿曼达备份有这个问题,这些备份试图从ASA外部的客户端读取数据。如果客户端花费太长时间通过ASA返回给AMANDA服务器返回其大小估计,ASA将放弃其动态NAT规则,备份失败。如果工作正常的MacOSX与API服务器之间没有防火墙,但是失败的MacOSX有防火墙,这个建议值得研究。

如果MacOSX的超时值设置为0(永远等待),而Linux默认设置为60或90秒的话,我一点也不感到惊讶。

票数 2
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/714273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档