![Curl 响应挂起](https://linux22.com/image/1489493/Curl%20%E5%93%8D%E5%BA%94%E6%8C%82%E8%B5%B7.png)
我在虚拟机中设置了一个网站。我可以通过我机器上的浏览器正常访问该网站,但通过 SSH 进入虚拟机时,我无法通过 CURL 访问该网站。
当我尝试时,curl 在显示响应并退出之前挂起。
这是我所运行的:curl -vvv site1.dev/
这是它给出的输出:
* Hostname was NOT found in DNS cache
* Trying 192.168.10.10...
* Connected to site1.dev (192.168.10.10) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.35.0
> Host: site1.dev
> Accept: */*
>
< HTTP/1.1 200 OK
* Server nginx/1.9.7 is not blacklisted
< Server: nginx/1.9.7
< Content-Type: text/html; charset=UTF-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Cache-Control: no-cache
< Date: Fri, 08 Apr 2016 16:47:30 GMT
<
* Connection #0 to host site1.dev left intact
hi
请求部分立即发送,但响应会挂起几秒钟(大约 120 秒),然后 curl 退出并显示以下消息:* Connection #0 to host site1.dev left intact
接下来是适当的回应主体“嗨”。
我有点迷茫了——如能得到任何指点我将非常感激。
4 月 11 日编辑:我尝试了 wget,结果类似(响应挂起)。我怀疑这是网络配置问题。
如果相关的话,这里是虚拟盒的一些端口配置。
==> default: Preparing network interfaces based on configuration...
default: Adapter 1: nat
default: Adapter 2: hostonly
==> default: Forwarding ports...
default: 80 => 8000 (adapter 1)
default: 443 => 44300 (adapter 1)
default: 3306 => 33060 (adapter 1)
default: 5432 => 54320 (adapter 1)
default: 22 => 2222 (adapter 1)
4月12日编辑:
所以...我决定销毁这个流浪盒子并重新开始...这样做解决了这个问题。
我怀疑我在过去几个月里更改/破坏了某些东西。从头开始,使用 vanilla box 设置,已经解决了这个问题。
答案1
也许 nginx 配置为对传入请求进行 ip 解析,并且在实际回答请求之前需要花时间解析传入的连接。
不过,有几点需要注意,您需要在 192.168.10.10 上检查以下内容。
- 验证 /etc/resolv.conf 中的名称服务器是否正确
- 如果 #1 解析设置对于主名称服务器和辅助名称服务器都是正确的,请验证 192.168.10.10 是否有能力解析主机。(对 google.com 进行简单的 nslookup 是一个很好的测试,如果发生超时,那么这可能是问题的一部分)
- 确保您的 nginx 服务器能够通过防火墙(端口 53 tcp/udp)从外部或内部查询名称服务器
- 在 nginx 配置选项中查找潜在的解析器设置或在适用的情况下设置解析超时设置,然后重新启动 nginx。
- 如果仍然存在问题,请尝试在 192.168.10.10 上的 /etc/hosts 中添加传入请求连接的主机。
让我知道它对你有何作用..
感谢您的发帖。
答案2
备注:您可以使用 获取更详细的时间信息time curl -vvv site1.dev/
。
我注意到服务器回复包含Connection: keep-alive
,这意味着服务器配置为使用HTTP 保持活动:
HTTP 持久连接(也称为 HTTP 保持活动或 HTTP 连接重用)的理念是使用单个 TCP 连接发送和接收多个 HTTP 请求/响应,而不是为每个请求/响应对打开一个新连接。较新的 HTTP/2 协议使用相同的理念,并进一步允许在单个连接上多路复用多个并发请求/响应。
因此,服务器保持连接打开,以期处理更多请求。这样,浏览器可以使用相同的 TCP 连接接收 HTML 页面并立即请求链接的图像,而无需建立新的连接。
这curl.1 手册页指定参数--no-keepalive
:
禁用 TCP 连接上的保持活动消息,因为 curl 默认启用它们。
你也可以类似地参数化 nginx 服务器模块 ngx_http_core_module keepalive_timeout:
Syntax: keepalive_timeout timeout [header_timeout]; Default: keepalive_timeout 75s; Context: http, server, location
第一个参数设置保持活动客户端连接在服务器端保持打开状态的超时时间。零值禁用保持活动客户端连接。可选的第二个参数在“Keep-Alive: timeout=time”响应标头字段中设置一个值。两个参数可能不同。
Mozilla 和 Konqueror 可以识别“Keep-Alive: timeout=time”标头字段。MSIE 会在大约 60 秒内自行关闭保持连接。