1. 従来のキャッシュの 1 つ (404)
この方法では、nginx の 404 エラーをバックエンドに送信し、proxy_store を使用してバックエンドから返されたページを保存します。
構成:
位置/{
ルート /home/html/;#ホーム ディレクトリ
Expires 1d;#Web ページの有効期限
error_page 404 =200 /fetch$request_uri;#404 /fetch ディレクトリに転送されました
}
location /fetch/ {#404ここに直接アクセス
Internal;#このディレクトリは外部から直接アクセスできないことを示します
Expires 1d;#Web ページの有効期限
alias /home/html/;#仮想ディレクトリ ファイル システム アドレスは location/ と一致している必要があります。proxy_store はファイルをこのディレクトリに保存します
proxy_pass http://www.sudone.com/;#バックエンド アップストリーム アドレス、/fetch もプロキシです
proxy_set_header Accept-Encoding '';# バックエンドが圧縮 ( gzipまたは deflate) コンテンツを返さないようにします。圧縮されたコンテンツを保存すると問題が発生します。
proxy_store on;#プロキシから返されたファイルを保存するにはnginxを指定します
proxy_temp_path /home/tmp;#一時ディレクトリ。このディレクトリは /home/html と同じハードディスク パーティションに存在する必要があります。
}
これを使用する場合、nginx は /home/tmp および /home/html にファイルを書き込む権限を持っている必要があることに注意してください。 Linuxでは、nginx は通常、nobody ユーザーとして実行されるように設定されているため、これら 2 つのディレクトリは none に設定する必要があります。もちろん、chmod 777 を使用して、誰でもないユーザーに限定することもできますが、経験豊富なシステム管理者は、777 を安易に使用しないことをお勧めします。
2. 従来のキャッシュ 2 (!-e)
原理は基本的に 404 ジャンプと同じですが、より簡潔になります。
位置/{
ルート/ホーム/html/;
プロキシストアがオン。
proxy_set_header Accept-Encoding '';
proxy_temp_path /home/tmp;
if ( !-f $request_filename )
{
proxy_pass http://www.sudone.com/;
}
}
この設定では 404 と比較して多くのコードが節約されていることがわかります。要求されたファイルがファイル システムに存在するかどうかを判断するために !-f を使用し、存在しない場合はバックエンドに proxy_pass を実行し、戻り値も を使用して保存されます。プロキシストア。
従来の両方のキャッシュには、基本的に同じ長所と短所があります。
欠点 1: read.php?id=1 などのパラメーターを含む動的リンクはサポートされていません。nginx はファイル名のみを保存するため、このリンクはファイル システムに read.php としてのみ保存され、ユーザーは読み取りにアクセスできます。 php?id= 2 は間違った結果を返します。同時に、nginx は非常に正直であり、このようなリクエストはリンク システムに従ってファイルに保存されますが、このリンクは明らかにディレクトリであるため、保存は失敗します。このような場合、正しく保存するには書き直す必要があります。
欠点 2: nginx 内にはキャッシュの有効期限とクリーンアップのメカニズムがありません。これらのキャッシュされたファイルはマシン上に永続的に保存されます。キャッシュされるものが多いと、ハードディスクの容量全体がいっぱいになってしまいます。この目的のために、シェル スクリプトを使用して定期的にクリーンアップしたり、php などの動的プログラムを作成してリアルタイム更新を行うことができます。
デメリット 3: キャッシュできるステータス コードは 200 個までであるため、バックエンドから返された 301/302/404 などのステータス コードはキャッシュされず、アクセス数の多い疑似静的リンクが削除された場合は継続されます。後端には大きな圧力がかかります。
欠点 4: nginx はストレージ メディアとしてメモリまたはハードディスクを自動的に選択しません。もちろん、現在のオペレーティング システムにはオペレーティング システム レベルのファイル キャッシュ メカニズムが存在するため、その必要はありません。大量の同時読み取りがハードディスクに保存されると、IO パフォーマンスの問題が発生することを心配しすぎます。
nginx の従来のキャッシュの欠点は、Squid などのキャッシュ ソフトウェアとは異なる機能でもあるため、利点とも言えます。本番アプリケーションでは、Squid のパートナーとしてよく使用されます。Squid は、? によるリンクをブロックできないことがよくありますが、nginx は http://sudone.com/? などのアクセスをブロックできます。 com / は Squid では 2 つのリンクとして扱われるため、2 回の侵入が発生しますが、リンクが http://sudone.com/?1 または http://sudone.com/ になっても、nginx はそれを 1 回だけ保存します。 ? 123 は nginx によってキャッシュできないため、バックエンド ホストを効果的に保護します。
nginx はリンク フォームをファイル システムに非常に忠実に保存するため、リンクのキャッシュ ステータスとコンテンツをキャッシュ マシン上で簡単に確認でき、rsync などの他のファイル マネージャーと簡単に連携することもできます。完全にファイルシステム構造です。
これらの従来のキャッシュは両方とも、Linux ではファイルを /dev/shm に保存できます。これは、システム メモリをキャッシュに使用できるようにするためです。メモリを使用すると、期限切れのコンテンツがより速くクリーンアップされます。 /dev/shm/ を使用する場合、tmp ディレクトリを /dev/shm パーティションに指定するだけでなく、小さなファイルやディレクトリが多数ある場合は、inode の数とこのメモリの最大容量も変更する必要があります。パーティション:
mount -o size=2500M -o nr_inodes=480000 -o noatime,nodiratime -o remount /dev/shm
上記のコマンドは 3G メモリを搭載したマシンで使用されます。/dev/shm のデフォルトの最大メモリはシステム メモリの半分である 1500M であるため、このコマンドは同時に shm の数を 2500M に増やします。システム i ノードはデフォルトでは十分ではないかもしれませんが、興味深いのは、ここでの調整は 480000 であり、少し控えめですが、基本的には十分です。
3. メモリキャッシュに基づくキャッシュ
nginx はmemcachedをある程度サポートしていますが、この機能はそれほど強力ではなく、パフォーマンスは依然として非常に優れています。
場所 /mem/ {
if ( $uri ~ "^/mem/([0-9A-Za-z_]*)$" )
{
$memcached_key "$1" を設定します。
memcached_pass 192.168.1.2:11211;
}
有効期限は 70 です。
}
この設定は、データを取得するために http://sudone.com/mem/abc を memcached のキー abc にポイントします。
現在、nginx には memcached に書き込むためのメカニズムがないため、memcached へのデータの書き込みはバックエンドで動的言語を使用して行う必要があります。404 を使用してバックエンドにデータを書き込むことができます。
4. サードパーティのプラグイン ncache に基づく
ncache は Sina Brothers によって開発された優れたプロジェクトです。nginx と memcached を使用して、このプラグインを使用した経験はありません。
http://code.google.com/p/ncache/
5. nginxの新開発proxy_cache機能
nginx-0.7.44 バージョンから、nginx は Squid と同様のより正式なキャッシュ機能をサポートします。これはまだ開発段階にあり、サポートはかなり制限されています。このキャッシュは、リンクを md5 エンコードでハッシュした後に保存するため、サポートできます。同時に、404/301/302 などの 200 以外のステータスもサポートされます。
構成:
まずキャッシュスペースを設定します。
proxy_cache_path /path/to/cache tables=1:2 key_zone=NAME:10m inactive=5m max_size=2m clean_time=1m;
この設定はサーバー タグの外側にあり、キャッシュ スペースに 2 つのレベルのハッシュ ディレクトリがあり、第 1 レベルのディレクトリは 1 文字で、保存されるファイル名は /path/ のようになります。 to/cache /c/29/b7f54b2df7773722d382f4809d65029c; key_zone はこのスペースに名前を付けます。inactive の 5m は、デフォルトのキャッシュ時間が 5 分であることを意味します。 clean_time は 1 分を指定します。 キャッシュを 1 回クリアします。
位置/{
proxy_pass http://www.sudone.com/;
proxy_cache NAME;#NAME を使用 key_zone
proxy_cache_valid 200 302 1h;#200 および 302 ステータス コードは 1 時間保存されます
proxy_cache_valid 301 1d;#301 ステータス コードは 1 日間保存されます
proxy_cache_valid any 1m;#その他は 1 分間保存されます
}