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

36

J'essaie de vérifier que les connexions persistantes HTTP sont utilisées lors de la communication avec un serveur Web Tomcat en cours d'exécution. Actuellement, je peux récupérer une ressource sur mon serveur depuis 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 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 puis-je me permettre d'utiliser une connexion persistante / persistante? J'ai fait pas mal de recherches sur le sujet sur Google, mais sans succès. Il est à noter que j'ai également utilisé linkssur la machine cliente pour récupérer la ressource, ce qui me donne une ESTABLISHEDconnexion sur le serveur.

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

Rob Hruska
la source
stackoverflow.com/questions/6086609/…
Ciro Santilli a annoncé

Réponses:

38

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

Par exemple:

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

Produit ce qui suit:

* 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 intacte.
* Réutiliser la connexion existante! (# 0) avec l'hôte www.google.com

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

Utilisez la même " curl -v http://my.server/url1 http://my.server/url2" invocation sur votre serveur et vérifiez que vous voyez le même message.

Pensez à utiliser tcpdump au lieu de netstat pour voir comment les paquets sont géré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.

Roshan
la source
Merci d'avoir répondu. Oui, j'ai compris que la plupart des clients HTTP utilisent Keepalive par défaut. J'essaie de comprendre pourquoi je ne vois pas la ESTABLISHEDconnexion sur le serveur uniquement lorsque j'utilise curl.
Rob Hruska
7
Si vous ne demandez qu'une seule URL via curl, il n'y a aucune raison pour que curl garde quoi que ce soit en vie. Le processus de curl se terminera dès que toutes les URL auront été récupérées. Spécifiez deux URL (il pourrait même s'agir d'une même URL deux fois) et gardez un œil sur la sortie produite par "curl -v". Au moment de l'exécution de netstat, la connexion était déjà fermée, car curl n'est plus en cours d'exécution et il n'y a plus de raison pour que la connexion reste ouverte.
Roshan
1
Ça a du sens; il ne serait pas logique de maintenir le lien si le processus de possession est terminé. Merci de votre aide.
Rob Hruska
8

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
AX Labs
la source
beau. Bat une boucle tout en boucle de loin.
Michael Ozeryansky
J'essayais de tester si mon changement KeepAliveTimout avait été appliqué correctement - c'était juste le ticket. Merci!
Dave Gregory
6

Une façon de tester la connexion persistante HTTP / Keep-Alive consiste à vérifier 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 l’ancienne est restaurée (le socket reste identique).

$ 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.

Kannan Mohan
la source
5

--keepalive time

homme curl ... homme ..: D

Arenstar
la source
2
J'ai lu la page de manuel, merci. Avez-vous pas remarqué la --keepalive-time 60dans mon exemple?
Rob Hruska
3
oh ... je me sens stupide maintenant :(
Arenstar
8
La spécification de "durée de conservation" comme suggéré ci-dessus n'affecte pas la conservation au niveau HTTP; cela affecte la connectivité TCP de bas niveau. A partir de la page de manuel ( curl.haxx.se/docs/manpage.html ): "Cette option définit le temps pendant lequel une connexion doit rester inactive avant l'envoi de sondes keepalive et le temps entre les sondes keepalive individuelles." Je suppose que c'est bien qu'il y ait tellement de types de
groupes de survie