4

jBoss 5.1 を実行しており、Tomcat サーブレット コンテナーを使用しています。

不正な HTTP クライアントがソケットを開き、HTTP リクエストを作成し、すべてのデータの読み取りに失敗し、接続を閉じることができないケースをいくつか見てきました。

その結果、Tomcat スレッドは出力ストリームへの書き込みを無期限にブロックします。

SocketOutputStream.socketWrite0(FileDescriptor, byte[], int, int) 
SocketOutputStream.socketWrite(byte[], int, int) 
SocketOutputStream.write(byte[], int, int)  
InternalOutputBuffer.realWriteBytes(byte[], int, int) 
ByteChunk.flushBuffer()
ByteChunk.append(byte[], int, int)
InternalOutputBuffer$OutputStreamOutputBuffer.doWrite(ByteChunk, Response)
IdentityOutputFilter.doWrite(ByteChunk, Response)
InternalOutputBuffer.doWrite(ByteChunk, Response) 
Response.doWrite(ByteChunk)
OutputBuffer.realWriteBytes(byte[], int, int) 
ByteChunk.append(byte[], int, int) 
OutputBuffer.writeBytes(byte[], int, int) 
OutputBuffer.write(byte[], int, int)    
CoyoteOutputStream.write(byte[], int, int)

これらの接続をタイムアウトするように構成するにはどうすればよいですか?

4

3 に答える 3

1

その前にApacheを置くことができます。真剣に。

于 2009-08-14T16:09:29.367 に答える
1

デフォルトのコネクタを使用する場合、タイムアウトはないようです。NioConnector には書き込みタイムアウトがあるようです (ただし、ソースにはこれに関する TODO コメントがいくつかあります)。

そのため、テストを行いたい場合は、NioConnector を使用し、文書化されていない「タイムアウト」オプションを設定します。ソースコードは、それを有効にするには、disableUploadTimeout を「false」にする必要があることを暗示している可能性があります。

基本的に、server.xml で http Connector 要素を次のように変更します。

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" 
  timeout="60000"
  disableUploadTimeout="false"        
  connectionTimeout="20000" 
  redirectPort="8443" />

(デフォルトの tomcat 6.0.20 server.xml ファイルから、timeout および disableUploadTimeout 属性が追加され、プロトコル属性が「org.apache.coyote.http11.Http11NioProtocol」に変更されます)

mod_jk にはいくつかのタイムアウト設定があるようで、mod_proxy よりも apache と密接に連携するはずです。

于 2009-08-14T17:19:08.103 に答える
0

このページにタイムアウトに関して役立つものはありますか?http://tomcat.apache.org/connectors-doc/generic_howto/timeouts.html

于 2009-08-14T16:14:40.247 に答える