包括的なWordPressりェブサむト最適化

ハブルの芪愛なる居䜏者



サむトをどのように最適化したかに぀いおのストヌリヌが衚瀺されたす。 このサむトはWordpress゚ンゞンで実行されたすこのフレヌズでは、ほずんどの読者はWordPressが高速でどのように機胜しおいるかを知っおしかめっ面をする必芁がありたす。 しかし、私たちは成功し、サむトは飛び始めたした。 私はサヌバヌ最適化の専門家ずはみなされないこずをすぐに蚀わなければなりたせんが、私が達成したこずは私にずっお非垞に楜しいです。 たた、貎重な経隓が埗られ、Habrの読者ず共有したいず思いたす。



行こう



たず、サむトの阻害の原因を調査するこずから始めたした。 個人的には、 LoadImpactサヌビスが最も気に入っおいたす。 少し前たで、圌は新しい機胜ず新しいむンタヌフェヌスを持ち、サヌビス自䜓は「LoadImpact 2.0」ず呌ばれ始めたした。 これはすべお広告甚ではないず蚀われおいたす-サヌビスは本圓に良いです。 Pingdom Full Page TestずGoogle PageSpeedのようなサヌビスを䜿甚しおサむトをテストするこずもできたす。



Load Impact Page Analyzerを䜿甚しお、Time to first byteパラメヌタヌ4秒の倧きな倀を芋぀けたした。これは、ペヌゞを圢成するPHPスクリプトが長時間実行されおいるこずを瀺しおいたす。 サむトの最も阻害的なコンポヌネントを怜玢する必芁がありたした。



footer.phpテンプレヌトに行を远加する



<!-- <?php echo get_num_queries(); ?> queries -->







メむンペヌゞを生成するのに82のSQLク゚リが必芁であるこずがわかりたした。 WordPressモゞュヌルの数ず、それらを䜿甚するSQLク゚リの数を枛らす必芁があるこずが明らかになりたした。 むンストヌルされたWordPressプラグむン玄40個を敎理するず、結局のずころ、それらのほずんどが本圓に必芁であるこずがわかりたした。



テンプレヌト内のすべおのPHPコヌドをプロファむルするこずにしたした。 Xdebug + Performance Testingは気にしたせんでしたこのため、サヌドパヌティの゜フトりェアを倧量に配眮する必芁がありたしたが、次の圢匏の簡単な自己蚘述型プロファむリングを行いたした。



<!-- HEADER01 - <?php print microtime(true) ?> -->







次の䞻な問題をすぐに発芋したした。

これらの問題のそれぞれは、綿密な調査の際に、基準面を匕き起こしたす。 次に、それぞれに぀いお説明したす。



回



私たちのサむトの最倧のブレヌキは、ゞオタヌゲティング広告モゞュヌルです。 その本質は、サむトに2皮類のバナヌが衚瀺されるこずです。1぀はサンクトペテルブルクからの蚪問者甚に、もう1぀は他のすべおのバナヌ甚に衚瀺されたす。 モゞュヌルを詳しく調べおみるず、govnokodが芋぀かりたした。



 if$ ip_part
 {
 for$ y1 = $ ip_part [0] ['start']; $ y1 <= $ ip_part [0] ['end']; $ y1 ++
 for$ y2 = $ ip_part [1] ['start']; $ y2 <= $ ip_part [1] ['end']; $ y2 ++
 for$ y3 = $ ip_part [2] ['start']; $ y3 <= $ ip_part [2] ['end']; $ y3 ++
 for$ y4 = $ ip_part [3] ['start']; $ y4 <= $ ip_part [3] ['end']; $ y4 ++
 {
 $ ip [] = $ y1。 "。"。$ y2。 "。"。$ y3。 "。"。$ y4;
 if$ ip_addr == $ y1。 "。"。$ y2。 "。"。$ y3。 "。"。$ y4trueを返したす。
 }
 }


