カテゴリー
WordPress

Nginx Cache Controller を使うためにヘッダーについて勉強!設定編集いたしました♪

WordPress › Nginx Cache Controller « WordPress Plugins を使うには、WordPress から nginx のキャッシュを操作するために、nginx のキャッシュ設定を変更する必要があるとのことですわ。

その中の一部分、次のヘッダについて調べましたのでメモいたします。

  1. X-Accel-Expires
  2. X-Accel-Redirect
  3. X-Accel-Buffering
  4. X-Accel-Charset
  5. X-Accel-Limit-Rate
  6. /etc/nginx/conf.d/default.conf の fastcgi_pass_header を編集してこうなりました♪
  7. おわりに

1.X-Accel-Expires ヘッダについて

このヘッダがどうやら一番重要なようですのでまずは X-Accel−Expires から見てまいります。FastCGI がリバースプロキシにヘッダを転送する部分について、次の変更が重要だということです。

この機能は、Nginx Cache Controllerプラグインによって、X-Accel-Expires ヘッダを用いてリバースプロキシに対して有効期間を指定することで実現しています。

しかし、デフォルトの Nginx は、fastcgi から受け取った X-Accel-Expires ヘッダを無視する仕様となっているため、以下の設定を追加して、X-Accel-Expires を含むいくつかのレスポンスヘッダーに対して許可を与える必要があります。

一番大事なのは X-Accel-Expires ヘッダで、これを使ってキャッシュを操作するようですわね。

もう少し調べてみると、次の引用のようにこの X-Accel-Expires ヘッダがキャッシュ設定の中で一番優先されるそうですの。

Nginxではリバースプロキシのキャッシュの有効期限を以下の方法でも設定できますが、X-Accel-Expiresは最も優先順位の高い方法でこれ以外の方法を上書きしてくれます。

  1. X-Accel-Expires ヘッダ
  2. Cache-Control ヘッダ
  3. nginx.conf 内の proxy_cache_validパラメータ

(上にあるものほど優先順位が高い。)

nginx ドキュメントも調べてみますと、確かに X-Accel-Expires を優先する記述が読み取れます。

Parameters of caching can also be set directly in the response header. This has higher priority than setting of caching time using the directive. The “X-Accel-Expires” header field sets caching time of a response in seconds. The zero value disables caching for a response. If the value starts with the @ prefix, it sets an absolute time in seconds since Epoch, up to which the response may be cached. If the header does not include the “X-Accel-Expires” field, parameters of caching may be set in the header fields “Expires” or “Cache-Control”. If the header includes the “Set-Cookie” field, such a response will not be cached. Processing of one or more of these response header fields can be disabled using the fastcgi_ignore_headers directive.

強調した部分だけ意訳を試みますと、、、次のようなりますわ。

「これ(レスポンスヘッダーのキャッシングパラメータ)はディレクティブを使用したキャッシュ時間の設定よりも優先順位が高いです。」

「もしヘッダーが “X-Accel-Expires” フィールドを含まない場合、ヘッダーフィールドの “Expires” または “Cache-Control” がキャッシングのパラメーターにセットされるでしょう。」

2.X-Accel-Redirect について

requests redirected by the “X-Accel-Redirect” response header field from an upstream server;

「upstream(上流)サーバから X-Accel-Redirect レスポンスヘッダーフィールドによってリダイレクトされたリクエスト」という内部要求によって、たとえばクライアントエラー404(見つかりません)が返されるようです。

upstream(上流)サーバは、おそらく nginx 設定ファイルに記述する upstream の部分を意味すると思いますので、HTTP ウェブサーバの事を指していると思いますの。

。。。わかったようなわからないような><。

ただ正解かどうかはわかりませんけれども一旦、X-Accel-Redirect を設定することにより、PHP とリバースプロキシとでリダイレクトの連携ができるようになると理解しておきますの。

具体例から感覚をつかむという点で、こちらのページが参考になりました。ありがとう存じます♪

3.X-Accel-Buffering について

Enables or disables buffering of responses from the FastCGI server.

… 略 …

Buffering can also be enabled or disabled by passing “yes” or “no” in the “X-Accel-Buffering” response header field.

(X-Accel-Buffering は)FastCGI サーバからのレスポンスをメモリにバッファリングすることを許可するか許可しないかを設定

「バッファリングのオン・オフは “X-Accel-Buffering” レスポンスヘッダーフィールドで“yes” または “no” を設定することで可能となる」

これも確証がもてません><。バッファリングするといえばメモリにデータを格納して高速に処理していく、、、ということでよいと思いますけれどもあまり自信がございませんわ><。

4.X-Accel-Charset について

これはわかりやすいですの。X-Accel-Charset を設定すれば文字コードを PHP から指定できるということですわね。

In addition, a charset can be set in the “X-Accel-Charset” response header field.

5.X-Accel-Limit-Rate について

Limits the rate of response transmission to a client. The <i>rate</i> is specified in bytes per second. The zero value disables rate limiting. The limit is set per a request, and so if a client simultaneously opens two connections, the overall rate will be twice as much as the specified limit.

クライアントへのレスポンス送信レートを制限します。レートは秒辺りバイト数で指定します。ゼロに指定した場合、レート制限を無効にします。制限はリクエストごとに設定されており、もしクライアントが同時に2つのコネクションを開いた場合、総レートは指定された制限値の2倍になるでしょう。」

