Delphi2007 と Indy10 を使用して Web サーバーを作成しました。
サーバーは最初は正常に動作しますが、しばらくすると (通常は 8 ~ 48 時間)、DoMaxConnectionsExceededメソッドが起動し始めます。Web サーバーが正常に動作しなくなりました。現在、MaxConnectionsを 500 に設定しています。過去にこの設定を変更して実験しました。また、値が大きいほど、Web サーバーの存続期間が長くなるようです。だから、接続が解放されていないと思います。
- インスタンス化で何か間違ったことをしていますか? 接続が解放されないのはなぜですか?
- すべての接続のリストを取得する方法はありますか (これを行うことで、IP アドレスを確認し、DOS 攻撃であるかどうかを確認できます)。また、ヒットしようとしている URL を取得する方法はありますか?
- また、 KeepAliveプロパティを変更せず に実験しました。
- MaxConnectionsを 0に設定する必要がありますか?
TIdHTTPServer をインスタンス化するためのソース コード:
IdHTTPServer1 := TIdHTTPServer.Create;
IdHTTPServer1.MaxConnections := 500;
IdHTTPServer1.AutoStartSession := True;
IdHTTPServer1.KeepAlive := FGlobalKeepAlive;
IdHTTPServer1.SessionState := True;
IdHTTPServer1.OnCommandGet := IdHTTPServer1CommandGet;
IdHTTPServer1.onexception := IdHttpServerexception;
IdHTTPServer1.onlistenexception := IdHttpServerlistenexception;
idHttpServer1.ParseParams := True;
idHttpServer1.OnQuerySSLPort := QuerySSLPort;
idHttpServer1.IOHandler := ServerIOHandler;
idHttpServer1.Bindings.Add.Port := 80;
idHttpServer1.Bindings.Add.Port := 443;
IdHTTPServer1.Active := True;
更新- 追加したいのですが、SSL に関連している可能性があります。SSL を必要としない同様の Indy ベースの Web サーバーがあります。定期的に失敗することはありますが、それほど頻繁に失敗することはありません。しかし、これらではDoMaxConnectionsExceededをログに記録していません。このイベントの追跡を追加して、maxconnections を超えたことが原因で失敗するかどうか、いつ失敗するかを確認します。