cURL을 명령 줄에서 keepalive로 사용하려면 어떻게해야합니까?


36

실행중인 Tomcat 웹 서버와 통신하는 동안 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

내 클라이언트 컴퓨터의 컬 버전은 다음과 같습니다.

[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

지속적 / 유지 연결을 사용하기 위해 컬을 어떻게 얻습니까? 나는 주제에 대해 꽤 많은 인터넷 검색을 수행했지만 성공하지 못했습니다. 내가 또한 사용한 적이 있음을 주목해야한다 links자원을 검색하기 위해 클라이언트 시스템에서, 그것은 하지 나에게주는 ESTABLISHED서버에 연결합니다.

더 자세한 정보가 필요하면 알려주세요.


답변:


38

curl은 기본적으로 keepalive를 사용합니다.

예로서:

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은 그대로 유지
* 기존 연결 재사용! 호스트가 www.google.com 인 (# 0)

동일한 연결을 재사용했음을 나타냅니다.

curl -v http://my.server/url1 http://my.server/url2서버에 대해 동일한 " "호출을 사용하고 동일한 메시지가 표시되는지 확인하십시오.

패킷 처리 방법을 보려면 netstat 대신 tcpdump를 사용하십시오. netstat는 당신에게 무슨 일이 일어나고 있는지 잠시 보여줄 것입니다. 반면 tcpdump를 사용하면 관련된 모든 단일 패킷을 볼 수 있습니다. 다른 옵션은 Wireshark입니다.


답변 해주셔서 감사합니다. 예, 대부분의 HTTP 클라이언트는 기본적으로 keepalive를 사용한다는 것을 이해했습니다. 내가 찾으려고하는 것은 curl을 사용할 때만ESTABLISHED 서버 에서 연결 이 보이지 않는 이유 입니다.
Rob Hruska

7
curl을 통해 단일 URL 만 요청하는 경우 curl이 살아있는 것을 유지할 이유가 없습니다. 모든 URL을 가져 오면 컬 프로세스가 종료됩니다. 두 개의 URL (동일한 URL 일 수도 있음)을 지정하고 "curl -v"에 의해 생성 된 출력을 주시하십시오. netstat이 실행될 때 curl이 더 이상 실행되지 않고 더 이상 연결을 열어 둘 이유가 없기 때문에 연결이 이미 닫혔습니다.
Roshan

1
말이 되네요. 소유하고있는 프로세스가 완료된 경우 연결을 유지하는 것은 합리적이지 않습니다. 당신의 도움을 주셔서 감사합니다.
Rob Hruska

8

서버에서 'KeepAlive On'을 허용하면 텔넷을 사용하여 다음과 같이 지속적인 연결을 유지할 수 있습니다.

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

아름다운. 컬 루프를 멀리 치십시오.
Michael Ozeryansky

KeepAliveTimout 변경 사항이 제대로 적용되었는지 테스트하려고했는데 이것은 티켓 일뿐입니다. 감사!
Dave Gregory

6

HTTP 영구 연결 / Keep-Alive를 테스트하는 한 가지 방법은 후속 연결에 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
맨 페이지를 읽었습니다. 감사합니다. --keepalive-time 60내 예에서를 눈치 채지 못했습니까 ?
Rob Hruska

3
아 ... 난 :( 지금은 바보가 된 기분
Arenstar

8
위에서 제안한대로 "keepalive-time"을 지정해도 HTTP 레벨 연결 유지에는 영향을 미치지 않습니다. 낮은 수준의 TCP 연결에 영향을줍니다. 매뉴얼 페이지 ( curl.haxx.se/docs/manpage.html )에서 : "이 옵션은 연결 유지 프로브를 보내기 전에 연결이 유휴 상태를 유지해야하는 시간과 개별 연결 유지 프로브 사이의 시간을 설정합니다." 그것은 선택할 수있는 연결 유지 (keep-alive)를 너무 많은 종류가 있다는 것을 좋다, 나는 가정)
ShabbyDoo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.