4

Gradle を使用して単純なサーバー Java アプリケーションを作成しました。組み込みサーバーとして、私は Jetty を使用しています。最新の Jetty バージョンをサポートしているため、 Grettyプラグインも使用しています。

プロジェクトは問題なく実行されます。そして、私はそれをストレステストしようとしました。私のテストの一環として、応答時間を確認する必要があるため、"Connection:Close"経由でヘッダーを送信してcurlいます。

私の応答は長い JSON 文字列で、その一部しか表示されず、その後接続がハングします。なぜそれが起こっているのか、どうすれば回避できるのかを知りたいです。

ノート :

  1. Connection:Keep-aliveヘッダーを送信するとき、すべて問題ありません
  2. サーバーからの応答が長い文字列ではなく、小さい場合。正常に動作します(ハングしない)
  3. gradle から標準の Jetty プラグインを試してみましたが、結果は同じでした。

テスト方法:

  1. コンソールからプロジェクトをビルドして実行する./gradlew appRun
  2. bash コンソールから実行curl -H "Connection:Close" -i "http://localhost:8080/Environment/example"
  3. 部分的な応答と接続がまだ生きていることを確認してください...
4

1 に答える 1

3

HTTP/1.0との間の永続的な接続モードを混同しているようですHTTP/1.1

それか、またはcurlデフォルトでまだの非常に古いバージョンを使用していHTTP/1.0ます。

HTTP/1.0にはデフォルトで永続的な接続がないため、永続的な接続を使用するには、 を送信しますConnection: keep-alive

HTTP/1.1デフォルトで永続的な接続を使用するため、それを無効にするには送信できますConnection: close

を使用HTTP/1.0すると、Connection: closeこれを送信するようなものです...

GET /Environment/example HTTP/1.0
Host: localhost:8080
Connection: close

...仕様Connectionごとに無効なヘッダー値を生成しますHTTP/1.0

curl の冗長機能を使用して、接続に関して実際に何が起こっているかを確認してみましょう...

例:HTTP/1.1通常の操作の場合:

$ curl --verbose --http1.1 http://apache.org/ -so /dev/null
*   Trying 88.198.26.2...
* Connected to apache.org (88.198.26.2) port 80 (#0)
> GET / HTTP/1.1
> Host: apache.org
> User-Agent: curl/7.43.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Fri, 06 May 2016 12:05:39 GMT
< Server: Apache/2.4.7 (Ubuntu)
< Last-Modified: Fri, 06 May 2016 11:10:20 GMT
< ETag: "cf64-5322a812896a8"
< Accept-Ranges: bytes
< Content-Length: 53092
< Vary: Accept-Encoding
< Cache-Control: max-age=3600
< Expires: Fri, 06 May 2016 13:05:39 GMT
< Content-Type: text/html
< 
{ [1125 bytes data]
* Connection #0 to host apache.org left intact

接続をそのまま維持していることに注意してください。

例:HTTP/1.1手動Connection: close操作の場合:

$ curl --verbose --http1.1 --header "Connection: close" http://apache.org/ -so /dev/null
*   Trying 140.211.11.105...
* Connected to apache.org (140.211.11.105) port 80 (#0)
> GET / HTTP/1.1
> Host: apache.org
> User-Agent: curl/7.43.0
> Accept: */*
> Connection: close
> 
< HTTP/1.1 200 OK
< Date: Fri, 06 May 2016 12:06:35 GMT
< Server: Apache/2.4.7 (Ubuntu)
< Last-Modified: Fri, 06 May 2016 11:10:20 GMT
< ETag: "cf64-5322a812896a8"
< Accept-Ranges: bytes
< Content-Length: 53092
< Vary: Accept-Encoding
< Cache-Control: max-age=3600
< Expires: Fri, 06 May 2016 13:06:35 GMT
< Connection: close
< Content-Type: text/html
< 
{ [1106 bytes data]
* Closing connection 0

ああ、HTTP 応答ヘッダーはサーバーが閉じられることを示しており、curl は接続が閉じられていることを確認しました。私たちが欲しかったもの。

例:HTTP/1.0通常の操作の場合:

$ curl --verbose --http1.0 http://apache.org/ -so /dev/null
*   Trying 140.211.11.105...
* Connected to apache.org (140.211.11.105) port 80 (#0)
> GET / HTTP/1.0
> Host: apache.org
> User-Agent: curl/7.43.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Fri, 06 May 2016 12:08:27 GMT
< Server: Apache/2.4.7 (Ubuntu)
< Last-Modified: Fri, 06 May 2016 11:10:20 GMT
< ETag: "cf64-5322a812896a8"
< Accept-Ranges: bytes
< Content-Length: 53092
< Vary: Accept-Encoding
< Cache-Control: max-age=3600
< Expires: Fri, 06 May 2016 13:08:27 GMT
< Connection: close
< Content-Type: text/html
< 
{ [4002 bytes data]
* Closing connection 0

サーバーが閉じることを HTTP 応答ヘッダーがどのように示しているかがわかりますか?

Curl は、接続が閉じていることも確認しました。

HTTP/1.0これは、通常の操作で期待されることです。

例:HTTP/1.0永続的な接続の場合:

$ curl --verbose --http1.0 --header "Connection: keep-alive" http://apache.org/ -so /dev/null
*   Trying 88.198.26.2...
* Connected to apache.org (88.198.26.2) port 80 (#0)
> GET / HTTP/1.0
> Host: apache.org
> User-Agent: curl/7.43.0
> Accept: */*
> Connection: keep-alive
> 
< HTTP/1.1 200 OK
< Date: Fri, 06 May 2016 12:08:37 GMT
< Server: Apache/2.4.7 (Ubuntu)
< Last-Modified: Fri, 06 May 2016 11:10:20 GMT
< ETag: "cf64-5322a812896a8"
< Accept-Ranges: bytes
< Content-Length: 53092
< Vary: Accept-Encoding
< Cache-Control: max-age=3600
< Expires: Fri, 06 May 2016 13:08:37 GMT
< Keep-Alive: timeout=30, max=100
< Connection: Keep-Alive
< Content-Type: text/html
< 
{ [3964 bytes data]
* Connection #0 to host apache.org left intact

うん、サーバーはキープアライブも使用することを示し (HTTP/1.0 仕様に従って)、curl も同意して、接続はそのまま残されていると言います。

于 2016-05-06T12:13:02.547 に答える