netstat -ntp |grep 80
は、単一のIPアドレスからのESTABLISHED
接続が多すぎます。それらの周りそしてそれは攻撃ではないそしてユーザーはApacheにアクセスするために2G接続を使用しています。これは、他の2G接続にも当てはまります。この結果、Apacheは子を使い果たしています。
以前はclose_wait
が多すぎて、tcp_tw_reuse
とtcp_tw-recycle
を有効にした後、close_wait
はあまりありませんが、ESTABLISHED
接続の数が増えました。
48GBのRAMを搭載したUbuntu11.04を使用しています
keepalive On
keepalive timeout 10
max clients 800
max-request-perchild 4000
timeout 300
syn_ack
を1に、syn_retries
を2に設定しました。
Wi-Fiではそのような問題はありません。接続は適切に閉じていますが、2G接続では、Apacheの子が不足しており、ESTABLISHED
接続が多すぎます。
また、デフォルトの300から30にtimeoutを設定してみましたが、私たちのプロジェクトは携帯電話用の画像ホスティングであるため、クライアントは頻繁にタイムアウトするため、画像を適切にアップロードできませんでした。 of 408メッセージなので、デフォルトの300に変更しました
tcp_tw_reuseおよびtcp_tw-recycleおよびtcp-fin_timeoutを30に
フィンのタイムアウトはここで役立ちますが、再利用して再利用しますか?どうして?
キープアライブタイムアウト10
これはばかげています。ダイヤルアップを使用する場合でも、これは3以下である必要があります。
タイムアウト300
これが何をするか知っていますか?これがデフォルトかもしれませんが、やはり高すぎます。
Wiresharkを使用してトラフィックの一部をキャプチャして、接続が閉じられない理由を正確に確認してみてください。
Mod_reqtimeoutをオプションとして使用しています
クライアントが非常にひどく壊れていて、あなたが彼らにサービスを提供することに悩まされていない場合にのみ。
ngnixサーバーに移動する必要があります
確かに遅い接続をはるかに簡単に処理しますが、プロキシとして使用することもできます(そして、iptablesを使用してこれを介して特定のサブネットを選択的/透過的にルーティングできます)
問題は低速クライアントに関連しています。これを解決する最良の方法は、リバースプロキシソリューションを使用することです。 Apacheからの場合は、nginx、ワニス、または同様のソフトウェア。優れたリバースプロキシサーバーは、何千もの接続を問題なく処理できます。
Timeout
ディレクティブを10
や5
などのはるかに低いものにドロップしようとしましたか?
または、プリフォークMPMから切り替えて(可能な場合)、Apache2.4のイベントMPMなどのイベント駆動型モデルまたはnginxなどの別のWebサーバーを使用することもできます。
Apacheの前でリバースプロキシとしてnginx(または同様のもの)を使用することもできます。プロキシは、リクエスト全体を受信するまで待機してから、Apacheにアップストリームリクエストを送信します。この場合、このリクエストの途中で遅延は発生しません。
Apacheの子が不足する問題は、使用しているKeepalive
設定によっても引き起こされたり悪化したりする可能性があります。これをオフにするか、keepalive timeout
値を下げることを検討してください。もちろん、低くしすぎると役に立たなくなる可能性があります。