スケヌラブルで高性胜なWebアプリケヌション。 Ch。 1. HTTPプロトコル。 䞋曞き

説明されおいるトピックHTTPリク゚スト。 HTTP応答 HTTPキヌプアラむブによる最適化。 HTTPパむプラむンを䜿甚した最適化。 HTTPキャッシングを䜿甚した最適化最新のクラむアントでのキャッシング、再怜蚌戊略、キャッシングずむンタラクティブペヌゞの無効化。 圧瞮を䜿甚した最適化。 配信されたコンテンツの特定の最適化。 コンテンツを結合したす。



コメントを歓迎したす。







<div class = "chapter" lang = "ru" xmllang = "ru">

第1章HTTP

コンテンツ HTTP芁求 HTTP応答 HTTPキヌプアラむブ を䜿甚した最適化HTTPパむプラむン を䜿甚した最適化HTTPキャッシングを䜿甚した最適化 最新のクラむアントでの キャッシング 再怜蚌戊略 キャッシングずむンタラクティブペヌゞの無効 化圧瞮を䜿甚した 最適化特定の最適化

コンテンツコンテンツの 組み合わせクラむアントブラりザたたはロボットはWebサヌバヌず通信したす

HTTPプロトコルを䜿甚しおいたす。 HTTPずその動䜜の现かな詳现

技術の䞋䜍局ず䞊䜍局ずの盞互䜜甚-の1぀

高性胜の鍵HTTPはHyper Text Transport Protocolの略です。

もちろん、サヌバヌからクラむアントぞの転送だけでなく䜿甚されたす

HTMLファむルだけでなく、その他のオブゞェクト画像、スクリプト、

CSSファむル、デヌタファむル。 たた、逆に動䜜したす

サむド-ファむルをサヌバヌにアップロヌドし、フォヌムを送信し、

など。AJAXアプリケヌションも、明らかにサヌバヌず通信したす。

HTTP HTTPがより具䜓的な目的で䜿甚されるこずもありたすが、

たずえば、WebDAVを䜿甚しおサヌバヌコンテンツを管理し、

など。HTTP通信は、䞀連の断続的な

クラむアントずサヌバヌ間のHTTPリク゚ストずHTTPレスポンス<Div class = "sect1" lang = "ru" xmllang = "ru">

HTTPリク゚スト

HTTP芁求は、芁求文字列、ヘッダヌ、および

メッセヌゞ本文。 ファむルを取埗するHTTPリク゚ストの䟋を次に瀺したす

www.habrahabr.ru/robots.txt 
  GET /robots.txt HTTP / 1.1
ホストwww.habrahabr.ru
ナヌザヌ゚ヌゞェントWget 1.8.3


最新のりェブ䞊のHTTPリク゚ストの倧郚分は

これらは、リク゚ストボディが空長さ0のGETリク゚ストです。

この堎合は芳察しおください。 たずえば、POSTリク゚ストの堎合、本文

ほずんど垞に空ではありたせん。リク゚ストの䟋を詳しく調べおみたしょう。 リク゚ストの最初の単語は

GET



これはいわゆる「方法」です

HTTPリク゚スト。 最も䞀般的な方法は

GET



GET



メ゜ッドは、単玔に

指定された堎所で利甚可胜なリク゚ストコンテンツペヌゞたたはファむル

URL。 重芁な考慮事項は、GET芁求ができるこずです

キャッシュされた別の䞀般的なリク゚ストはPOST



です。

POSTリク゚ストには、ほずんどの堎合、゚ンコヌドされたリク゚スト本文が含たれたす

特別な圢匏のいずれかで。 通垞、POSTリク゚ストは

ナヌザヌが[送信]ボタンたたは同様のボタンをクリックした結果ずしお

アクションHEAD



メ゜ッドGETメ゜ッドネむバヌも䜿甚されたす。

PUT



ようなよりたれなメ゜ッドのホスト



DELETE



ず同様に、特定のメ゜ッドの倧芏暡なセット

WebDAVプロトコル。 これらの詳现に぀いおは、他の章を/robots.txt



ください。ク゚リの2番目の単語 /robots.txt





これは、受信したいペヌゞたたはファむルのURLで、リク゚ストの3番目の単語はHTTP/1.1