この瞬間、私はプロセッサヌに少し申し蚳なく思っおいたした。



サンクトペテルブルクのIPアドレスの初期範囲は、事前に$ ip_part配列に蚭定されおいたす。 このコヌドからわかるように、関数を呌び出すたびに、䜕らかの理由で、$ ipの動的配列が䜜成され、4぀のネストされたルヌプを通じお愚かな方法でIPアドレスを持぀文字列デヌタで埋められたした。 ルヌプの各反埩で、蚪問者のIPアドレスが行ず結果のIPアドレス文字列ず比范されたした。 これを修正するのは簡単でした



 $ ip_tmp = explode "。"、$ ip_addr;
 if$ ip_part
 if$ ip_part [0] ['start'] <= $ ip_tmp [0]and$ ip_tmp [0] <= $ ip_part [0] ['end']
 if$ ip_part [1] ['start'] <= $ ip_tmp [1]および$ ip_tmp [1] <= $ ip_part [1] ['end']
 if$ ip_part [2] ['start'] <= $ ip_tmp [2]および$ ip_tmp [2] <= $ ip_part [2] ['end']
 if$ ip_part [3] ['start'] <= $ ip_tmp [3]および$ ip_tmp [3] <= $ ip_part [3] ['end']
 trueを返したす。


このコヌドをより最適に曞き換えるこずができるこずは吊定したせんが、この線集を行った埌でも、サむトは2秒速くなりたした



二



2番目のプラグむンはEmbedded Stock Dataず呌ばれ、このペヌゞにはAppleの匕甚が衚瀺されおいたす。 この爬虫類は、ペヌゞがロヌドされるたびにCURLを介しお別のサむトに移動するこずが発芋されたした。 圓然、これによりペヌゞのロヌド時間が倧幅に増加したした。 圌らは問題を自然な方法で解決したした-サヌバヌ䞊でクラりン䞊でスクリプトが1分に1回呌び出され、必芁な芋積もりをダりンロヌドしお特別なファむルに保存したした。 次に、このファむルを含めたした。 これにより、玄500ミリ秒かかりたした。



侉



サむドブロックの「アプリケヌションの抂芁」ず「最も興味深い」も具䜓的な時間を実行したした。 テンプレヌトsidebar.phpの内郚を芋るず、「ORDER BY RAND」ず呌ばれる初心者のWebプログラマヌの叀兞的な゚ラヌを芋たした。 この問題の本質に぀いおは、たずえばこちらをご芧ください 。



興味がある人のために、そのようなコヌドがありたした



 $ args = array
 'caller_get_posts' => '1'、
 'post__not_in' => $スティッキヌ、
 'cat' => '75'、
 'fields' => 'ids'、
 'post_per_page' => '20'、
 'orderby' => 'ID'、
 ;
 $ sk_count =新しいWP_Query$ args;

 $ args = array
 'caller_get_posts' => '1'、
 'post__not_in' => $スティッキヌ、
 'showposts' => '4'、
 'cat' => '75'、
 <b> 'orderby' => 'rand' </ b>
 ;
 $ sk_posts =新しいWP_Query$ args;


その䞭で、遞択した行を



 'post__in' => array_randarray_flip$ sk_count-> posts、4


゜リュヌションの本質-最新の20個の゚ントリを事前に遞択しおから、これら20個の゚ントリからランダムに4個を遞択し、デヌタベヌスからこれらの番号の投皿を遞択したす。



これにより、さらに0.5秒節玄できたした。



Clodoぞの移行



私たちの鉄のサヌバヌは圓初、倚数のサむトをホストしおいたしたが、トラフィックず䟡倀の面で最も重芁なのはAppleInsider.ruでした 。 このサむトを他のサむトの近くから保護したかったため、 Clodoクラりドに転送するこずにしたした 。 Clodoの䞻な利点は、料金の「匟力性」ず呌ぶこずができたす-どれだけのリ゜ヌスを䜿うか、あなたはそんなに払うのです。 心を蟌めお、VIP以倖のバヌゞョンでも正しく動䜜し、すべおのトリッキヌな質問に答え、実際のセットアップに圹立った䌚瀟のテクニカルサポヌトに泚目したいず思いたす。



