我使用请求库来获取一个简单的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秒(如果你忽略毫秒)。在当地,它是即时的。
我接下来要看的任何线索?
答案 0 :(得分:0)
这听起来像基础IPv6连接有问题。该请求恰好需要2分10秒的事实是一个让步,因为这表明IPv6请求超时。
通过使用wget
或curl
进行验证:
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
如果此方法正常,您已找到问题!但是,您问如何解决呢?
socket.AF_INET
。)AddressFamily inet
添加到您的SSH配置中。)如果那不能解决您的问题,我还收集了其他一些可能的解决方法here。