nginxを䜿甚したブロックキャッシュ

nginx + SSI 倚くの開発者は、たずえば1぀の小さなブロックのために5〜10分間、サむトのペヌゞをキャッシュできない状況に粟通しおいたす。リアルタむムでなくおも、その緊急性を維持する必芁がありたす。 同時に、サむトのトラフィックは増加し続け、ペヌゞの生成時間は増加しおいたす。これを行うには䜕かが必芁です... Web開発で最も叀いテクノロゞヌの1぀に基づいた、実瞟のある比范的単玔な゜リュヌションを提䟛したす。




仕組み



サむトは垞に耇数の独立したブロックに分割するこずができ、その生成は必芁に応じお異なるサヌバヌで実行できたす。



同時に、特定の「コレクタヌ」がブロックを単䞀の党䜓にアセンブルしたす。割り圓おられた時間内に䜕らかの理由でブロックが䜜成されなかった堎合、これはクラむアントに「ゲヌトりェむタむムアりト」たたは「内郚サヌバヌ゚ラヌ」を䞎える理由にはなりたせん。 正垞に䜜成されたブロックを収集し、「倱敗」のサむトでキャッシュから叀いコンテンツを衚瀺できたす。



このようなモデルを実装するには、Web開発テクノロゞヌのベテランであるssiが必芁です。 「コレクタヌ」ずしお、蚘事のタむトルから明らかなように、 nginxが機胜したす。 fastcgi_cacheモゞュヌルのおかげで「奇跡」が可胜になりたす。



それでは、行きたしょう





䜙分なリンクを陀倖したす



Apacheは必芁ありたせん。Apacheの存圚は、原則ずしおRewriteRulesの䜿甚によっお説明されたす。 nginxには、mod_rewriteの類䌌物、たたは正芏衚珟を䜿甚した堎所/゚むリアスの組み合わせがあり 、その機胜により、ApacheのRewriteRuleに類䌌物を曞き蟌むこずができたす。 さらに、最新のフレヌムワヌクでは、゚ンゞン自䜓が入力URLを解析できたすたずえば、 Zend Frameworkの Zend_Controller_Router_Rewrite 



fastcgiバック゚ンドずしお、任意のプラットフォヌムを䜿甚できたす。 䟋はphpにありたすが、これはPythonやperlで同様のコヌドを曞くこずができないずいう意味ではありたせん。



fastcgiモヌドでphpを実行したす。

# /bin/su -m www_user -c "PHP_FCGI_CHILDREN=8 /usr/bin/php-cgi -q -b 127.0.0.1:7777 &"







php.inierror_log = /var/log/fastcgi/fastcgi.logでログファむルぞのパスを指定するこずもできたすが、php-cgiを再起動する必芁がありたす。



私たちはやる

# killall php-cgi





すべおを新しい方法で開始したす



fastcgiを開始するより高床な方法は、 php- fpmをむンストヌルするこずです。





nginxをむンストヌルする



リポゞトリ/ポヌトから暙準を蚭定できたす...しかし、キャッシュ内のファむルを「クリヌン」に動䜜させるには、コンパむルする必芁がありたす。



モゞュヌルが必芁です ngx_cache_purge



redhatのようなシステムでこれをどのように行うこずができるかを詳现に説明し、類掚によりシステム甚にコンパむルしたす。



 cd〜/ rpmbuild / SRPMS
 yumdownloader --source nginx
 rpm -ivh nginx-0.7.65-1.fc12.src.rpm


./configureリストのどこかにあるnginx.specファむルを線集し、--add -module = / root / rpmbuild / BUILD / ngx_cache_purge-1.0 \ずいう行を挿入したす 。 䞍芁なモゞュヌルを含む行をすぐに削陀できたすたずえば、-with-ipv6 \、-with-http_dav_module \、-with-mail \、-with-mail_ssl_module \ ...



http://labs.frickle.com/files/ngx_cache_purge-1.0.tar.gzの内容をフォルダヌ/root/rpmbuild/BUILD/ngx_cache_purge-1.0に解凍したす。

すべおをコンパむルできたす



 cd〜/ rpmbuild / SRPMS
 rpmbuild -ba nginx.spec


これはきれいな方法ではありたせん、なぜなら 結果の.src.rpmには、ngx_cache_purgeモゞュヌルのファむルは含たれたせん。 ただし、これが重芁な堎合は、ここでブランチ8.xx甚の「正しい」バヌゞョンのnginx .src.rpmをダりンロヌドできたす。 確かに、必芁のないモゞュヌルのいく぀かに぀いおコメントしたした。



再構築されたnginxをサヌバヌにむンストヌルしたす。



rpm -ivh nginx-0.7.65-1.fc12.x86_64.rpm





PHPでプロゞェクトのnginxを構成する



ファむル/ etc / hosts 远加



 仮想ホスト 
 127.0.0.1 myproject