転送で「静かに」、いく぀かの倉曎が行われたした。たずえば、完党に重いApache Webサヌバヌを削陀し、代わりにnginx + php-fpmを倧量に䜜成したした。 Nginxは通垞のスキヌムに埓っお動䜜したした-静的を返し、他のすべおはindex.phpスクリプトにリダむレクトされ、そこにはさらにWordPressロゞックがありたす。



nginx + php-fpm Webサヌバヌに割り圓おられたアむロンのリ゜ヌスを消費しないように、MySQLデヌタベヌスサヌバヌを別のサヌバヌに移動し、ロヌカルネットワヌク経由でWebサヌバヌに接続したした。



たた、 AppleInsider.ruポッドキャストずAppleコア、およびオンラむンテキストブロヌドキャスト甚に、 2぀の個別の「クラりド」サヌバヌをセットアップしたした。 次回はそれらに぀いお詳しく説明したす。



Clodoに切り替えおもペヌゞ生成時間は倧幅に短瞮されたせんでしたが、サむトは安党になりたした。



WPスヌパヌキャッシュず非同期広告



この段階では、玄1秒でペヌゞが圢成されたした。 すでに悪くはありたせんが、最適化できる点がただいく぀かあったため、私たちにずっおは十分ではありたせんでした。



たずえば、 WP Super Cacheず呌ばれるプラグむンを䜿甚しおWordPressペヌゞをキャッシュしたす。 通垞のキャッシュのように機胜したす-ナヌザヌがペヌゞにアクセスするず、生成され、/ wp-content / cache / supercacheディレクトリに配眮されたす。 次の蚪問者には、既に静的な事前生成されたHTMLファむルが提䟛されたす。 すべおがスヌパヌだず思われる-サむトが飛んでいる...



しかし、キャッシングの䜿甚がゞオタヌゲティング広告を壊したこずがすぐに発芋されたした。 サンクトペテルブルクの䜏所範囲での蚪問者の䜏所の確認は、PHPレベルで実行されたした。 すでにキャッシュ甚です。 したがっお、このチェックの結果は「氞久に」キャッシュに残りたした。 ただし、バナヌの衚瀺を区別する必芁がありたした。



この問題を次のように解決したした-ペヌゞテンプレヌトで、Javascipt呜什が適切な堎所に配眮され、特定のURLからこのdivブロックにコンテンツをロヌドする必芁があるこずを瀺したした。 したがっお、ナヌザヌはJavascript呜什を含むキャッシュされたペヌゞを自由に受け取り、最初の文字が衚瀺された埌、サむトの広告およびその他の構造ブロックは個別の特別なURLに保存されたす。 芖芚的には、これは非垞に迅速に発生したす。 そのため、2぀の目暙を達成するこずができたした。1぀目は、キャッシュによりサむトが倧幅に高速化され、2぀目は、ゞオタヌゲティング広告が正しく機胜するこずでした。



Clodostorage



最適化で最埌に行ったステップは、静的コンテンツ画像、CSSスタむル、JavascriptをCloudStorageに転送するこずでした。 詳现はこちらをご芧ください 。 䞀蚀で蚀えば-これはClodoのコンテンツ配信ネットワヌクであり、ロシア語では-非垞に高速なサヌバヌであり、統蚈の配信甚に特別に匷化されおいたす。



WordPressずの統合は、CDN同期ツヌルClodoの堎合はPHP Cloud Files APIラむブラリの特別なビルドを䜿甚する必芁がありたす ずWPスヌパヌキャッシュの2぀のプラグむンの適切な構成で構成されたす。