転送量の操作ですのね。この X-Accel-Limit-Rate ヘッダーフィールドの意味自体が理解できておりませんでしたので、すっきりいたしました♪

6./etc/nginx/conf.d/default.conf の fastcgi_pass_header を編集してこうなりました♪

次をウェブサーバ設定の、PHP-FPM 設定部分に追加いたしました。

        fastcgi_pass_header "X-Accel-Redirect";
        fastcgi_pass_header "X-Accel-Buffering";
        fastcgi_pass_header "X-Accel-Charset";
        fastcgi_pass_header "X-Accel-Expires";
        fastcgi_pass_header "X-Accel-Limit-Rate";

全体として、/etc/nginx/conf.d/default.conf は次のようになりましたの♪

# ドキュメントルート
root   /var/www/html/oki2a24.com;
# インデックスファイル指定
index  index.php index.html index.htm;

# キャッシュしたファイルが保管されるパスと、キャッシュゾーンの名前、容量を指定
# キャッシュ保管場所 /var/cache/nginx
# キャッシュを保存するサブディレクトリ階層の深さ 1:2
# キャッシュゾーン czone メモリの割当量 32m
# ゾーン内に保存できるキャッシュ最大値 256m
# アクセスの無いキャッシュを削除するまでの期間 1440m
proxy_cache_path  /var/cache/nginx levels=1:2 keys_zone=czone:32m max_size=256m inactive=1440m;
# 利用するキャッシュゾーンの名前を指定
proxy_cache czone;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# ステータスコードが通常応答の「200」と、ファイルが存在しない「404」の場合30分間キャッシュを保持
proxy_cache_valid 200 404 30m;

# プロキシサーバ設定
server {
    listen 80 default_server;

    # ドットファイルへのアクセスを禁止、ログへの記録オフ
    location ~ /\. {deny all; access_log off; log_not_found off; }
    # robots.txt へのアクセスはログへの記録オフ
    location = /robots.txt  { access_log off; log_not_found off; }
    # favicon へのアクセスはログへの記録オフ
    location = /favicon.ico { access_log off; log_not_found off; }
    # JavaScript CSS 画像へのアクセスはログへの記録オフ、直ちにプロキシに通しキャッシュ。
    # この期の設定でアクセス元の状態で複数キャッシュを行うが画像ファイルなどは複数キャッシュさせない
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        log_not_found off;
        proxy_pass http://unix:/var/run/nginx.sock;
    }

    # プロキシキャッシュ設定
    # 初期値はキャッシュするにセット
    set $do_not_cache 0;
    # .php ファイルへ直接アクセスがあるのは基本的に管理ページのみのためキャッシュしない
    if ($uri ~* "\.php$") {
        set $do_not_cache 1;
    }

    # POST 時はキャッシュしない
    if ($request_method = POST) {
        set $do_not_cache 1;
    }

    # $proxy_cache_key に任意の文字を加えることで別のキーでページをキャッシュ可能にする
    set $proxy_cache_key "$scheme://$host$request_uri";

    # ログイン状態またはコメントを記入したことがあれば、その情報ごとにキャッシュを分ける
    if ($http_cookie ~ "(wordpress_logged_in_|comment_author_)(.*)") {
        set $proxy_cache_key "$2::$proxy_cache_key";
    }

    # 今まで組み立てたプロキシ設定でキャッシュを実行
    location / {
        proxy_no_cache $do_not_cache;
        proxy_cache_bypass $do_not_cache;
        proxy_cache_key $proxy_cache_key;
        proxy_pass http://unix:/var/run/nginx.sock;
    }
 
}

# ウェブサーバ設定
server {
    # ポートを指定
    #listen       80;
    listen unix:/var/run/nginx.sock; 
    # 実ファイルがない場合のアクセスファイル
    try_files $uri $uri/ /index.php;

    location / {
        # WordPress パーマリンク設定を利用可能にする
        if (!-e $request_filename) {
            rewrite ^.+?(/wp-.*) $1 last;
            rewrite ^.+?(/.*\.php)$ $1 last;
            # ドキュメントルートから WordPress までの相対パス
            # (ドキュメントルートにインストールしたため相対パスは記入なし)
            rewrite ^ /index.php last;
        }
    }

    # PHP-FPM 設定
    location ~ \.php$ {
        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
        fastcgi_pass_header "X-Accel-Redirect";
        fastcgi_pass_header "X-Accel-Buffering";
        fastcgi_pass_header "X-Accel-Charset";
        fastcgi_pass_header "X-Accel-Expires";
        fastcgi_pass_header "X-Accel-Limit-Rate";
    }
}

おわりに

Apache から nginx に切り替えてから、nginx 設定を少しずつ変化させてまいりました。

  1. 【nginx】【超高速】 WordPress のウェブサーバーを nginx にして、プロキシキャッシュを使ってパフォーマンスをとても向上させるまでの試行錯誤です!【Apache からの卒業】 | oki2a24
  2. 【nginx】プロキシキャシュディレクトリを変更して再起動すると前のディレクトリはどうなる? | oki2a24

次は、WordPress プラグインを Nginx Cache Controller を導入して、さらにページ表示スピードを操作していきたいですの♪

以上です。

「Nginx Cache Controller を使うためにヘッダーについて勉強!設定編集いたしました♪」への3件の返信

コメントを残す