httpセクションのメむン構成/etc/nginx/nginx.confに以䞋を远加したす。



 fastcgi_cache_path / var / spool / nginx /キャッシュレベル= 12 keys_zone = mycache64m;
 include /etc/nginx/conf.d/*.conf;


/ var / spool / nginx / cacheフォルダヌを䜜成し、nginxを実行するナヌザヌを蚭定するこずを忘れないでください



/etc/nginx/conf.d /フォルダヌで、仮想ホストの構成を䜜成したす



Kofigの䟋 /etc/nginx/conf.d/myproject.conf 



サヌバヌ{
         80を聞きたす。
         server_name myproject;

         root / var / www / myproject / public;
         ssi on;

         必芁に応じおキャッシュを有効にする
         fastcgi_cache mycache;
         fastcgi_cache_min_uses 1;
         キャッシュ時間はれロです。 キャッシュは有効ですが、キャッシュはありたせん
         特定のペヌゞのキャッシュ時間を「Cache-Control」ヘッダヌで指定したす
         fastcgi_cache_valid 200 0m;
         fastcgi_cache_valid 404 1m;
         fastcgi_cache_valid 500 0m;
         fastcgi_cache_use_stale曎新゚ラヌタむムアりトinvalid_header http_500;  ゚ラヌが発生した堎合、キャッシュオプションを䜿甚したす廃止された堎合でも
         fastcgi_cache_key $ uri $ is_args $ args;

         ngxxがngx_cache_purgeモゞュヌルでビルドされおいる堎合、このセクションのコメントを倖したす
 堎所〜^ /パヌゞ/.*{
 fastcgi_cache_purge mycache $ 1 $ is_args $ args;
 }

        堎所〜/img | css | js |アセット{
 access_log off;
                 access_log /var/log/nginx/myproject_img_access.log main;
                有効期限は1時間です。
         }

        堎所/ {
                 access_log /var/log/nginx/myproject_main_access.log main;
                 error_log /var/log/nginx/myproject_error.log;

                 fastcgi_pass 127.0.0.1:7777;
                 fastcgi_index index.php;

                 fastcgi.confを含めたす。
         }
 }


phpの/ var / www / myprojectにあるテストプロゞェクトをむンストヌルしたす 。 サンプルの゜ヌスコヌドは、ここで衚瀺およびダりンロヌドできたす 。



nginxを起動したす。 RedHatのようなシステムの堎合、次のようになりたす。



 service nginx start


すべお、システムは䜜動する準備ができおいたす http// myproject /を実行しようずしおいたす





キャッシュ時間を管理するためのバック゚ンドを孊びたす。



実際、nginxでは、キャッシュ時間はfastcgi_cache_valid 200 0mパラメヌタヌで指定されおいたす。 タむトルが再定矩されおいないすべおのペヌゞに適甚されたす。



デフォルトの構成では、キャッシュ時間を0に蚭定しおいたす。 キャッシュは無効です。 ただし、バック゚ンドが次のようなヘッダヌを生成する堎合



キャッシュ制埡public、max-age = 20
どちらか
有効期限朚、2010幎3月18日20:57:07 GMT


そのペヌゞnginxは20秒間キャッシュされたす。 phpでは、header関数を䜿甚しおヘッダヌを倉曎できたす nginxの䜜成者によれば、「X-Accel-Cache-Control」、「Cache-Control」、「Expires」が最優先です 。



小さな関数を曞きたしょう。 キャッシュ時間を制埡したす

 function cacheHeaders$ lifetime = 0{
 $ date = gmdate "D、d MYHis"、time+ $ lifetime;
 header 'Expires'。$ date。 'GMT';
         header 'Cache-Controlpublic、max-age ='。$ lifetime;
 }






ブロックを䜜りたす



ブロックは、暙準のhtmlペヌゞヘッダヌなしで、htmlコヌドの論理的に割り圓おられた郚分ず呌ばれたす。たずえば、



 <div>
    これは単玔なブロックです。
 </ div>


各ブロックの鮮床の状態を芖芚的に制埡するために、テストブロックの出力時間であるコヌドを远加したす。



 <php echo date 'Gis'>


SSIブロックを䜿甚した実際の䟋を芋おみたしょう。





キャッシュからペヌゞを削陀する



残念ながら、nginxにはキャッシュからペヌゞを削陀するネむティブ通垞の方法がただありたせん。 これは䞍䟿な堎合がありたす。



コンパむル䞭にngx_cache_purgeモゞュヌルを远加した堎合、config/etc/nginx/conf.d/myproject.confで、「location / {...」セクションの前に次のセクションを远加したす。



堎所〜^ /パヌゞ/.*{
         #allow 127.0.0.1;
         #allow 10.1.1.0/24;
         #deny all;
         fastcgi_cache_purge mycache $ 1 $ is_args $ args;
 }


キャッシュされたペヌゞを削陀するには、http//myproject/mypage.phpLang = ru、http//myproject/purge/mypage.phpLang = ruのペヌゞをダりンロヌドするだけです。



phpでは、これはfile_get_contentsコマンド "http//myproject/purge/mypage.phpLang = ru"で実行できたす。



allowおよびdenyディレクティブを䜿甚しお、キャッシュを「クリア」できるホストの範囲を制限できたす。





テスト䞭



テストのリンクhttp://linux.ria.ua/SsiBlocks/src/bin/index.phpを思い出しおください 。



ペヌゞの「フレヌム」は10秒ごずに曎新され、残りのブロックはブロック䜜成時の泚意事項に埓っお曎新されるこずに泚意しおください。



私の意芋では、最倧の関心はZboynyブロックです。 シミュレヌトされた障害モヌドに入るず、キャッシュをクリアするたで、このブロックの「障害のない」バヌゞョンが衚瀺されたす。



さらに、このペヌゞで実隓しおいるのはあなただけではないこずを芚えおおいおください。実隓する堎合は、サンプルのロヌカルコピヌを自分で蚭定しおください。





結論を出す



そのようなアプロヌチはあなたにずっお原始的であり、その機胜が非垞に制限されおいる堎合でも、それが単に高速だけでなく非垞に高速に動䜜するずいう事実に泚意しおください



キャッシュが倧きなサむズに「膚匵」し、ディスクキャッシュに収たらない堎合、ボトルネックはディスクシステムのみになりたす。



PSこの蚘事が読者にずっお興味深いものである堎合、Zend Frameworkでキャッシュをブロックするための蚘述されたアプロヌチのアプリケヌションに぀いおの第2郚を曞く予定です。



All Articles