CURL'yi komut satırından sürekli kullanmasını nasıl sağlayabilirim?


36

Çalıştırdığım bir Tomcat web sunucusu ile iletişim sırasında HTTP kalıcı bağlantılarının kullanıldığını doğrulamaya çalışıyorum. Şu anda sunucumdaki bir tarayıcıdan bir kaynak (örn. Chrome) alabilir ve netstat kullanarak bağlantının kurulduğunu doğrulayabilirim:

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

Ancak, eğer curl kullanırsam, sunucudaki bağlantıyı netstat'ta asla göremiyorum.

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

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

Ayrıca aşağıdaki curl komutunu kullanmayı da denedim:

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

İşte benim müşteri makinemin kıvırmak versiyonu:

[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

Kalıcı / kalıcı bir bağlantı kullanmak için nasıl kıvrılırım? Konuyla ilgili oldukça fazla Googling yaptım ama başaramadım. Ben de kullandım unutulmamalıdır linkskaynak almak için istemci makinesinde ve bu yapar bana ver ESTABLISHEDsunucuda bağlantı.

Daha fazla bilgi vermem gerekirse bana bildir.


Yanıtlar:


38

curl zaten varsayılan olarak keepalive kullanıyor.

Örnek olarak:

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

Aşağıdakileri üretir:

* 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

Bu pasajı:

* Www.google.com sitesini barındırmak için 0 numaralı bağlantı bozulmadan kaldı
* Mevcut bağlantıyı yeniden kullanma! (# 0) www.google.com ev sahibi ile

Aynı bağlantıyı yeniden kullandığını gösterir.

curl -v http://my.server/url1 http://my.server/url2Sunucunuza karşı aynı " " çağrısını kullanın ve aynı mesajı gördüğünüzden emin olun.

Paketlerin nasıl işlendiğini görmek için netstat yerine tcpdump kullanmayı düşünün. netstat size olanları sadece kısa bir süre içinde anlatacak, oysa tcpdump ile ilgili her bir paketi göreceksiniz. Başka bir seçenek Wireshark.


Cevap için teşekkürler. Evet, çoğu HTTP istemcisinin varsayılan olarak sürekli kullandığını anladım. Sanırım öğrenmeye çalıştığım şey ESTABLISHED, sunucudaki bağlantıyı neden sadece curl kullanırken görmüyorum .
Rob Hruska,

7
Curl üzerinden yalnızca tek bir URL talep ediyorsanız, curl'un herhangi bir şeyi canlı tutması için hiçbir neden yoktur. Kıvrılma işlemi, tüm URL'ler alındıktan hemen sonra sona erecektir. İki URL belirtin (iki kere bile aynı URL olabilir) ve "curl -v" tarafından üretilen çıktıya göz atın. Netstat çalıştığında, kıvrılma artık çalışmadığından ve bağlantının açık kalmasının bir nedeni olmadığı için bağlantı zaten kapatılmıştır.
Roshan,

1
Bu mantıklı; Sahip olunan işlem bitmişse, bağlantının etrafta durması mantıklı olmaz. Yardımınız için teşekkürler.
Rob Hruska,

8

Sunucunuz 'KeepAlive On'a izin veriyorsa, kalıcı bir bağlantının böyle olmasını sağlamak için telnet'i kullanabilirsiniz:

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

güzel. Döngü kadar uzakta iken bir kıvrım atar.
Michael Ozeryansky

KeepAliveTimout değişikliğimin doğru bir şekilde uygulanıp uygulanmadığını test etmeye çalışıyordum - bu sadece biletti. Teşekkürler!
Dave Gregory,

6

HTTP kalıcı bağlantısını / Keep-Alive uygulamasını test etmenin bir yolu, TCP bağlantısının sonraki bağlantılar için yeniden kullanılıp kullanılmadığını görmektir.

Örneğin. Birden çok kez tekrarlanan http://google.com bağlantısını içeren bir dosyam var .

Aşağıdaki komutu çalıştırmak http://google.com adresini aynı TCP bağlantısıyla birçok kez açacaktır .

curl -K /tmp/file

Ve bu süre zarfında netstat'ı alırsanız, TCP bağlantısının değişmediğini ve eskisinin tekrar başlatıldığını görebilirsiniz (Soket aynı kalır).

$ 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   

Ancak istemciden sürekli HTTP bağlantısını desteklemeyen dozu HTTP 1.0 kullanmasını istediğimizde soket adresi değişir

$ 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       

bundan TCP bağlantısının tekrar kullanıldığından emin olabiliriz.


5

--keepalive zamanlı

adam kıvırmak ... adam ..: D


2
Adam sayfasını okudum, teşekkürler. Benim örneğimde fark --keepalive-time 60etmediniz mi?
Rob Hruska,

3
oh ... şu an aptal hissediyorum :(
Arenstar

8
Yukarıda belirtildiği gibi "keepalive-time" belirtilmesi, HTTP seviyesinin canlı kalmasını etkilemez; Düşük seviye TCP bağlantısını etkiler. Man sayfasından ( curl.haxx.se/docs/manpage.html ): "Bu seçenek bir bağlantının sürekli tutma sondaları göndermeden önce ve bireysel tutma sondaları arasındaki zamanı göndermeden önce boşta kalması gereken zamanı belirler."
Aralarından
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.