我的问题是 curl 和 wget 通常无法检索任何给定文件的第一部分以外的内容,而且通常什么都无法检索。两者之前都在同一台服务器上运行正常,而且我的网络上的其他内容也没有发生任何变化 - 我也不确定我的服务器上发生了什么变化导致它们现在无法工作,尽管偶尔它们可以正常工作。
我已经打开了自动更新,所以可能与此有关(但也可能无关),但无论如何我都不知道如何解决。
因此,我的服务器正在运行 CentOS Linux 版本 7.3.1611(更新:现已更新至 7.6.1810)
我的 curl 版本非常新:
curl 7.64.0(x86_64-redhat-linux-gnu)libcurl/7.64.0 NSS/3.36 zlib/1.2.7 libpsl/0.7.0(+libicu/50.1.2)libssh2/1.8.0 nghttp2/1.31.1
当我尝试进行 WordPress 更新时,第一次发现此问题(这个问题已经存在一段时间了),更新会失败,例如:
下载失败。cURL 错误 28:操作在 300000 毫秒后超时,共收到 5007255 个字节中的 1355444 个
有时更新会有效,但我认为这通常适用于非常小的文件。
因此,为了尝试解决 WordPress 的问题,我尝试了:
- 增加了 Wordpress 文件中的超时时间:class-wp-http-curl.php 和 class-http.php
- 将 /etc/php.ini 中的 max_execution_time 增加到 120
...但没有变化。还尝试从命令行使用 curl 和 wget,但问题相同。
例如 $ curl -O -vhttps://downloads.wordpress.org/plugin/nimble-builder.1.5.0.zip
....
curl:(56)I/O 操作超时
还:
a) resolv.conf - 之前已添加:options single-request-reopen,该选项在几个月前解决了与 IPv4/IPv6 的冲突
- 还使用了几种不同的 DNS 服务器设置
b) 尝试从 http 和 https 站点获取内容
c) 尝试使用 IP 地址而不是域名进行获取
d) 防火墙 - 暂时阻止 iptables 阻止传入连接:
$ iptables -I INPUT 1 -j ACCEPT
然后测试后恢复:
$ iptables -D INPUT 1
e) 重新启动
f) 所有操作系统更新均已安装
不太确定还能尝试什么。这非常令人沮丧。任何帮助都值得感激。谢谢!
更新-1:我可以毫无问题地使用 yum,随后更新了系统,现在运行的是 CentOS Linux 版本 7.6.1810,但在使用 curl 和 wget 时仍然存在同样的问题。
更新-2:strace 输出示例如下:
Near beginning, a lot like this:
open("/lib64/libk5crypto.so.3", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\220H\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=210824, ...}) = 0
mmap(NULL, 2302664, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7ff0cbf8c000
mprotect(0x7ff0cbfbd000, 2093056, PROT_NONE) = 0
mmap(0x7ff0cc1bc000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x30000) = 0x7ff0cc1bc000
close(3) = 0
Part way through, stuff like this:
access("/home/xyz/.pki/nssdb/.57765795_dOeSnotExist_.db", F_OK) = -1 ENOENT (No such file or directory)
access("/home/xyz/.pki/nssdb/.57765796_dOeSnotExist_.db", F_OK) = -1 ENOENT (No such file or directory)
access("/home/xyz/.pki/nssdb/.57765797_dOeSnotExist_.db", F_OK) = -1 ENOENT (No such file or directory)
access("/home/xyz/.pki/nssdb/.57765798_dOeSnotExist_.db", F_OK) = -1 ENOENT (No such file or directory)
access("/home/xyz/.pki/nssdb/.57765799_dOeSnotExist_.db", F_OK) = -1 ENOENT (No such file or directory)
access("/home/xyz/.pki/nssdb/.57765800_dOeSnotExist_.db", F_OK) = -1 ENOENT (No such file or directory)
...
and quite a few of these:
recvfrom(3, 0x184e0d5, 12115, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
poll([{fd=3, events=POLLIN}], 1, 1000) = 1 ([{fd=3, revents=POLLIN}])
poll([{fd=3, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 1 ([{fd=3, revents=POLLIN|POLLRDNORM}])
recvfrom(3, "\322U\200l9\332+\31w\235*\322dt\233\273\37]\244~\264{\24g\2\301\320\276\271\207\337["..., 12115, 0, NULL, NULL) = 1448
recvfrom(3, 0x184e67d, 10667, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
Close to end, a lot like this:
write(2, "k", 1) = 1
poll([{fd=3, events=POLLIN}], 1, 1000) = 0 (Timeout)
poll([{fd=3, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)
write(2, "\r", 1)
记忆:
total used free shared buff/cache available
Mem: 8175404 1734268 310528 20832 6130608 5936760
Swap: 8257532 85472 8172060
更新-3:我现在也禁用了 IPv6,以防发生任何冲突,但这也没有什么区别。
更新-4:后来我发现 yum(可以运行)使用 Python,而 curl 和 wget(不能运行)不使用 Python。使用一个小的 Python 脚本来测试我尝试使用 curl/wget 检索的相同 URL 运行正常,所以我猜想一定有一些库/代码/某些东西是 curl/wget 使用的,而 Python 没有,因此运行不太好。但是,我不知道如何研究/测试/等等,以便我可以让 curl/wget 运行。不过,至少我知道这不是一百万种可能的原因,但如果有人能帮助我解决,我将不胜感激。谢谢!