ฉันจะทำให้ 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

นี่คือเวอร์ชัน 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 เพื่อใช้การเชื่อมต่อแบบถาวร / keepalive ได้อย่างไร ฉันเคยทำ Googling มาบ้างแล้ว แต่ก็ไม่ประสบความสำเร็จ มันควรจะตั้งข้อสังเกตว่าผมเคยใช้ยัง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
Rob Hruska

7
หากคุณขอเพียง URL เดียวผ่านทาง curl ไม่มีเหตุผลใดที่ curl จะทำให้ทุกสิ่งมีชีวิตชีวา กระบวนการ curl จะสิ้นสุดลงทันทีที่ URL ทั้งหมดถูกดึงออกมา ระบุสอง URL (อาจเป็น URL เดียวกันสองครั้ง) และจับตาดูผลลัพธ์ที่ผลิตโดย "curl -v" เมื่อ netstat รันการเชื่อมต่อได้ถูกปิดไปแล้วเนื่องจาก curl ไม่ทำงานอีกต่อไปและไม่มีเหตุผลใดที่การเชื่อมต่อจะเปิดขึ้น
Roshan

1
นั่นทำให้รู้สึก; มันจะไม่มีเหตุผลที่จะทำให้การเชื่อมต่อโกหกหากกระบวนการที่เป็นเจ้าของเสร็จสิ้น ขอบคุณสำหรับความช่วยเหลือของคุณ.
Rob Hruska

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

สวย. เต้นขดในขณะที่วงไกล
Michael Ozeryansky

ฉันพยายามที่จะทดสอบว่าการเปลี่ยนแปลง KeepAliveTimout ของฉันถูกนำไปใช้อย่างถูกต้องหรือไม่ - นี่เป็นเพียงตั๋ว ขอบคุณ!
Dave Gregory

6

วิธีหนึ่งในการทดสอบการเชื่อมต่อ HTTP ถาวร / Keep-Alive คือการดูว่าการเชื่อมต่อ TCP ถูกนำมาใช้ซ้ำสำหรับการเชื่อมต่อที่ตามมา

ตัวอย่างเช่น. ฉันมีไฟล์ที่มีลิงก์ของhttp://google.co.thซ้ำหลายครั้ง

คำสั่งเรียกใช้ด้านล่างจะเปิดhttp://google.co.thหลายครั้งด้วยการเชื่อมต่อ TCP เดียวกัน

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 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 เวลา

คนงอ ... คน .. : D


2
ฉันอ่าน man page แล้วขอบคุณ คุณไม่สังเกตเห็น--keepalive-time 60ในตัวอย่างของฉัน?
Rob Hruska

3
โอ้ ... ฉันรู้สึกงี่เง่าตอนนี้: (
Arenstar

8
การระบุ "keepalive-time" ตามที่แนะนำข้างต้นจะไม่ส่งผลต่อระดับ HTTP ให้คงอยู่ มันมีผลต่อการเชื่อมต่อ TCP ระดับต่ำ จากหน้า man ( curl.haxx.se/docs/manpage.html ): "ตัวเลือกนี้จะกำหนดเวลาที่การเชื่อมต่อจะต้องไม่ได้ใช้งานก่อนที่จะส่งโพรบ Keepalive และเวลาระหว่างโพรบ Keepalive แต่ละรายการ" เป็นเรื่องที่ดีที่มีสัตว์รักษาไว้มากมายให้เลือกฉันคิดว่า;)
ShabbyDoo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.