我在负载均衡器下设置了多个服务器,通过TCP连接将请求分发给它们。换句话说 - 如果我在浏览器中发出许多请求,那么当TCP连接打开时,所有这些请求都将被发送到负载均衡器下的一个服务器。
但是,当我通过curl发出请求时,TCP连接似乎不会被重用,负载均衡器会将每个请求发送到新服务器(循环算法)。
问题:
感谢。
我尝试过:
for i in {1..100}; do curl --keepalive --keepalive-time 50 -s -D - http:URL -o /dev/null; done
循环时我运行它并看到每次都使用新端口:
lsof -i -n -P | grep curl
答案 0 :(得分:1)
这不可能像你想象的那样。由于您要为每个URL创建一个新的curl进程,这将导致一个新的TCP连接,该连接将以进程关闭结束。因此,即使curl本身会使用TCP keep-alive,也无关紧要,因为它只会在进程完成之前才会处于活动状态。只要这些请求位于同一进程内(如重定向),Curl本身就会尝试为多个请求重用相同的连接。
您需要的是在同一进程中处理多个URL的方法,以便它们可以为多个请求重用相同的TCP连接。使用curl命令行工具无法做到这一点,因为每次运行只能处理一个URL。您必须使用可以在同一进程中处理多个URL的工具。
是否可以使用CURL启用TCP Keepalive?如果是这样 - 怎么样?
是的,但这对你的问题没有帮助。
我应该使用libcurl中的内容,例如:http://curl.haxx.se/libcurl/c/persistant.html - 我应该怎么做?
是的,这可能会有所帮助,因为您可以在同一个流程中以这种方式执行多个请求。绑定可用于不同的编程语言。您还可以使用各种脚本语言(如python,perl,ruby ......)的原生和舒适的HTTP处理。
这与我使用mac的事实有关吗? http://sourceforge.net/p/curl/bugs/1214/
不,因为问题本身无法用TCP保持活着。