です。 それは

プロトコルの実際の名前ずバヌゞョン番号。 HTTP 1.1

ほずんど普遍的に䜿甚されたすが、䞀郚の人にずっおは十分です

特定の目暙がHTTPに栌䞋げされるず䟿利な堎合がありたす

1.0。 HTTP 1.1ずHTTP 1.0の䞻な違いは必須です

仮想ホストのサポヌト、キャッシュのサポヌトの改善、

HTTPキヌプアラむブの必須サポヌト、およびいく぀かの重芁な

ク゚リ文字列は、CR-LF\ r \ nの文字の組み合わせで終わりたす。

さらに、互いに分離されたリク゚ストヘッダヌもありたす

CR-LFの組み合わせ。 唯䞀の必須HTTP 1.1

ヘッダヌは、ドメむン名を含むHost



です

どのペヌゞたたはファむルがあるか。 HTTP暙準は

倚くの異なるリク゚ストヘッダヌ、その倚くは再生

高いパフォヌマンスを確保するための重芁な圹割。 で

䟋には、別のヘッダヌUser-Agent



が含たれおいたす。

クラむアント識別子行。ヘッダヌのリストは、文字の別の組み合わせで終わりたす

CR-LF぀たり、空の文字列。 芋出しの埌に䜓が来る

リク゚スト。 この䟋では、リク゚ストの本文は空です長されロ<Div class = "sect1" lang = "ru" xmllang = "ru">

HTTP応答

HTTP芁求をサヌバヌに送信するこずにより、クラむアントは応答を期埅したす。 HTTP応答

䞀般的にク゚リに䌌おいたすステヌタスバヌ、リスト

ヘッダヌず応答本文。
  HTTP / 1.1 200 OK
サヌバヌnginx / 0.5.35
日付2008幎4月22日火曜日10:18:08 GMT
コンテンツタむプテキスト/プレヌン; 文字セット= Windows-1251
接続閉じる
最終倉曎日金、2007幎11月30日12:46:53 GMT
 ETag "27e74f-43-4750063d"
 Accept-Rangesバむト
コンテンツの長さ34

ナヌザヌ゚ヌゞェント*
䞍蚱可/人

応答の最初の単語はHTTP/1.1



バヌゞョンです

プロトコル。 2番目の単語は200



です。 これが最も䞀般的です

芁求されたファむルたたはペヌゞが怜出されたこずを瀺す応答コヌド

顧客に䞎えられた。 倚くの異なる応答コヌドがあり、

高い倀を確保する䞊で重芁な圹割を果たす

パフォヌマンス。 行の残りは

人間が読めるレスポンスコヌドの説明この堎合-

OK



。ステヌタス行の埌、次を含むヘッダヌのリスト

远加の、時には非垞に重芁なファむル情報たたは

ペヌゞ。 この堎合、コンテンツのMIMEタむプが重芁です。

ファむルの最終倉曎日 Last-Modified



、その

長さ Content-Length



およびETag



これ

キャッシングに䜿甚される特別なトヌクン。 答えにも

サヌバヌ情報 Server



ず



Date



and Connection



。ヘッダヌのリストの埌に、別の空の行が衚瀺され、

最埌に、応答の実際の内容この堎合、これらは2぀です

テキスト行。HTTPはシンプルで柔軟であるず結論付けるこずができたす。

テキスト構文プロトコル。 耇数の正確な䜿甚

リク゚ストおよびレスポンスヘッダヌにより、

高性胜Webシステムの領域。 詳现分析

関連するテクノロゞヌに぀いおは、次の章で説明したす。<div class = "sect1" lang = "ru" xmllang = "ru">

HTTPキヌプアラむブによる最適化

HTTPはTCP送信

制埡プロトコル。 TCPは信頌できるプロトコルです

双方向デヌタストリヌム送信。 TCPはパケットを転送するこずで機胜したす

クラむアントからサヌバヌぞ、たたはその逆のデヌタ。 TCPパケットはヘッダヌで構成されたす

およびデヌタ。 ヘッダヌには、クラむアントIPアドレスず

サヌバヌ、クラむアントずサヌバヌで䜿甚されるTCPポヌト番号、およびダむダル

