web-dev-qa-db-fra.com

Comment puis-je faire en sorte que cURL utilise keepalive à partir de la ligne de commande?

J'essaie de vérifier que les connexions persistantes HTTP sont utilisées lors de la communication avec un serveur Web Tomcat que j'ai en cours d'exécution. Actuellement, je peux récupérer une ressource sur mon serveur à partir d'un navigateur (par exemple Chrome) et vérifier à l'aide de netstat que la connexion est établie:

# visit http://server:8080/path/to/resource in Chrome
[server:/tmp]$ netstat -a
...
tcp        0      0 server.mydomain:webcache client.mydomain:55502 ESTABLISHED

Cependant, si j'utilise curl, je ne vois jamais la connexion sur le serveur dans netstat.

[client:/tmp]$ curl --keepalive-time 60 --keepalive http://server:8080/path/to/resource
...

[server:/tmp]$ netstat -a
# no connection exists for client.mydomain

J'ai également essayé d'utiliser la commande curl suivante:

curl -H "Keep-Alive: 60" -H "Connection: keep-alive" http://server:8080/path/to/resource

Voici la version curl de ma machine client:

[server:/tmp]$ curl -V
curl 7.19.5 (x86_64-unknown-linux-gnu) libcurl/7.19.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5 libssh2/1.1
Protocols: tftp ftp telnet dict http file https ftps scp sftp
Features: IDN IPv6 Largefile NTLM SSL libz

Comment obtenir curl pour utiliser une connexion persistante/persistante? J'ai fait pas mal de recherches sur le sujet, mais sans succès. Il convient de noter que j'ai également utilisé links sur la machine cliente pour récupérer la ressource, et que me donne un ESTABLISHED connexion sur le serveur.

Faites-moi savoir si j'ai besoin de fournir plus d'informations.

40
Rob Hruska

curl utilise déjà keepalive par défaut.

Par exemple:

curl -v http://www.google.com http://www.google.com

Produit les éléments suivants:

* About to connect() to www.google.com port 80 (#0)
*   Trying 74.125.39.99... connected
* Connected to www.google.com (74.125.39.99) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
> Host: www.google.com
> Accept: */*
> 
< HTTP/1.1 302 Found
< Location: http://www.google.ch/
< Cache-Control: private
< Content-Type: text/html; charset=UTF-8
< Set-Cookie: PREF=ID=0dd153a227433b2f:FF=0:TM=1289232886:LM=1289232886:S=VoXSLP8XWvjzNcFj; expires=Wed, 07-Nov-2012 16:14:46 GMT; path=/; domain=.google.com
< Set-Cookie: NID=40=sOJuv6mxhQgqXkVEOzBwpUFU3YLPQYf4HRcySE1veCBV5cPtP3OiLPKqvRxL10VLiFETGz7cu25pD_EoUq1f_CkNwOna-xRcFFsCokiFqIbGPrb6DmUO7XhcpMYOt3dB; expires=Tue, 10-May-2011 16:14:46 GMT; path=/; domain=.google.com; HttpOnly
< Date: Mon, 08 Nov 2010 16:14:46 GMT
< Server: gws
< Content-Length: 218
< X-XSS-Protection: 1; mode=block
< 
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.ch/">here</A>.
</BODY></HTML>
* Connection #0 to Host www.google.com left intact
* Re-using existing connection! (#0) with Host www.google.com
* Connected to www.google.com (74.125.39.99) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
> Host: www.google.com
> Accept: */*
> 
< HTTP/1.1 302 Found
< Location: http://www.google.ch/
< Cache-Control: private
< Content-Type: text/html; charset=UTF-8
< Set-Cookie: PREF=ID=8b531815cdfef717:FF=0:TM=1289232886:LM=1289232886:S=ifbAe1QBX915QGHr; expires=Wed, 07-Nov-2012 16:14:46 GMT; path=/; domain=.google.com
< Set-Cookie: NID=40=Rk86FyMCV3LzorQ1Ph8g1TV3f-h41NA-9fP6l7G-441pLEiciG9k8L4faOGC0VI6a8RafpukiDvaNvJqy8wExED9-Irzs7VdUQYwI8bCF2Kc2ivskb6KDRDkWzMxW_xG; expires=Tue, 10-May-2011 16:14:46 GMT; path=/; domain=.google.com; HttpOnly
< Date: Mon, 08 Nov 2010 16:14:46 GMT
< Server: gws
< Content-Length: 218
< X-XSS-Protection: 1; mode=block
< 
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.ch/">here</A>.
</BODY></HTML>
* Connection #0 to Host www.google.com left intact
* Closing connection #0

Cet extrait:

 * La connexion n ° 0 à l'hôte www.google.com est restée intacte 
 * Réutilisation de la connexion existante! (# 0) avec l'hôte www.google.com 

Indique qu'il a réutilisé la même connexion.

Utilisez le même "curl -v http://my.server/url1 http://my.server/url2 "sur votre serveur et vérifiez que le même message s'affiche.

Pensez à utiliser tcpdump au lieu de netstat pour voir comment les paquets sont traités. netstat ne vous donnera qu'un aperçu momentané de ce qui se passe, alors qu'avec tcpdump vous verrez chaque paquet impliqué. Une autre option est Wireshark.

41
Roshan

Si votre serveur autorise "KeepAlive On", vous pouvez utiliser telnet pour maintenir une connexion persistante comme ceci:

$ while :;do echo -e "GET / HTTP/1.1\nhost: $YOUR_VIRTUAL_HOSTNAME\n\n";sleep 1;done|telnet $YOUR_SERVERS_IP 80
11
AXE Labs

Une façon de tester la connexion persistante HTTP/Keep-Alive est de voir si la connexion TCP est réutilisée pour les connexions suivantes.

Par exemple. J'ai un fichier contenant un lien de http://google.com répété plusieurs fois.

L'exécution de la commande ci-dessous ouvrira http://google.com plusieurs fois avec la même connexion TCP.

curl -K /tmp/file

Et pendant ce temps, si vous netstat, vous pouvez constater que la connexion TCP n'a pas changé et que la plus ancienne est rétablie (la socket reste la même).

$ Sudo netstat -pnt|grep curl
tcp        0      0 106.51.85.118:48682     74.125.236.69:80        ESTABLISHED 9732/curl       
$ Sudo netstat -pnt|grep curl
tcp        0      0 106.51.85.118:48682     74.125.236.69:80        ESTABLISHED 9732/curl       
$ Sudo netstat -pnt|grep curl
tcp        0      0 106.51.85.118:48682     74.125.236.69:80        ESTABLISHED 9732/curl   

Mais lorsque nous demandons au client d'utiliser HTTP 1.0 qui ne prend pas en charge la connexion HTTP persistante, l'adresse de socket change

$ curl -0 -K /tmp/file

$ Sudo netstat -pnt|grep curl
tcp        0      0 106.51.85.118:48817     74.125.236.69:80        ESTABLISHED 9765/curl       
$ Sudo netstat -pnt|grep curl
tcp        0      0 106.51.85.118:48827     74.125.236.69:80        ESTABLISHED 9765/curl       
$ Sudo netstat -pnt|grep curl
tcp        0     74 106.51.85.118:48838     74.125.236.69:80        ESTABLISHED 9765/curl       

à partir de cela, nous pouvons être sûrs que la connexion TCP est réutilisée.

7
Kannan Mohan

--keepalive-time

homme curl ... homme ..: D

5
Arenstar