64 ビットの Fedora 2.6.21.7 EC2 2xlarge インスタンス (AKI aki-b51cf9dc) で実行されている、Apache 2.2.11 アプリ サーバーにプロキシする Tomcat フロントエンド サーバーがあります。Apache は mod_perl を実行しており、スレッド化されていません。
別の EC2 インスタンスで実行されている Tomcat と Apache サーバーの間の接続を長時間持続させようとしていますが、外部クライアントから直接 Apache サーバーに入る接続は持続しません。構成は次のようになります。
Listen 80
NameVirtualHost *:80
# used for external clients
<VirtualHost *:80>
ServerName xxx.yyy.com
ServerAlias *.yyy.com
DocumentRoot "/var/www/html"
KeepAlive Off
</VirtualHost>
# used from tomcat server on local network
<VirtualHost *:80>
ServerName ip-<Apache-server-local-IP>.ec2.internal
KeepAlive On
KeepAliveTimeout 3600
MaxKeepAliveRequests 0
DocumentRoot "/var/www/html"
</VirtualHost>
TimeOut 60
MinSpareServers 20
MaxSpareServers 30
StartServers 20
MaxClients 60
GracefulShutdownTimeout 90
MaxKeepAliveRequests と KeepAliveTimeout のあらゆる種類の値を試しましたが、サーバーは間違いなく Tomcat との接続をしばらく維持しますが、数十のリクエストしか処理されない場合、常に数秒以内に接続を閉じます。mod_status を使用して監視しているときに、プロセスがソケットで 100 以上の接続を維持しているのを見たことがないことは重要かもしれません。
Tomcat 以外のクライアントとの永続的な接続はまったくないため、そこにはいくつかの違いがあり、両方のケースで VirtualHost 構成が確実に適用されていることがわかります。
Tomcat からのリクエストはすべて POST ですが、その他のリクエストは POST と GET が混在していることに注意してください。
特定のポートのトラフィックを tcpdump で調べると、多数の POST が正しく処理されていることがはっきりとわかります。その後、適切な応答 (200、データは問題ないようです) を返した後、Apache サーバーはすぐに接続を閉じ、 FIN から Tomcat へ。これは、実際のクライアントの IP などのマイナー データ以外に、最後と最後から 2 番目の要求または応答の間にまったく違いがない場合に発生するため、要求の処理中にサーバーがバーフィングしている兆候はありません。そしてもちろん、エラー ログには疑わしいものは何もなく、httpd プロセス自体は停止していません。
netstat から、Tomcat サーバーへの接続が数秒間開いたままになっていることがわかりますが、リモート ポートの範囲を非常に速く循環し、他の場所で見られることを確認しています。永続的な接続が他の接続を枯渇させないように、Apache が公平に接続を割り当てようとしているように見えますが、そうはなりませんよね?!
ここでばかげたことをしていると言われるだけでいいのです!どうか、私が馬鹿か、少なくとも近視だと教えてください...