Làm cách nào để tạo cURL sử dụng keepalive từ dòng lệnh?


36

Tôi đang cố gắng xác minh rằng các kết nối liên tục HTTP đang được sử dụng trong quá trình giao tiếp với máy chủ web Tomcat mà tôi đã chạy. Hiện tại, tôi có thể truy xuất tài nguyên trên máy chủ của mình từ trình duyệt (ví dụ: Chrome) và xác minh bằng netstat rằng kết nối được thiết lập:

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

Tuy nhiên, nếu tôi sử dụng curl, tôi không bao giờ thấy kết nối trên máy chủ trong netstat.

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

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

Tôi cũng đã thử sử dụng lệnh curl sau:

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

Đây là phiên bản curl của máy khách của tôi:

[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

Làm cách nào để có được curl để sử dụng kết nối liên tục / liên tục? Tôi đã thực hiện khá nhiều về Google về chủ đề này, nhưng không thành công. Cần lưu ý rằng tôi cũng đã sử dụng linkstrên máy khách để lấy tài nguyên và điều đó cho tôi một ESTABLISHEDkết nối trên máy chủ.

Hãy cho tôi biết nếu tôi cần cung cấp thêm thông tin.


Câu trả lời:


38

curl đã sử dụng keepalive theo mặc định.

Ví dụ:

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

Sản xuất như sau:

* 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

Đoạn trích này:

* Kết nối # 0 với máy chủ www.google.com còn nguyên
* Sử dụng lại kết nối hiện có! (# 0) với máy chủ www.google.com

Cho biết nó được sử dụng lại cùng một kết nối.

Sử dụng cùng một curl -v http://my.server/url1 http://my.server/url2lời gọi "" đối với máy chủ của bạn và kiểm tra xem bạn có thấy thông báo tương tự không.

Cân nhắc sử dụng tcpdump thay vì netstat để xem cách các gói được xử lý. netstat sẽ chỉ cung cấp cho bạn cái nhìn thoáng qua về những gì đang xảy ra, trong khi với tcpdump, bạn sẽ thấy mọi gói tin liên quan. Một lựa chọn khác là Wireshark.


Cảm ơn câu trả lời. Vâng, tôi đã hiểu rằng hầu hết các máy khách HTTP đều sử dụng thủ tục theo mặc định. Tôi đoán những gì tôi đang cố gắng tìm hiểu là tại sao tôi không thấy ESTABLISHEDkết nối trên máy chủ chỉ khi tôi sử dụng curl.
Rob Hruska

7
Nếu bạn chỉ yêu cầu một URL thông qua curl, không có lý do gì để curl giữ bất cứ điều gì còn sống. Quá trình cuộn tròn sẽ chấm dứt ngay khi tất cả các URL đã được tìm nạp. Chỉ định hai URL (thậm chí có thể là cùng một URL hai lần) và để mắt đến đầu ra được tạo bởi "curl -v". Vào thời điểm netstat chạy, kết nối đã bị đóng do curl không còn chạy nữa và không còn lý do nào để kết nối được mở.
Roshan

1
Điều đó có ý nghĩa; Sẽ không có ý nghĩa gì khi giữ kết nối nằm xung quanh nếu quá trình sở hữu nó kết thúc. Cảm ơn bạn đã giúp đỡ.
Rob Hruska

8

Nếu máy chủ của bạn cho phép 'KeepAlive On', bạn có thể sử dụng telnet để duy trì kết nối liên tục như sau:

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

đẹp. Nhịp đập trong khi vòng lặp xa.
Michael Ozeryansky

Tôi đã cố kiểm tra xem thay đổi KeepAliveTimout của tôi đã được áp dụng đúng chưa - đây chỉ là vé. Cảm ơn!
Dave Gregory

6

Một cách để kiểm tra kết nối liên tục HTTP / Keep-Alive là xem kết nối TCP có được sử dụng lại cho các kết nối tiếp theo không.

Ví dụ. Tôi có một tệp chứa liên kết của http://google.com được lặp lại nhiều lần.

Chạy bên dưới lệnh sẽ mở http://google.com nhiều lần với cùng một kết nối TCP.

curl -K /tmp/file

Và trong thời gian này nếu bạn netstat, bạn có thể thấy rằng kết nối TCP không thay đổi và kết nối cũ hơn được nối lại (Ổ cắm vẫn giữ nguyên).

$ 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   

Nhưng khi chúng tôi yêu cầu khách hàng sử dụng HTTP 1.0, liều nào không hỗ trợ kết nối HTTP liên tục, địa chỉ ổ cắm thay đổi

$ 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       

từ đây, chúng ta có thể chắc chắn rằng kết nối TCP được sử dụng lại.


5

- giữ thời gian

người đàn ông cuộn tròn ... người đàn ông ..: D


2
Tôi đã đọc trang người đàn ông, cảm ơn. Bạn đã không nhận thấy --keepalive-time 60trong ví dụ của tôi?
Rob Hruska

3
oh ... tôi cảm thấy ngu ngốc bây giờ :(
Arenstar

8
Việc chỉ định "thời gian duy trì" như được đề xuất ở trên không ảnh hưởng đến việc giữ mức HTTP; nó ảnh hưởng đến kết nối TCP cấp thấp. Từ trang man ( curl.haxx.se/docs/manpage.html ): "Tùy chọn này đặt thời gian kết nối cần ở trạng thái chờ trước khi gửi các đầu dò giữ nguyên và thời gian giữa các đầu dò giữ riêng lẻ." Thật tuyệt khi có rất nhiều loại cuộc sống để lựa chọn, tôi cho rằng;)
ShabbyDoo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.