56 votes

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

J'essaie de vérifier que des connexions persistantes HTTP sont utilisées lors de la communication avec un serveur web Tomcat que j'ai lancé. 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 de curl de ma machine cliente :

[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 faire pour que curl utilise une connexion persistante/keepalive ? J'ai fait pas mal de recherches sur Google à ce sujet, mais sans succès. Il convient de noter que j'ai également utilisé links sur l'ordinateur du client pour récupérer la ressource, et que le hace me donner une ESTABLISHED sur le serveur.

Faites-moi savoir si je dois fournir plus d'informations.

58voto

AJ. Points 1572

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

A titre d'exemple :

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

Il 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 :

\* Connection #0 to host www.google.com left intact
\* Re-using existing connection! (#0) with host www.google.com

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

Utiliser le même " curl -v http://my.server/url1 http://my.server/url2 "et vérifiez que vous obtenez le même message.

Envisagez d'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.

19voto

AXE Labs Points 1519

Si votre serveur autorise la fonction 'KeepAlive On', vous pouvez utiliser telnet pour maintenir une connexion persistante comme suit :

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

10voto

Kannan Mohan Points 583

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ées 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 utilisez netstat, vous pouvez constater que la connexion TCP n'a pas changé et que l'ancienne connexion est maintenue (le socket reste le 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 les connexions HTTP persistantes, l'adresse du 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       

Nous pouvons ainsi être sûrs que la connexion TCP est réutilisée.

2voto

Arenstar Points 3582

--keepalive-time

homme curl... homme... :D

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X