Як змусити CURL використовувати keepalive з командного рядка?


36

Я намагаюся переконатися, що стійкі HTTP-з'єднання використовуються під час спілкування з запущеним веб-сервером Tomcat. В даний час я можу отримати ресурс на своєму сервері з браузера (наприклад, 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

Як змусити завиток використовувати стійке / keepalive з'єднання? Я зробив досить багато гугла на цю тему, але без успіху. Слід зазначити, що я також використовував 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

Цей фрагмент:

* Підключення № 0 до хоста www.google.com залишилося недоторканим
* Повторне використання наявного з'єднання! (# 0) з хостом www.google.com

Вказує на те, що він повторно використовував те саме з'єднання.

Використовуйте те саме " curl -v http://my.server/url1 http://my.server/url2" виклик проти вашого сервера і переконайтеся, що ви бачите те саме повідомлення.

Подумайте про використання tcpdump замість netstat, щоб побачити, як обробляються пакети. netstat дасть вам лише миттєвий огляд того, що відбувається, тоді як за допомогою tcpdump ви побачите кожен причетний пакет. Ще один варіант - Wireshark.


Дякую за відповідь. Так, я зрозумів, що більшість клієнтів HTTP використовують keepalive за замовчуванням. Я думаю, те, що я намагаюся з'ясувати, це те, чому я не бачу ESTABLISHEDз'єднання на сервері лише тоді, коли використовую curl.
Роб Грушка

7
Якщо ви вимагаєте лише одну URL-адресу за допомогою curl, немає ніяких причин для curl нічого залишати в живих. Процес згортання припиняється, як тільки всі URL-адреси будуть отримані. Вкажіть дві URL-адреси (це може бути навіть одна і та ж URL-адреса двічі) і слідкуйте за результатами, отриманими "curl -v". До моменту запуску netstat з'єднання вже було закрито, оскільки згортання більше не працює і більше немає причини, щоб з'єднання було відкритим.
Рошань

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 / Keep-Alive - це перевірити, чи буде повторно використане з’єднання TCP для наступних з'єднань.

Наприклад. У мене є файл, що містить посилання на http://google.com, повторений кілька разів.

Команда, що працює нижче, відкриє http://google.com кілька разів із тим самим підключенням TCP.

curl -K /tmp/file

І за цей час, якщо ви будете netstat, ви можете виявити, що TCP-з'єднання не змінилося і старіший відновиться (Socket залишається тим самим).

$ 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 1.0, доза якого не підтримує стійке HTTP-з'єднання, адреса сокета змінюється

$ 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

--keepalive-час

man curl ... man ..: D


2
Я прочитав сторінку чоловіка, дякую. Ви не помітили на --keepalive-time 60моєму прикладі?
Роб Грушка

3
ой ... я зараз почуваюся дурним :(
Аренстар

8
Вказівка ​​"keepalive time", як було запропоновано вище, не впливає на підтримку рівня HTTP; це впливає на низький рівень підключення TCP. Зі довідкової сторінки ( curl.haxx.se/docs/manpage.html ): "Цей параметр встановлює час, коли з'єднання потрібно залишатись в режимі очікування, перш ніж надсилати зонди для зберігання, і час між окремими датчиками збереження." Приємно, що існує так багато видів, які можна вибрати, я вважаю;)
ShabbyDoo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.