Wie verwende ich cURL von der Befehlszeile aus als Keepalive?

36

Ich versuche zu überprüfen, ob während der Kommunikation mit einem laufenden Tomcat-Webserver dauerhafte HTTP-Verbindungen verwendet werden. Derzeit kann ich eine Ressource auf meinem Server über einen Browser (z. B. Chrome) abrufen und mithilfe von netstat überprüfen, ob die Verbindung hergestellt wurde:

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

Wenn ich jedoch curl verwende, wird die Verbindung auf dem Server in netstat nie angezeigt.

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

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

Ich habe auch versucht, den folgenden Curl-Befehl zu verwenden:

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

Hier ist die Curl-Version meines Client-Computers:

[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

Wie kann ich Curl dazu bringen, eine dauerhafte / dauerhafte Verbindung zu verwenden? Ich habe ziemlich viel über das Thema gegoogelt, aber ohne Erfolg. Es sollte beachtet werden, dass ich auch linksauf dem Clientcomputer verwendet habe, um die Ressource abzurufen, und das gibt mir eine ESTABLISHEDVerbindung auf dem Server.

Lassen Sie mich wissen, wenn ich weitere Informationen benötigen.

Rob Hruska
quelle

Antworten:

38

curl verwendet standardmäßig bereits keepalive.

Als Beispiel:

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

Erzeugt Folgendes:

* 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

Dieses Snippet:

* Die Verbindung Nr. 0 zum Hosting von www.google.com wurde beibehalten
* Bestehende Verbindung weiterverwenden! (# 0) mit Host www.google.com

Zeigt an, dass dieselbe Verbindung erneut verwendet wurde.

Verwenden Sie denselben curl -v http://my.server/url1 http://my.server/url2Aufruf für Ihren Server und überprüfen Sie, ob dieselbe Meldung angezeigt wird.

Ziehen Sie die Verwendung von tcpdump anstelle von netstat in Betracht, um zu sehen, wie die Pakete behandelt werden. netstat gibt Ihnen nur einen kurzen Einblick in das Geschehen, während Sie mit tcpdump jedes einzelne betroffene Paket sehen. Eine weitere Option ist Wireshark.

Roshan
quelle
Danke für die Antwort. Ja, ich habe verstanden, dass die meisten HTTP-Clients standardmäßig Keepalive verwenden. Ich denke, ich versuche herauszufinden, warum ich die ESTABLISHEDVerbindung auf dem Server nicht nur dann sehe, wenn ich Curl verwende.
Rob Hruska
7
Wenn Sie nur eine URL per Curl anfordern, gibt es keinen Grund für Curl, etwas am Leben zu erhalten. Der Curl-Vorgang wird beendet, sobald alle URLs abgerufen wurden. Geben Sie zwei URLs an (es könnte sogar zweimal dieselbe URL sein) und beobachten Sie die Ausgabe von "curl -v". Zum Zeitpunkt der Ausführung von netstat wurde die Verbindung bereits geschlossen, da curl nicht mehr ausgeführt wird und es keinen Grund mehr gibt, die Verbindung offen zu halten.
Roshan
1
Das macht Sinn; Es wäre nicht sinnvoll, die Verbindung am Lügen zu halten, wenn der Prozess, der sie besitzt, beendet ist. Danke für Ihre Hilfe.
Rob Hruska
8

Wenn Ihr Server 'KeepAlive On' zulässt, können Sie telnet verwenden, um eine dauerhafte Verbindung aufrechtzuerhalten:

$ while :;do echo -e "GET / HTTP/1.1\nhost: $YOUR_VIRTUAL_HOSTNAME\n\n";sleep 1;done|telnet $YOUR_SERVERS_IP 80
AX Labs
quelle
schön. Schlägt eine Locke, während Schleife bei weitem.
Michael Ozeryansky
Ich habe versucht zu testen, ob meine KeepAliveTimout-Änderung ordnungsgemäß angewendet wurde - dies war nur das Ticket. Vielen Dank!
Dave Gregory
6

Eine Möglichkeit, die dauerhafte HTTP-Verbindung / Keep-Alive zu testen, besteht darin, zu prüfen, ob die TCP-Verbindung für nachfolgende Verbindungen wiederverwendet wird.

Beispielsweise. Ich habe eine Datei mit einem Link von http://google.com, der mehrmals wiederholt wurde.

Wenn Sie den folgenden Befehl ausführen, wird http://google.com mehrmals mit derselben TCP-Verbindung geöffnet .

curl -K /tmp/file

Und während dieser Zeit, wenn Sie netstat finden Sie, dass die TCP-Verbindung nicht geändert wurde und die ältere wiederhergestellt wird (Der Socket bleibt der gleiche).

$ 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   

Wenn wir den Client jedoch auffordern, HTTP 1.0 zu verwenden, das keine dauerhafte HTTP-Verbindung unterstützt, ändert sich die Socket-Adresse

$ 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       

Dadurch können wir sicher sein, dass die TCP-Verbindung wiederverwendet wird.

Kannan Mohan
quelle
5

--keepalive-time

Mann locken ... Mann ..: D

Arenstar
quelle
2
Ich habe die Manpage gelesen, danke. Haben Sie das --keepalive-time 60in meinem Beispiel nicht bemerkt ?
Rob Hruska
3
oh ... ich fühle mich jetzt dumm :(
Arenstar
8
Das Festlegen der "Keepalive-Zeit" wie oben vorgeschlagen hat keine Auswirkungen auf die Aufrechterhaltung der HTTP-Ebene. Dies wirkt sich auf die TCP-Konnektivität auf niedriger Ebene aus. Auf der Manpage ( curl.haxx.se/docs/manpage.html ): "Diese Option legt die Zeit fest, die eine Verbindung für das Senden von Keepalive-Tests und die Zeit zwischen einzelnen Keepalive- Tests inaktiv bleiben muss." Es ist schön, dass es so viele Arten von Keep-Alives gibt, aus denen ich auswählen kann;)
ShabbyDoo