Como faço para que o cURL use keepalive na linha de comando?

36

Estou tentando verificar se as conexões persistentes HTTP estão sendo usadas durante a comunicação com um servidor da Web Tomcat que estou executando. Atualmente, posso recuperar um recurso no meu servidor a partir de um navegador (por exemplo, Chrome) e verificar, usando o netstat, se a conexão foi estabelecida:

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

No entanto, se eu usar curl, nunca vejo a conexão no servidor no netstat.

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

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

Eu também tentei usar o seguinte comando curl:

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

Aqui está a versão de ondulação da minha máquina 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

Como faço para usar o curl para usar uma conexão persistente / keepalive? Eu pesquisei bastante no Google, mas sem sucesso. Note-se que eu também usei linksna máquina do cliente para recuperar o recurso, e que faz me dar uma ESTABLISHEDconexão no servidor.

Informe-me se precisar fornecer mais informações.

Rob Hruska
fonte
stackoverflow.com/questions/6086609/…
Ciro Santilli deve ser executado

Respostas:

38

o curl já usa keepalive por padrão.

Como um exemplo:

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

Produz o seguinte:

* 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

Este trecho:

* A conexão nº 0 para hospedar www.google.com permanece intacta
* Reutilizando a conexão existente! (# 0) com o host www.google.com

Indica que reutilizou a mesma conexão.

Use a mesma " curl -v http://my.server/url1 http://my.server/url2" chamada no servidor e verifique se você vê a mesma mensagem.

Considere usar tcpdump em vez de netstat para ver como os pacotes são manipulados. O netstat oferece apenas uma visão momentânea do que está acontecendo, enquanto que com o tcpdump você verá todos os pacotes envolvidos. Outra opção é o Wireshark.

Roshan
fonte
Obrigado pela resposta. Sim, eu entendi que a maioria dos clientes HTTP usa keepalive por padrão. Acho que o que estou tentando descobrir é por que não vejo a ESTABLISHEDconexão no servidor apenas quando estou usando o curl.
9789
7
Se você solicitar apenas um único URL via curl, não há motivo para o curl manter qualquer coisa ativa. O processo de curl será encerrado assim que todos os URLs forem buscados. Especifique dois URLs (pode até ser o mesmo URL duas vezes) e fique de olho na saída produzida por "curl -v". No momento em que o netstat é executado, a conexão já foi fechada, pois o curl não está mais em execução e não há mais um motivo para a conexão ser mantida aberta.
Roshan
1
Isso faz sentido; não faria sentido manter a conexão por aí se o processo que a possuía tiver terminado. Obrigado pela ajuda.
9789
8

Se o seu servidor permitir 'KeepAlive On', você poderá usar o telnet para manter uma conexão persistente da seguinte maneira:

$ while :;do echo -e "GET / HTTP/1.1\nhost: $YOUR_VIRTUAL_HOSTNAME\n\n";sleep 1;done|telnet $YOUR_SERVERS_IP 80
AX Labs
fonte
lindo. Bate uma onda enquanto loop de longe.
Michael Ozeryansky
Eu estava tentando testar se minha alteração do KeepAliveTimout foi aplicada corretamente - esse era apenas o ticket. Obrigado!
58560 Dave
6

Uma maneira de testar a conexão persistente HTTP / Keep-Alive é verificar se a conexão TCP é reutilizada para conexões subseqüentes.

Por exemplo. Eu tenho um arquivo contendo o link http://google.com repetido várias vezes.

A execução do comando abaixo abrirá http://google.com várias vezes com a mesma conexão TCP.

curl -K /tmp/file

E, durante esse período, se você netstat, poderá descobrir que a conexão TCP não foi alterada e a conexão anterior foi redimensionada (o soquete permanece o mesmo).

$ 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   

Mas quando pedimos ao cliente para usar o HTTP 1.0, que não suporta a conexão HTTP persistente, o endereço do soquete muda

$ 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       

disso, podemos ter certeza de que a conexão TCP é reutilizada.

Kannan Mohan
fonte
5

--keepalive-time

homem enrolar ... homem ..: D

Arenstar
fonte
2
Eu li a página de manual, obrigado. Você não percebeu --keepalive-time 60no meu exemplo?
precisa
3
oh ... eu me sinto estúpido agora :(
Arenstar
8
A especificação de "tempo de manutenção", conforme sugerido acima, não afeta a manutenção em nível de HTTP; isso afeta a conectividade TCP de baixo nível. Na página do manual ( curl.haxx.se/docs/manpage.html ): "Esta opção define o tempo que uma conexão precisa permanecer inativa antes de enviar análises de manutenção de atividade e o tempo entre as análises de manutenção de atividade individuais". É bom que existem tantos tipos de KEEP-Alives de que para escolher, suponho;)
ShabbyDoo