プレリュード


Nginxには、PHPバックエンドから提供される動的コンテンツをキャッシュするためのディレクティブを持つFastCGIモジュールが含まれています。 これを設定すると、リバースプロキシ( Varnish を考えてください)やアプリケーション固有のプラグインなどの追加のページキャッシュソリューションが不要になります。 コンテンツは、リクエストメソッド、URL、Cookie、またはその他のサーバー変数に基づいてキャッシュから除外することもできます。

VPSでFastCGIキャッシングを有効にする


この記事は、ドロップレットでNginxとPHPを既にセットアップおよび構成していることを前提としています。 キャッシュを有効にする必要がある仮想ホスト構成ファイルを編集します。

nano /etc/nginx/sites-enabled/vhost

server{}ディレクティブの外側のファイルの先頭に次の行を追加します。

fastcgi_cache_path /etc/nginx/cache levels=1:2 keys_zone=MYAPP:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";

「fastcgi_cache_path」ディレクティブは、キャッシュの場所(/ etc / nginx / cache)、そのサイズ(100m)、メモリゾーン名(MYAPP)、サブディレクトリレベル、およびinactive`タイマーを指定します。

場所はハードディスクのどこにあってもかまいません。 ただし、サイズはドロップレットのRAM + Swap 未満である必要があります。そうでない場合、「メモリを割り当てられません」というエラーが表示されます。 パージセクションの「レベル」オプションを確認します。「非アクティブ」オプションで指定された特定の時間(ここでは60分)キャッシュにアクセスしない場合、Nginxはそれを削除します。

「fastcgi_cache_key」ディレクティブは、キャッシュファイル名をハッシュする方法を指定します。 Nginxは、このディレクティブに基づいて、アクセスされたファイルをMD5で暗号化します。

次に、PHPリクエストを渡すlocationディレクティブをphp5-fpmに移動します。 「location〜.php $ {}」の中に、次の行を追加します。

fastcgi_cache MYAPP;
fastcgi_cache_valid 200 60m;

「fastcgi_cache」ディレクティブは、「fastcgi_cache_path」ディレクティブで指定したメモリゾーン名を参照し、この領域にキャッシュを格納します。

デフォルトでは、Nginxはキャッシュされたオブジェクトを次のヘッダーのいずれかで指定された期間保存します: X-Accel-Expires / Expires/Cache-Control。

「fastcgi_cache_valid」ディレクティブは、これらのヘッダーが欠落している場合のデフォルトのキャッシュ存続期間を指定するために使用されます。 上記で入力したステートメントでは、ステータスコードが200の応答のみがキャッシュされます。 他の応答コードも指定できます。

構成テストを実行します

service nginx configtest

すべてがOKの場合はNginxをリロードします

service nginx reload

完全なvhostファイルは次のようになります。

fastcgi_cache_path /etc/nginx/cache levels=1:2 keys_zone=MYAPP:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";

server {
    listen   80;
    
	root /usr/share/nginx/html;
	index index.php index.html index.htm;

	server_name example.com;

	location / {
	    try_files $uri $uri/ /index.html;
    }

	location ~ \.php$ {
	    try_files $uri =404;
	    fastcgi_pass unix:/var/run/php5-fpm.sock;
	    fastcgi_index index.php;
	    include fastcgi_params;
	    fastcgi_cache MYAPP;
	    fastcgi_cache_valid 200 60m;
    }
}

次に、キャッシュが機能するかどうかを確認するためのテストを行います。

VPSでのFastCGIキャッシングのテスト


UNIXタイムスタンプを出力するPHPファイルを作成します。

 /usr/share/nginx/html/time.php

入れる

<?php
echo time();
?>

curlまたはWebブラウザを使用してこのファイルを複数回リクエストしてください。

root@droplet:~# curl http://localhost/time.php;echo
1382986152
root@droplet:~# curl http://localhost/time.php;echo
1382986152
root@droplet:~# curl http://localhost/time.php;echo
1382986152

キャッシュが適切に機能する場合、応答がキャッシュされるのと同じタイムスタンプがすべてのリクエストに表示されます。

キャッシュの場所のrecursiveリストを実行して、このリクエストのキャッシュを見つけます。

root@droplet:~# ls -lR /etc/nginx/cache/
/etc/nginx/cache/:
total 0
drwx------ 3 www-data www-data 60 Oct 28 18:53 e

/etc/nginx/cache/e:
total 0
drwx------ 2 www-data www-data 60 Oct 28 18:53 18

/etc/nginx/cache/e/18:
total 4
-rw------- 1 www-data www-data 117 Oct 28 18:53 b777c8adab3ec92cd43756226caf618e

命名規則については、パージのセクションで説明します。

Nginxに「X-Cache」ヘッダーを応答に追加させて、キャッシュが失われたかヒットしたかを示すこともできます。

server{}ディレクティブの上に以下を追加します。

add_header X-Cache $upstream_cache_status;

Nginxサービスをリロードし、curlを使用して詳細なリクエストを実行して、新しいヘッダーを確認します。

root@droplet:~# curl -v http://localhost/time.php
* About to connect() to localhost port 80 (#0)
*   Trying 127.0.0.1...
* connected
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET /time.php HTTP/1.1
> User-Agent: curl/7.26.0
> Host: localhost
> Accept: */*
>
* HTTP 1.1 or later with persistent connection, pipelining supported
< HTTP/1.1 200 OK
< Server: nginx
< Date: Tue, 29 Oct 2013 11:24:04 GMT
< Content-Type: text/html
< Transfer-Encoding: chunked
< Connection: keep-alive
< X-Cache: HIT
<
* Connection #0 to host localhost left intact
1383045828* Closing connection #0

キャッシュ例外の設定


認証が必要なページなどの一部の動的コンテンツはキャッシュしないでください。 このようなコンテンツは、「request_uri」、「request_method」、「http_cookie」などのサーバー変数に基づいてキャッシュから除外できます。

これは、 server{}コンテキストで使用する必要がある構成例です。

#Cache everything by default
set $no_cache 0;

#Don't cache POST requests
if ($request_method = POST)
{
    set $no_cache 1;
}

#Don't cache if the URL contains a query string
if ($query_string != "")
{
    set $no_cache 1;
}

#Don't cache the following URLs
if ($request_uri ~* "/(administrator/|login.php)")
{
    set $no_cache 1;
}

#Don't cache if there is a cookie called PHPSESSID
if ($http_cookie = "PHPSESSID")
{
    set $no_cache 1;
}

「$no_cache」変数を適切なディレクティブに適用するには、次の行を location〜.php ${}内に配置します。

fastcgi_cache_bypass $no_cache;
fastcgi_no_cache $no_cache;

「fasctcgi_cache_bypass」ディレクティブは、以前に設定した条件に関連するリクエストの既存のキャッシュを無視します。 「fastcgi_no_cache」ディレクティブは、指定された条件が満たされた場合、要求をまったくキャッシュしません。

キャッシュの削除


キャッシュの命名規則は、「fastcgi_cache_key」ディレクティブに設定した変数に基づいています。

fastcgi_cache_key "$scheme$request_method$host$request_uri";

これらの変数によると、「 http://localhost/time.php 」をリクエストしたとき、実際の値は次のようになります。

fastcgi_cache_key "httpGETlocalhost/time.php";

この文字列をMD5ハッシュに渡すと、次の文字列が出力されます。

b777c8adab3ec92cd43756226caf618e

これにより、「levels = 1:2」と入力したサブディレクトリと同様に、キャッシュのファイル名が形成されます。 したがって、ディレクトリの最初のレベルは、このMD5文字列の最後のeから1文字で名前が付けられます。 2番目のレベルには、最初のレベルの後に最後の2文字が含まれます。 18。 したがって、このキャッシュの全体的なディレクトリ構造は次のようになります。

/etc/nginx/cache/e/18/b777c8adab3ec92cd43756226caf618e

このキャッシュ命名形式に基づいて、お気に入りの言語でパージスクリプトを開発できます。 このチュートリアルでは、__POST__edURLのキャッシュを削除する簡単なPHPスクリプトを提供します。

/usr/share/nginx/html/purge.php

入れる

<?php
$cache_path = '/etc/nginx/cache/';
$url = parse_url($_POST['url']);
if(!$url)
{
    echo 'Invalid URL entered';
    die();
}
$scheme = $url['scheme'];
$host = $url['host'];
$requesturi = $url['path'];
$hash = md5($scheme.'GET'.$host.$requesturi);
var_dump(unlink($cache_path . substr($hash, -1) . '/' . substr($hash,-3,2) . '/' . $hash));
?>

パージするURLを使用してこのファイルにPOSTリクエストを送信します。

curl -d 'url=http://www.example.com/time.php' http://localhost/purge.php

スクリプトは、キャッシュがパージされたかどうかに基づいて、trueまたはfalseを出力します。 このスクリプトをキャッシュから除外し、アクセスを制限してください。

提出者:http: //jesin.tk/ ”>ジェシンA