フラグ。 サヌバヌは通垞、暙準のTCPポヌトを䜿甚したす

80番。クラむアントずサヌバヌ間のTCP接続は次の方法で確立されたす。

埓来のTCP 3りェむハンドシェむクを䜿甚したす。 お客様第䞀

SYNフラグ付きのパケットをサヌバヌに送信したす。 応答ずしお、サヌバヌはパケットを送信したす

SYN + ACKフラグ。 最埌に、クラむアントはフラグ付きで別のパケットを送信したす

ACKおよび接続は確立されたず芋なされ、クラむアントは

デヌタこの堎合はHTTPリク゚ストを送信したす。プロトコル盞互䜜甚のこの郚分では、

サヌバヌからの応答パケットを1回埅぀

HTTPリク゚ストを送信したす。 ぀たり、TCP接続を確立する操䜜

比范的高䟡で、䞀郚のチャネルでは

遅延ず非垞に高䟡です。 蚀い換えれば、

HTTP接続1.1では、この最適化はデフォルトで有効になっおいたす。 䞀回

サヌバヌに接続するず、クラむアントはサヌバヌずリク゚ストを亀換し、

接続を切断せずに答えたす。 これはHTTPず呌ばれたす。

キヌプアラむブ数䞇のブラりザヌがサヌバヌず共にむンストヌルされおいる堎合

キヌプアラむブ接続を行うず、すぐにリ゜ヌスを䜿い果たしたす。

したがっお、すべおのサヌバヌには、蚭定可胜なタむムアりトがありたす。

キヌプアラむブ接続が切断されおいない堎合は切断されたす

アクティビティなし。クラむアントは、応答埌に接続切断を芁求し、

芁求ヘッダヌConnection: close



同様に

サヌバヌは、キヌプアラむブをサポヌトしないこずを応答で瀺す堎合がありたす

たったく同じヘッダヌを枡すこずによる接続

Connection: close



。 䞀般的に、これらのすべお

盞互通知の取り消し、厳密に蚀えば、課さない

矩務なし。 サヌバヌずクラむアントの䞡方を完党に準備する必芁がありたす

接続がむニシアチブでい぀でも䞭断されるずいう事実に

䞀方、通知はありたせん。キヌプアラむブ接続の敎合性を維持するために、

サヌバヌは応答の長さを知っおいる必芁がありたす。 最も簡単な方法は

Content-Length



ヘッダヌで指定したす。 長さが

ハンドラヌによっお応答が瀺されない堎合、サヌバヌは送信前に匷制されたす

応答セットヘッダヌConnection: close





応答を送信した埌、その郚分で接続を閉じたす。 Webアプリケヌションが正しく公開されおいるこずを確認しおください

Content-Length



ヘッダヌ、それ以倖の堎合はキヌプアラむブ接続

答えのサむズを䜜成段階で刀断するのが難しい堎合がありたす。 で

この堎合、キヌプアラむブ接続を犠牲にするか、たたは

特別なチャンク化された応答゚ンコヌディングを䜿甚したすそれは

Transfer-Encoding: chunked



ヘッダヌを䜿甚。

詳现はHTTP暙準に蚘茉されおいたす<Div class = "sect2" lang = "ru" xmllang = "ru">

HTTPパむプラむン化による最適化

1぀の䞭で䞀連の芁求ず応答を行うずき

キヌプアラむブ接続、時間はパフォヌマンスに重芁な圹割を果たしたす

芁求ず応答の間の遅延。 遅延は

高いチャネル遅延ず長時間の䞡方が原因

サヌバヌでリク゚ストを凊理したす。 別のリク゚ストを送信する前に、

次の凊理が完了するたで埅぀必芁がありたす。 察凊する

この問題は、技術を䜿甚するこずができたす

HTTPパむプラむン凊理HTTPパむプラむン凊理の意味は、単にクラむアントが

いく぀かのリク゚ストを連続しお送信し、埐々に開始したす

入っおくる回答をすくい䞊げたす。 䞀般的なサヌバヌサポヌト

良いが、残念ながら、珟圚サポヌトしおいるクラむアント

HTTPパむプラむン、垂堎のごく䞀郚を占める<Div class = "sect1" lang = "ru" xmllang = "ru">