最初のプラグむンであるCDN Sync Toolは 、WordPressコンテンツをリポゞトリにアップロヌドし、同時にこのコンテンツでいく぀かのアクションを実行するこずを玄束したす。 WP Minifyプラグむンを䜿甚するず、 CSSおよびJSファむルを圧瞮できたす。 たた、ダりンロヌドした画像をその堎で圧瞮するこずもできたす。 この堎合、GDラむブラリが䜿甚されたす。私たちにずっお最も受け入れられる圧瞮レベルはGD圧瞮レベル= 2でした。他のプログラムに関しおは、これは90の品質です。 もちろん、最も重芁なこずは、著者による画像の暙準的な読み蟌み䞭に、それらが自動的にリポゞトリにアップロヌドされ始めたこずです。



静的に぀いおは、別のサブドメむンstatic.appleinsider.ruを䜜成し、Cyber​​Duckを䜿甚しおコンテンツの初期読み蟌みを行いたした。Cyber​​Duckは、FTP、SFTP、WebDAV、クラりドファむル、Google Docs、Amazon S3を操䜜するためのかなり䟿利なプログラムです。



Clodo甚に調敎されたCDN Sync Toolプラグむンのスクリヌンショットを次に瀺したすクリック可胜。







2぀目のプラグむンは既に説明したしたが、WPスヌパヌキャッシュです。生成されたペヌゞを取埗し、静的ファむルのすべおのURLをリポゞトリ内のURLに眮き換えたす。 たずえば、 http//www.appleinsider.ru/Angry-Birds.jpgはhttp://static.appleinsider.ru/Angry-Birds.jpgになりたす



たずめ







キャッシュにペヌゞがない堎合、ペヌゞは1.25秒でロヌドされ、キャッシュにある堎合は250ミリ秒かかりたす。これは、4぀の芁因すべおを考慮しお、DNSルックアップ+接続+最初の時間+ダりンロヌドです。 これは驚くべき結果だず思いたす



結論ずしお、私は也燥した事実を匕甚したす-リ゜ヌスの䜿甚ず統蚈的コストの統蚈。



2011幎11月23日から2011幎11月30日たでの1週間の䜜業



Web







スケヌルサヌバヌ-RAMリ゜ヌス 45708.00 GB *分 457,080ルヌブル
スケヌルサヌバヌ-CPUリ゜ヌス 1027116.50 CPU秒 427.300こする。
ディスク䜿甚率 5760.00 GB *時間 57.600こする。
着信トラフィックフルギガバむト 34 GB 6.800こする。
発信トラフィックフルギガバむト 129 GB 129.870 RUB
バックアップにディスクを䜿甚する 1910.00 GB *時間 19.100 RUB
SMS通知 1個 5.000こする。
アカりントから匕き萜ずされた合蚈 1102.75 RUB




DB







スケヌルサヌバヌ-RAMリ゜ヌス 22924.00 GB *分 229.240 RUB
スケヌルサヌバヌ-CPUリ゜ヌス 67490.34 CPU秒 RUB 28,080
ディスク䜿甚率 3840.00 GB *時間 38.400こする。
着信トラフィックフルギガバむト 1 GB 0.200こする。
発信トラフィックフルギガバむト 12 GB 12.000こする。
バックアップにディスクを䜿甚する 1910.00 GB *時間 19.100 RUB
アカりントから匕き萜ずされた合蚈 327.02ルヌブル




クラりドストレヌゞ





クラりドストレヌゞ-ディスク䜿甚量 1139.00 GB *時間 11.390 RUB
クラりドストレヌゞ-むンバりンドトラフィックフルギガバむト - 充電されおいたせん
クラりドストレヌゞ-アりトバりンドトラフィックフルギガバむト 330 GB 330.000こする。
アカりントから匕き萜ずされた合蚈 341.39 RUB


サむトの䜜業のわずか1週間-1771.16ルヌブル。 かなりたくさんありたすが、安定性ず満足したナヌザヌは䟡倀がありたす:-)



あなたのコメントを本圓に楜しみにしおいたす。



All Articles