コマンドラインからcURLにキープアライブを使用させるにはどうすればよいですか?


36

実行しているTomcat Webサーバーとの通信中にHTTP持続接続が使用されていることを確認しようとしています。現在、ブラウザ(Chromeなど)からサーバー上のリソースを取得し、netstatを使用して接続が確立されていることを確認できます。

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

ただし、curlを使用すると、netstatでサーバー上の接続が表示されません。

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

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

また、次のcurlコマンドを使用してみました。

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

クライアントマシンのcurlバージョンは次のとおりです。

[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

curlで永続的/キープアライブ接続を使用するにはどうすればよいですか?私はこのテーマでかなりのグーグルをしましたが、成功しませんでした。またlinks、リソースを取得するためにクライアントマシンで使用したことにも注意てくださいESTABLISHED。これにより、サーバーに接続できます。

さらに情報を提供する必要がある場合はお知らせください。


回答:


38

curlはすでにデフォルトでキープアライブを使用しています。

例として:

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

以下を生成します。

* 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

このスニペット:

* www.google.comをホストする接続#0はそのまま残します
*既存の接続を再利用します!(#0)ホストwww.google.com

同じ接続を再利用したことを示します。

curl -v http://my.server/url1 http://my.server/url2サーバーに対して同じ " "呼び出しを使用し、同じメッセージが表示されることを確認します。

netstatの代わりにtcpdumpを使用して、パケットの処理方法を確認することを検討してください。netstatは、何が起こっているかを一瞬だけ表示しますが、tcpdumpを使用すると、すべてのパケットが含まれていることがわかります。別のオプションはWiresharkです。


答えてくれてありがとう。ええ、ほとんどのHTTPクライアントがデフォルトでキープアライブを使用していることを理解しました。私が見つけようとしているのは、curlを使用しているときだけESTABLISHEDサーバー上の接続が表示されない理由です。
ロブHruskaの

7
curlを介して1つのURLのみをリクエストする場合、curlが何かを維持する理由はありません。curlプロセスは、すべてのURLがフェッチされるとすぐに終了します。2つのURLを指定し(同じURLを2回使用することもできます)、「curl -v」によって生成される出力に注意してください。netstatの実行時までに、curlが実行されなくなり、接続を開いたままにする理由がなくなるため、接続はすでに閉じられています。
ロシャン

1
それは理にかなっている; 接続を所有するプロセスが終了した場合、接続を維持することは意味がありません。ご協力いただきありがとうございます。
ロブフルスカ

8

サーバーで「KeepAlive On」が許可されている場合、telnetを使用して次のような永続的な接続を維持できます。

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

綺麗な。ループ中にカールを打ちます。
マイケルオゼル

KeepAliveTimoutの変更が適切に適用されたかどうかをテストしようとしていました。これは単なるチケットでした。ありがとう!
デイブグレゴリー

6

HTTP持続接続/キープアライブをテストする1つの方法は、TCP接続が後続の接続に再利用されるかどうかを確認することです。

例えば。http://google.comのリンクが複数回繰り返されているファイルがあります。

以下のコマンドを実行すると、同じTCP接続でhttp://google.comが複数回開きます

curl -K /tmp/file

この間にnetstatを実行すると、TCP接続が変更されておらず、古い接続が再試行されていることがわかります(ソケットは同じままです)。

$ 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   

ただし、永続的なHTTP接続をサポートしないHTTP 1.0を使用するようにクライアントに要求すると、ソケットアドレスが変更されます

$ 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       

これにより、TCP接続が再利用されることを確認できます。


5

-キープアライブ時間

男カール...男..:D


2
manページを読みました、ありがとう。--keepalive-time 60私の例では気づきませんでしたか?
ロブフルスカ

3
ああ...私は今愚かな感じ:(
Arenstar

8
上記のように「キープアライブ時間」を指定しても、HTTPレベルのキープアライブには影響しません。低レベルのTCP接続に影響します。manページ(curl.haxx.se/docs/manpage.html)から:「このオプションは、キープアライブプローブを送信する前に接続がアイドル状態である必要がある時間と、個々のキープアライブプローブ間の時間を設定します。」選択できるキープアライブの種類が非常に多いのは嬉しいです;)
ShabbyDoo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.