中型网站的Apache优化

最近我一直觉得Apache的优化不是必要的,它应该能够正常工作,但没想到却吃了苦头,所以我现在写下来了。忽视基本知识是不好的。

21731ad65f5a1c5459f56a17e58eb544_s.jpg

【追加】我也制作了幻灯片,请有兴趣的人看一看。

前提

    • Apache2.x系です

 

    • preforkでの起動です

 

    • 写真はイメージです

 

    • WEBサーバ数台+DB2台(マスター1、レプリカ1)程度のトラフィックを前提

大規模だとまた話が変わってきます

mpm相关

参数说明

項番項目説明補足1StartServersApache起動時の子プロセス数Apache起動時にまずはここで設定された数の子プロセスを起動します2MinSpareServers待機時の最小子プロセス数子プロセスがMinSpareServersより少なくなったら、この値まで子プロセスを上げます3MaxSpareServers待機時の最大子プロセス数子プロセスがMaxSpareServersより大きくなったら、この値まで子プロセスを下げます4ServerLimit設定可能なサーバプロセス数の上限MaxClientsを256以上に設定したい場合はServerLimitも設定する必要があります。また、 MaxClientsの上に書かないと効きません5MaxClients最大の小プロセス数この数≒最大の同時接続数です6MaxRequestsPerChild1子プロセスが処理するリクエスト数ここで設定された数のリクエストを処理すると子プロセスが死んで、新しい子プロセスに生まれ変わります。”0″にすると無制限にリクエストを処理します

调谐

    • 忙しいサイトなら1-5は全て同じ値に設定してしまいましょう

 

    • どうせ忙しいサイトならMaxClientには達するんだと思います。であれば、変にメモリをケチらずに最初からMaxClientまで子プロセスを起動してしまったほうがレスポンスが良いです

 

    • 急激なトラフィック増の際に多くの子プロセスが一気に起動することでシステムのロードがスパイクし、レスポンスを返せなくなることがあるからです

 

    • mod_wsgiとかmod_perlとか読み込んでいる場合は特に子プロセス起動時のオーバーヘッドは馬鹿にできません

 

    かといって、MaxRequestsPerChildを”0″にして子プロセスを殺さないようにするのはやめたほうが良いです。子プロセスのメモリ使用量が肥大化し、システムでスワップが発生する可能性があります。

计算MaxClient数的方法

    • サーバの物理メモリを消費し尽くしてスワップさせないことが重要です

 

    • httpd1プロセスあたりのメモリ使用量はtopコマンドでおおまかに把握することができます

topコマンドで表示されるRES(物理メモリ使用量)です
各プロセス毎に処理している内容によりメモリ量の増減がありますので、いくつかのhttpdプロセスをサンプリングしておおまかに平均値を算出しましょう

サーバの物理メモリ量 > 上記で算出した1httpdプロセスあたりのメモリ使用量の平均値×MaxClient数+他のプロセスが使うであろうメモリ使用量 となるようにMaxClient数を設定しましょう

top - 17:29:42 up 6 days, 17 min,  4 users,  load average: 0.92, 1.10, 1.23
Tasks: 237 total,   2 running, 235 sleeping,   0 stopped,   0 zombie
Cpu(s): 24.0%us,  0.8%sy,  0.0%ni, 74.7%id,  0.0%wa,  0.0%hi,  0.5%si,  0.1%st
Mem:  15343788k total, 10152612k used,  5191176k free,   231068k buffers
Swap:        0k total,        0k used,        0k free,  2336312k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
26835 apache    20   0  328m  59m 6400 R 29.6  0.4   0:48.24 httpd
26870 apache    20   0  331m  62m 5884 S 27.2  0.4   0:42.28 httpd
26607 apache    20   0  317m  49m 5872 S 20.3  0.3   0:25.53 httpd
27481 apache    20   0  316m  48m 5876 S 12.3  0.3   0:36.53 httpd
26730 apache    20   0  317m  48m 5880 S  9.6  0.3   0:34.03 httpd
26583 apache    20   0  320m  51m 5884 S  1.3  0.3   0:32.28 httpd

HTTP超时

参数说明

項番項目説明補足1Timeoutリクエストを受け取ってから処理完了までの待機時間下記のそれぞれの時間にTimeoutが設定されます。1. GET リクエストを受け取るのにかかる総時間 2. POST や PUTリクエストにおいて、次の TCP パケットが届くまでの待ち時間 3. レスポンスを返す際、TCP の ACK が帰ってくるまでの時間2KeepAlive持続的接続を許可するHTTPで定義されているKeepAlive接続を有効にする設定。1つのTCP接続で複数のHTTPリクエストが処理されるようになる3MaxKeepAliveRequests持続的接続で許されるリクエスト数1回のKeepAlive接続で処理可能なリクエスト数4KeepAliveTimeout持続的な接続で次のリクエストを待つ時間KeepAliveをOnにしていた場合のみ有効

调音

    • Timeoutのデフォルト値は300秒ですが、長過ぎますので、短くしましょう。応答のないクライアントを5分も待つやさしさは不要です。我々は忙しいんです

 

    • KeepAliveは幻想の機能です。忙しいサイトなら使うのやめましょう。忙しくないサイトならどちらでも良いと思います

 

    • KeepAliveを有効にすれば、たしかに1回の接続でクライアントから複数のリクエストを送ることができるため、TCP接続のオーバーヘッドやコネクション数が抑えられる気がします

 

    • しかし、それは幻想です。結局、1クライアントから複数のTCPコネクションを張られ、そのコネクションが長時間専有されることで、Apacheの子プロセスをあっという間に消費しつくされてしまいます

 

    • KeepAliveをOffにしていればMaxKeepAliveRequestsやKeepAliveTimeoutはいくつでもかまわないです

 

    上記のようにKeepAliveは切ったほうが良いですが、AWSのELB配下では切らない方が良いようです → Amazon ELBをうまくつかうには、KeepAliveを有効にしよう。Timeoutは60秒よりだいぶ長くしよう。その背景。

HTTP通信压缩

参数说明

項番項目説明補足1SetOutputFilter圧縮機能を有効にします。mod_deflateモジュールを使い圧縮します。フィルタとしてDEFLATEを指定しると圧縮機能が有効になります。2AddOutputFilterByType圧縮対象とするMIMEタイプを指定します。htmlやcssはもちろんjavascriptなども圧縮しましょう

调音

    • PNGやJPEGなどの画像ファイルはすでに圧縮されているため圧縮対象から外すと無駄な圧縮処理をしないですみます

 

    • 古いブラウザではバグなどにより圧縮対応していないものもあるので無効にします(今どき使ってる人いないと思いますが。。。)

 

    • 実際のconfの書き方は下記サイトを参考にしてみてください

Apacheのmod_deflateでコンテンツを圧縮してサイトを高速化する方法

日志文件相关

主机名查找

    • アクセスをログファイルに記録する際に接続元IPアドレスをDNSで逆引きするオプションです

 

    DNSの逆引きは時間がかかることが多いですので、Offにするのは必須です

招募伙伴

我们株式会社Spica正在寻找一位有能力共同进步的工程师!请一定查看以下详情!

广告
将在 10 秒后关闭
bannerAds