Webサイトの速度最適化に関するアドバイス

7319 ワード

先日PHP(TPフレームワーク)のプロジェクトを行い、同時にUcenterとDiscuzフォーラムを統合し、同期登録と登録を実現した.サーバーの配置が低くなった(windows server 2012 1コア2 G 1 M帯域幅phpstudyで構築された環境)が、ここまで遅くなることはなく、ページを開くのに3秒もかかり、フォーラムモジュールにアクセスする速度が速いため、コードの中で様々な原因を探し、必要でないSQLをすべて除去し、GZIP圧縮を有効にし、CSS/JSファイルを圧縮し、CSS/JS/Imageファイルキャッシュを有効にし、いずれも大きな効果はなく、静的ページキャッシュをオンにしてから速度が向上し、静的キャッシュは空間で時間を変える案であるが、公共ページにユーザー登録に関する情報が含まれていれば、設定したキャッシュの有効期間が長すぎると会員情報が混乱する現在、つまり私のアカウントが個人センターに登録されているという弊害もある.他人の情報が出てくる.このスキームは、個人センターのようなページには適していない、いくつかのウェブサイトの文章ページや、あまり変化しないページに適用されます.
常に変化しないページ速度の問題を解決し、次にパーソナルセンターのような一人一人がページ情報が異なるページにアクセスすることを解決し、一部のページでダイナミックキャッシュが有効になった後も最初のアクセス速度は依然として遅く、2回目のページを開くと速度が著しく向上し、キャッシュのないスローフラッシュの下でリンクを開く時間記録を見ることができます.ウェブサイトのリンクに応答するだけで1 S-2 Sの時間がかかり、問題点をデータベースにロックし、すべてのパラメータを調整した後も速度は変わらず、サーバーのローカルアクセスを試みる速度は増加しないので、プロファイルを思いつき、プロファイルはローカルアップロード後にサーバーのユーザー名とパスワードを変更して直接使用した.UcenterおよびDiscuzのプロファイルデータベースリンク部分と比較すると、唯一の違いはucenterとDiscuzで定義されているhostが127.0.0.1、TPサイトで定義されているlocalhostであることであり、その前にいくつかの記事を見たことがあるが、localhostの使用と127.0.0.1の使用は速度的に大きな影響を及ぼすと述べ、サーバのHOSTSファイルを見てみると、localhostが127.0.0.1のローカルループアドレスに指向されていないことが分かったのは、DNS解析の時間がサーバの応答が遅いためだ.これが本当の原因を見つけた.プロファイルのlocalhostを127.0.0.1に変更すると、速度は正常に戻ります.
サイトの最適化の過程で各ルートの大神と公式資料を収集し、ここで少し整理します.
1.Webサイトの応答時間
Webサイトの応答時間は、一般的に、最初のバイトの到着時間を使用して計算されます.
一般的にウェブサイトへのアクセスはHTTP/HTTPSリクエストによって行われるが、HTTPプロトコルは無状態であり、同一クライアントが同一サーバ上のページに2回目にアクセスした場合、サーバはアクセスリンクやプロトコルによって当該クライアントがアクセスしたことがあるかどうかを知ることができず、このような状態を記録しない方式でサーバが大量のHTTPリクエストをサポートすることができるHTTPはTCPプロトコルを用いて2台のコンピュータ間の通信を行うが,TCP接続を確立するには3回の握手が必要であり,TCP接続を閉じるには4回の握手が必要であるため,無状態のHTTP接続としては接続を確立するのにかかる時間が大きい.HTTP1.0非永続的な接続を使用しているため、要求されるたびに新しいリンクを再確立しなければならない.これにより、ページのダウンロードが遅くなり、ネットワークの負担も重くなる.HTTP 1.1 KeepAliveの永続的な接続の使用を開始します.つまり、一定期間接続を維持し、1つの接続で複数回のデータ要求と応答を完了することができます.この場合、サーバ応答が完了した後、直接接続を閉じることはありません.これにより、接続の確立回数が減少し、時間の一部が節約され、帯域幅の消費量が減少します.
httpリクエストを完了するには、DNSドメイン名の解析が必要です.DNSはドメイン名をIPアドレスに解析し、IPアドレスを通じてサーバを見つけてこそ、サーバに応答することができます.高速DNS解析サーバも、Webサイトのアクセス速度に影響を与える重要な要素であり、DNS解析が短いほど、サーバが要求を受信するのが速くなります.
したがって,サイトの応答時間(先頭バイト時間)はDNS解析の時間+TCP 3回握手の時間+HTTP要求の時間+サーバ処理応答時間+応答データ返却時間とほぼ等しい. 
これらの要因の中でDNS解析時間,サーバ処理時間を向上させることができる.
2.DNS解析の最適化
一般的に最適化されたウェブサイトDNS解析の時間は200 MS程度に制御することができ、もし帯域幅が100 Mに達したら50-100 MSで、DNSの最適化にはここで重点を置かず、主にいくつかの方面を通じて制御する:まずTTLを利用して、できるだけユーザーに直接運営者のDNSキャッシュからA記録を得ることができ、次にユーザー量の大きいサービス面積の広いドメイン名解析者を選択する;最後にCNAMEの使用を習得した.
3.サーバ処理時間
ここのサーバーの処理時間は私達が主に最適化する地方で、サーバーの処理が最適化できる地方は主に含みます:サーバーのハードウェアのアップグレード、サーバーのオペレーティングシステムの選択、サーバーの環境のツールの構築、データベースの最適化など
3.1サーバハードウェアのアップグレード
まず、ハードウェアのアップグレードの効果はすぐに現れます.主にCPU、メモリ、帯域幅が含まれています.自分に合った構成を選ぶことが重要です.
3.2サーバオペレーティングシステムの選択
一般的なサーバータイプはwindowsシステムとLinux/Unixシステムがあり、その中でLinux/Unixシステムは一般的にグラフィックインタフェースをインストールしないが、システム自体がリソースに勝つことは少なく、一般的にコマンドラインを通じて管理されている.これは開発者に基本的なshellコマンドについて理解する必要がある.Windowsオペレーティングシステムのデフォルトはグラフィックインタフェースがインストールされており、システムが占有するリソースが大きいと同時に、Linux/Unixより安定性が悪く、ダウンタイムの可能性が高いが、グラフィックインタフェースの管理は比較的容易である.
サーバ・オペレーティング・システムをどのように選択するかは、環境が本当に自分に適しているかどうかを考慮しながら、自分のニーズを満たす必要があります.
3.3サーバ環境の構築
環境の構築と配置も非常に重要で、もしLinuxシステムを使ってLAMPあるいはLNMP甚だしきに至ってはLNAMPの環境を構築することができるならば、windowsシステムを選ぶならばIISあるいはその他にApache/Nginxのサービス環境を構築することができて、nginxの同時性はapacheより良くて、その上資金源を節約して、apacheのrewriteの安定性はnginxより良くて、その上モジュールはわりに多くて、一般に性能が必要であるnginxを選択するにはapacheを安定的に選択する必要がある.(観点は比較的一面的である)
環境構築と同時に、js/cssキャッシュファイルの構成を含む、ウェブサイトのアクセス速度に影響を与えるいくつかの構成情報を考慮し、変更しない情報を長いキャッシュ時間を設定し、ユーザーが二次アクセスするときに再び関連ファイルを要求する必要がなく、新しいデータをロードするだけでよい.GZIP圧縮を構成し、GZIP拡張によりGZIP圧縮を有効にすることでCSS/JS/IMAGEなどの大きなファイルをより小さな体積に圧縮し、帯域幅の占有量を減らし、アクセス速度を向上させることができる.
memcache,Xcache,redisなどのキャッシュを構成します.ThinkphpはS関数を持って動的キャッシュを実現することができ、これらのキャッシュの構成は開発初期にどのようなものを使用するかを考慮して、後期にコードの発動が大きくならないようにしたほうがいい.
3.4データベースの最適化
冒頭で述べたような状況を避けるために、オンライン構成は必ずIPアドレスとして定義しなければならない.
3.4.1できるだけストアド・プロシージャを使用し、ストアド・プロシージャはプリコンパイル文に属し、一回のコンパイルを経た後、再度コンパイルする必要はなく、該当するフィールド値を入力すればよく、SQL文のコンパイルのプロセスを減らす.通常の操作にストレージ・プロシージャを追加すると、SQLの実行時間が大幅に短縮され、実行効率が向上します.
3.4.2検索フィールドにインデックスを作成し、インデックスがある場合、クエリ時間を大幅に短縮
3.4.3できるだけNOT NULLを使用してフィールドを埋め、WHEREを使用してNULL値を判断することを減らす.Mysql公式ドキュメントでは、NULL値が通常値より1 bit多くのストレージ領域を占有していることがわかります.
3.4.4データベース表の大きいフィールドは剥離して、単一の記録のデータ量がとても小さいことを保証して、表を区分して或いは分割することができて、よく変更する情報を一枚の表に保存して、あまり変更しない情報を別の表に保存して、JOIN文の使用を減らす.
3.4.5フィールドの冗長性を減らす.
3.4.6 NoSQLを使用可能
3.4.7グローバルスキャンの削減
3.4.8 or接続条件はなるべく避け、UNION文で代用できる
3.4.9 Inの代わりにexistsを使用する
3.4.10カーソルの使用を避ける
3.5 PHPで注意すべき点
3.5.1一重引用符で文字を含めるのは二重引用符よりも速く、二重引用符でPHPはフィールドの周りの変数を検索します.
3.5.2 forまたはループの代わりにforeachを使用してループ長を計算し、毎回計算しないようにします.
3.5.3アクセスリンクディレクトリの後ろにスラッシュ"/"を付けると、スラッシュを付けないサーバは、まずアクセスするディレクトリかファイルかを判断してから、ディレクトリの下のindexに指向する.phpまたはindex.htmlなどのファイル
3.6先端の注意点
3.6.1ページ要求を減らして、CSS/JSファイルを合併して、できるだけすべてのCSSコードを一つのCSSファイルに入れる.JSも同じで、オンラインになってから関連ファイルを圧縮すべきである.
3.6.2 CSSを頭に置き、JSを尾に置き、スタイルをロードした上でユーザー体験を高める
3.6.3 CDN加速を使用し、JQueryなどの関連書類に対してCDN加速を使用する
3.6.4画像はできるだけheight width属性を使用し、画像のロードが完了した後、インタフェースの二次レンダリングを避ける
3.6.5適切にAJAXを使用する.AJAXが多ければ多いほど良いというわけではない.実際の状況に応じてAJAXを選択する.
添付:apacheオープンGZIP関連構成
http.confファイルで見つかりました
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
前の番号を削除し、confファイルまたは.haccessファイルに次のコードを追加します.