HTTPキャッシングによる最適化

オヌバヌHTTPキャッシングは長幎にわたっお蓄積されおきたした

神話ず偏芋。 第13ç« RFC2616HTTPでのキャッシュ

かなり玛らわしい。 これの䞻な理由は、著者が

すべおの人に䞀床にすべおを説明しようずしたサヌバヌ開発者、および

クラむアント開発者、およびキャッシュプロキシ開発者。 を陀く

さらに、混乱は時代遅れの議論を远加したす

HTTP 1.0クラむアント、サヌバヌ、プロキシによる。この章では、ストヌリヌ党䜓を正確に䌝えるこずを詊みたす。

珟代の開発者の芖点すなわち、サポヌト

HTTP 1.1サヌバヌ。 最初に、最も単玔な状況に぀いお説明したす。

最新のクラむアントで動䜜したす途䞭でプロキシをキャッシュしたせん。

その埌-1぀たたは

いく぀かの最新のキャッシュプロキシ。 最埌に、

さらに、どの廃止されたヘッダヌを応答に远加する必芁があるか、

叀い顧客や時代遅れの顧客から受け入れられる結果を達成するため

道路沿いのプロキシただし、これら2぀の皮の存圚は

動物を蚌明するのは非垞に難しいです。<div class = "sect2" lang = "ru" xmllang = "ru">

珟代のクラむアントでのキャッシュ

䞀般に、キャッシュプロセスは2぀の郚分で構成されたす。

コンテンツの有効期限ず再怜蚌手順。コンテンツの有効期限を切れるには、

Cache-Control: max-age=300



応答ヘッダヌCache-Control: max-age=300



ここに



300



は、コンテンツの有効期限秒単䜍です。

぀たり、5分。 これは、5分以内にクラむアントが

たったくリク゚ストせずに、受信したオブゞェクトを自由に䜿甚できたす

re-server。オブゞェクトが有効期限埌に必芁な堎合、

再怜蚌する必芁がありたす。 再怜蚌は単玔に

同じオブゞェクトを再芁求したすが、远加で

芋出し。 再怜蚌により、いずれかの再送信が発生する堎合がありたす

オブゞェクト、たたは特別な応答コヌドを送信する

304 Not Modified



。 明らかに、2番目のオプション

望たしい。 再怜蚌には䞻に3぀の方法がありたす。



再怜蚌が最埌の時間に機胜するために

倉曎、応答ヘッダヌの間に特別なヘッダヌがあるはずです

圓然のこずながら、最埌の時刻を含むLast-Modified





オブゞェクトの倉曎。 再怜蚌䞭に、この倀はクラむアントによっお送信されたす

特別なリク゚ストヘッダヌ If-Modified-Since





芁求ハンドラは、オブゞェクトが倉曎されたかどうか、および

no-空のボディず応答コヌドで応答を返したす



304 Not Modified



。 コンテンツ自䜓は

送信され、クラむアントはコンテンツを䜿甚したす

キャッシュに保存されたす。最埌の倉曎時たでに再怜蚌を䜿甚する方が簡単です

静的ファむル、およびデフォルトですべおのサヌバヌの合蚈

この機胜を含めたす。 動的に生成されたペヌゞの堎合

適切なリク゚スト凊理アヌキテクチャを遞択するこず、そしお䞀般的には

そのような再怜蚌の可胜性ず䟿宜が議論されおいたす

オブゞェクト識別子による再怜蚌が機胜するためには、

応答ヘッダヌには特別な芋出しが必芁です

ETag



。 指定されおいないものを返したす

オブゞェクトバヌゞョン識別子䟋Apache静的ファむル甚

デフォルトでは、ファむルが最埌に倉曎された日付の組み合わせを䜿甚し、

ファむルシステムのサむズずiノヌド番号。 再怜蚌時

クラむアントはリク゚ストで特別なヘッダヌを送信したす

同じ識別子を含むIf-None-Match



。

サヌバヌは、バヌゞョン識別子の珟圚の倀を比范したす。

䞀臎し、空の本文ず応答コヌドを含む応答を返したす

304 Not Modified



最埌の倉曎の時刻の再怜蚌ず同様に、

この再怜蚌は、静的ファむルに䜿甚するのが最も簡単です。 のために

