python3 HTTP请求需要很长时间

时间:2018-05-31 20:13:49

标签: python python-3.x python-requests urllib3

我使用请求库来获取一个简单的URL(我在这里放了一个虚拟URL,代码中使用了普通的URL):

import requests
response = requests.get("http://example.com/foo/bar/", headers={"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36"})

在本地它工作正常,但是当我在服务器上放置相同的代码时,此请求将永远完成。我已为所有这些记录器启用了日志输出:

urllib3.util.retry
urllib3.util
urllib3
urllib3.connection
urllib3.response
urllib3.connectionpool
urllib3.poolmanager
requests

这是他们产生的唯一输出:

2018-05-31 19:55:56,894 - urllib3.connectionpool - DEBUG - Starting new HTTP connection (1): example.com
2018-05-31 19:58:06,676 - urllib3.connectionpool - DEBUG - http://example.com:80 "GET /foo/bar/ HTTP/1.1" 200 None

有趣的是,完成请求总是需要2分10秒(如果你忽略毫秒)。在当地,它是即时的。

我接下来要看的任何线索?

1 个答案:

答案 0 :(得分:0)

这听起来像基础IPv6连接有问题。该请求恰好需要2分10秒的事实是一个让步,因为这表明IPv6请求超时。

通过使用wgetcurl进行验证:

wget --inet6-only https://www.example.com -O - > /dev/null
# or
curl --ipv6 -v https://www.example.com

在两种情况下,我们都强制该工具通过IPv6连接以隔离问题。如果超时,请再次尝试强制使用IPv4:

wget --inet4-only https://www.example.com -O - > /dev/null
# or
curl --ipv4 -v https://www.example.com

如果此方法正常,您已找到问题!但是,您问如何解决呢?

  1. 蛮力解决方案是完全disable IPv6
  2. 您也可能只disable IPv6 for the current session
  3. 您可能只想force requests to use IPv4。 (在链接的答案中,您必须调整代码以始终为IPv4返回socket.AF_INET。)
  4. 如果要解决SSH的此问题,请按以下说明force IPv4 for SSH。 (简而言之,将AddressFamily inet添加到您的SSH配置中。)
  5. 您可能还想检查问题是否出在您的DNS or TCP上。

不能解决您的问题吗?

如果那不能解决您的问题,我还收集了其他一些可能的解决方法here