DeflateCompressionLevel 6
SetOutputFilter DEFLATE 
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/x-javascript application/javascript application/json
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary #      gif,jpg,jpeg,png         
SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary #  ,      exe,tgz,gz。。。       
SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary
AddOutputFilterByType DEFLATE text/* #               ,  text/html text/css text/plain 
AddOutputFilterByType DEFLATE application/ms* application/vnd* application/postscript application/javascript application/x-javascript #          application/javascript application/x-javascript      ,       javascript      
AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp #     apache php         
BrowserMatch ^Mozilla/4 gzip-only-text/html # Netscape 4.x      ,          text/html 
BrowserMatch ^Mozilla/4.0[678] no-gzip # Netscape 4.06-4.08       ,       
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html # IE        Netscape ,          

apacheは画像JS/CSSなどのファイルキャッシュを開く
ロードmod_expiresモジュール、confファイルに次のコードが見つかり、前の番号を削除します.
LoadModule deflate_module modules/mod_expires.so
にあります.haccessファイルに次のコードを追加します.

ExpiresActive On
ExpiresDefault A600
ExpiresByType image/x-icon A2592000
ExpiresByType application/x-javascript A2592000
ExpiresByType text/css A604800
ExpiresByType image/gif A2592000
ExpiresByType image/png A2592000
ExpiresByType image/jpeg A2592000
ExpiresByType text/plain A86400
ExpiresByType application/x-shockwave-flash A2592000
ExpiresByType video/x-flv A2592000
ExpiresByType application/pdf A2592000
ExpiresByType text/html A600

memcachedについては、Install,configure,verify memcached on CentOSへのリンクを提供します.