動的に生成されたペヌゞの堎合正しい遞択の問題

コンテンツアヌキテクチャに぀いおは以䞋で説明したす。 䞡方の再怜蚌メ゜ッドは

神話䞊のブラりザやプロキシずの互換性のため、

HTTP 1.1をサポヌトするため、応答にはヘッダヌを含める必芁がありたす

Expires



。廃止の必芁なポむントを瀺したす

ファむルたたはペヌゞ。 このヘッダヌの倀の圢匏は次のずおりです。

Tue, 15 Nov 1994 08:12:31 GMT



<div class = "sect2" lang = "ru" xmllang = "ru">

再怜蚌戊略

既に述べたように、キャッシングは最も簡単で最も理解しやすいものです

デザむン写真、javascriptファむルなどの静的ファむル、

CSSファむル。 静的ファむルの堎合、生成が非垞に簡単で、

䞡方の条件の意味を確認したす Last-Modified



ず

およびETag



。おそらく静的の堎合にETag



難しい質問

ファむル-適切な有効期限を遞択したす。 開発者

Yahoo.comは単玔な戊略を掚奚したす。a静的に公開する

1幎のファむルの有効期限読み取り「氞久」およびb

プロゞェクトの新しいバヌゞョンを投皿するずきにURLを倉曎するシステムを導入する

実皌働サヌバヌ䞊。たずえば、Ruby on Railsでは、URLが

CSSファむルは次のようになりたす。



/stylesheets/main.css?31415



ここで

31415



は、システム内の最新リビゞョンの番号です

バヌゞョン管理。 同様のメカニズムを簡単に実装できるはずです

他の保守的な戊略は、キャッシュするこずです

箄30分、短時間の静的ファむル。 だから

したがっお、䞀般的なナヌザヌセッションを高速化したす。 圌はい぀来たすか

次回サむトぞ、初めおそれが起こったずき

すべおの統蚈の䞀括再怜蚌。 この戊略は必芁ありたせん

量産コヌド陀去システム原則ずしおこれを倉曎する

この戊略の欠点ず芋なすこずができたす-倚くの堎合

そのようなシステムがたったく存圚しないこずを意味するかもしれたせん。䞀般的に、いく぀かの倧幅な増加を達成するために、

パフォヌマンスを向䞊させるには、条件を適切に組み合わせる必芁がありたす。

たず、ペヌゞに぀いおは、比范的簡単に蚈算できるはずです

バリデヌタヌ最終倉曎時刻たたはETag。 第二に

ペヌゞの情報デザむンにより、クラむアントは十分な負荷をかけるこずができたす

時代遅れのコピヌ。 経隓から、非垞にたれなペヌゞクラス

枬定可胜な効果は蚀うたでもなく、この組み合わせを提䟛する

再怜蚌の導入から。 珟代の可胜性がありたす

むンタラクティブなプロゞェクトは䞀般にそれに぀いお考えるのは意味がありたせん

方向、および非垞に高速な生成に集䞭

これらの同じペヌゞ。ただし、䞊蚘の静的キャッシュは

ファむルは、各特定のナヌザヌ゚クスペリ゚ンスで重芁な圹割を果たしたす

ナヌザヌ、およびそのようなキャッシュに泚意を払う必芁がありたす良い

これは難しいこずではありたせん。この問題のもう1぀の偎面は、怜玢゚ンゞン

システムは、おおよそ正しい時間を蚭定するこずを匷くお勧めしたす

すべおのペヌゞでLast-Modified



、

怜玢ロボットにフィヌドしたす。 可胜性がありたす

このトピックの゚ンゞンを修正するプロセスは、

戊略自䜓を実装するこずも困難です

キャッシング<div class = "sect2" lang = "ru" xmllang = "ru">

キャッシュずむンタラクティブペヌゞを無効にする

倚くの堎合、逆問題も解決する必芁がありたす。

サむトの特定のペヌゞがそれぞれサむトからリロヌドされるように

ナヌザヌが蚪問する時間。 ありたす

HTTPのキャッシングに関連する䞀般的な神話から。 圌は瞛られおいる

3぀の魔法の魔法の呪文の儀匏の繰り返しで

ヘッダヌ



キャッシュ制埡キャッシュなし
プラグマno-cache
有効期限今
゚ラヌの詳现な分析に぀いおは説明したせんが、

これら3行で収集されたす。 最初の行は

この目的を完党に意図したものではなく、2行目は決しお

意味がありたせんでした、そしお3番目は壊滅的に時代遅れですそれはしたすが

タスク。正しい珟代的な方法は

Cache-Control: max-age=0



ヘッダヌCache-Control: max-age=0



。 圌は意味する

ペヌゞのコンテンツが受信埌すぐに期限切れになるこず、および

ブラりザはそれを再怜蚌する必芁がありたす。 リク゚ストを受信するサヌバヌ

再怜蚌、単にナヌザヌに新しいバヌゞョンを返す

ペヌゞ。ブラりザの神話䞊の叀いバヌゞョンずの互換性および

HTTP 1.1をサポヌトしないプロキシ、応答も

ヘッダヌExpires: now



远加しExpires: now



。 圌は同じです

Cache-Control: max-age=0



ような意味です。<div class = "sect1" lang = "ru" xmllang = "ru">

圧瞮の最適化

トラフィックを倧幅に削枛し、応答を高速化する玠晎らしい方法

サヌバヌは、指定されたファむルずペヌゞの圧瞮です。 ほが

最新のすべおのWebサヌバヌが䜕らかの圢でこれをサポヌト

機胜。 圧瞮率は

特定の各ペヌゞで、10のオヌダヌの倀に到達できたす。

Webアプリケヌション開発者の圧瞮は完党に透過的であり、必芁ありたせん

圧瞮されたコンテンツクラむアントを受け入れる機胜

ヘッダヌを䜿甚しおサヌバヌに通知したす



Accept-Encoding: gzip



。 サヌバヌが

関連コンテンツの圧瞮、それからタむトルを远加できたす

Content-Encoding: gzip



応答混同しないでください

Transfer-Encoding



および圧瞮されたクラむアントに送信

コンテンツ。歎史的に異なるブラりザには倚くの異なる゚ラヌがありたした

圧瞮コンテンツの凊理。 珟圚2008幎半ば、

゚ラヌのある実際に䜿甚された顧客の割合が䜎䞋したようです

無芖できる。 通垞、サヌバヌのドキュメントでは、

コンテンツのタむプずブラりザの組み合わせのおよそのセット

叀いクラむアントの゚ラヌを回避するための掚奚事項ず同様に機胜したす。

<div class = "sect2" lang = "ru" xmllang = "ru">

特定の最適化

内容

簡単に蚀えば、これは䜙分なスペヌスず改行を削陀したす

HTMLファむルずCSSファむルから、JavaScriptの瞮小、および

画像ファむルサむズの最適化。 サむズぞの圱響に加えお

送信デヌタ、この最適化も増加する可胜性がありたす

クラむアント偎のパフォヌマンスブラりザのパフォヌマンスは䜎䞋したす

凊理されたペヌゞのペヌゞ゜ヌスおよびDOMノヌドの解析および占有メモリの削枛

。JavaScriptのミニファむは、

難読化コヌドの意味を暗くするず同時に実行するこずもできたす。これは

、知的財産保護ポリシヌの芳点からある皋床の意味を持぀堎合がありたす。

prototype.jsなどの汎甚ラむブラリには、

瞮小化の組み蟌みサポヌトず、

プロゞェクトで䜿甚されおいないコンポヌネントのサブセットを削陀する機胜が含たれおいたす<Div class = "sect2" lang = "ru" xmllang = "ru">

コンテンツの組み合わせ

HTTPリク゚ストの数を枛らすために、

耇数のファむルを1぀にたずめるこずができたす。倚くの堎合、

結合に加えお、結果のファむルを瞮小するこずもできたすCSSファむルは単玔に1぀に連結できたす。JavaScriptファむルに

はこの点に泚意が必芁ですが、䞀般的に

、JavaScriptが連結されない堎合

、JSコヌドのアヌキテクチャに問題があるず想定できたす。アむコン、ナビゲヌショングラフィックなどは、

t n CSSスプリット

このテヌマに関する倚数のガむドをオンラむンで参照しおください。



All Articles