web-dev-qa-db-ja.com

Nginxキャッシュミスのデバッグ:有効なプロキシが多いにもかかわらず、大量のMISSにヒットする

プロキシキャッシュパスが非常に高いサイズに設定されています

proxy_cache_path  /var/lib/nginx/cache  levels=1:2   keys_zone=staticfilecache:180m  max_size=700m;

そして使用されるサイズは

Sudo du -sh *
14M cache
4.0K    proxy

有効なプロキシキャッシュが

proxy_cache_valid 200 120d;

私はHITとMISSを追跡します

add_header X-Cache-Status $upstream_cache_status;

これらの設定にもかかわらず、多くのMISSが発生しています。これは、1時間前に意図的にキャッシュウォーマーを実行したページです。

これらのMISSが発生している理由をデバッグするにはどうすればよいですか?ミスの原因が削除、有効期限、不正なヘッダーなどに起因するものかどうかを確認するにはどうすればよいですか? Nginxはこのためのコマンドを提供していますか?

編集:完全な設定

    # at http level
    proxy_cache_path  /var/lib/nginx/cache  levels=1:2 inactive=400d keys_zone=staticfilecache:180m  max_size=700m;
    proxy_temp_path /var/lib/nginx/proxy;
    proxy_connect_timeout 30;
    proxy_read_timeout 120;
    proxy_send_timeout 120;
    #prevent header too large errors
    proxy_buffers 256 16k;
    proxy_buffer_size 32k;
    #httpoxy exploit protection
    proxy_set_header Proxy "";

    # at server level 
    add_header Cache-BYPASS-Reason $skip_reason;

    # define nginx variables
    set $do_not_cache 0;
    set $skip_reason "";
    set $bypass 0;

    # security for bypass so localhost can empty cache
    if ($remote_addr ~ "^(127.0.0.1|Web.Server.IP)$") {
        set $bypass $http_8X0;
    }

    # skip caching WordPress cookies
    if ($http_cookie ~* "comment_author_|wordpress_(?!test_cookie)|wp-postpass_" ) {
        set $do_not_cache 1;
        set $skip_reason Cookie;
    }

    # Don't cache URIs containing the following segments
    if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php") {
        set $skip_cache 1;
        set $skip_reason URI;
    }

    # https://guides.wp-bullet.com/how-to-configure-nginx-reverse-proxy-wordpress-cache-Apache/
    location / {
            proxy_pass http://127.0.0.1:8000;

            proxy_set_header X-Real-IP  $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto https;
            proxy_set_header X-Forwarded-Port 443;
            proxy_set_header Host $Host;
            proxy_set_header Accept-Encoding "";

            # may need to comment out proxy_redirect if get login redirect loop
            proxy_redirect off;

            proxy_cache_key "$scheme://$Host$uri";
            add_header X-Nginx-Cache-Head "$scheme://$Host$uri";
            proxy_cache staticfilecache;
            proxy_cache_valid       200 301 302 100d;
            proxy_cache_valid 404 1m;


            add_header Cache-Control public;

            proxy_ignore_headers Expires;
            proxy_ignore_headers  "Cache-Control";
            proxy_ignore_headers X-Accel-Expires;

            proxy_hide_header "Cache-Control";
            proxy_hide_header Pragma;
            proxy_hide_header Server;
            proxy_hide_header Request-Context;
            proxy_hide_header X-Powered-By;
            proxy_cache_revalidate on;

            proxy_hide_header X-AspNet-Version;
            proxy_hide_header X-AspNetMvc-Version;
            #proxy_pass_header X-Accel-Expires;


            add_header X-Nginx-Cache-Status $upstream_cache_status;

            proxy_cache_use_stale  error timeout invalid_header updating http_500 http_502 http_503 http_504;
            proxy_cache_bypass $arg_nocache $do_not_cache $http_8X0;
            proxy_no_cache $do_not_cache;

    }

    location ~* \.(jpg|png|gif|jpeg|css|js|mp3|wav|swf|mov|doc|pdf|xls|ppt|docx|pptx|xlsx)$ {
            proxy_cache_valid 200 120d;
            expires 364d;
            add_header Cache-Control public;
            proxy_pass http://127.0.0.1:8000;
            proxy_cache staticfilecache;
            add_header X-Nginx-Cache-Status $upstream_cache_status;
            proxy_cache_use_stale  error timeout invalid_header updating http_500 http_502 http_503 http_504;
    }
4
Quintin Par

proxy_cache_pathinactiveパラメータを120dよりも大きい値に設定する必要がある場合があります(または、最大キャッシュ時間を実際に設定したい場合)。 非アクティブのデフォルト設定は10分です 。キャッシュしているURLが非アクティブなパラメーターの時間枠内でアクセスされる限り、キャッシュは有効ですが、その時間枠内でアクセスされない場合、キャッシュから外れます。詳細は nginx proxy_cache_pathディレクティブについて を参照してください。

これは 典型的な$ upstream_cache_statusスタイルのデバッグ の範囲外であると思います。キャッシュのクリーンアップはリクエスト/レスポンスサイクル内では発生しないためです。私の知る限り、nginxワーカープロセスは、他に何も実行していない場合、優先度の低いタスクとしてキャッシュをクリーンアップします。このアクティビティがログのどこに表示されるかわかりませんが、デバッグが有効なビルドでのみ表示される可能性があります。

2
Mike Howsden

キャッシング:

locationまたはserverブロックで_proxy_cache_を有効にしていますか?

たとえば、 Nginx docs の_location /_ブロックのいくつかの設定。

_proxy_cache_path  /var/lib/nginx/cache  levels=1:2   keys_zone=staticfilecache:180m  max_size=700m;


server {
    # ...
    location / {
        proxy_cache my_cache;
        proxy_cache_revalidate on;
        proxy_cache_min_uses 3;
        proxy_cache_use_stale error timeout updating http_500 http_502
                              http_503 http_504;
        proxy_cache_background_update on;
        proxy_cache_lock on;
    # ...
    }
_

キャッシュを機能させるには、少なくとも2つの必須設定が必要です。

いくつかのlocationブロックで設定した場合、それがキャッシュしたいものですか?


分析する

ヒットを分析する場合は、そのための特定のログを作成できます。

_log_format cache_st '$remote_addr - $upstream_cache_status [$time_local]  '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent"';
_

そして、同じserverまたはlocationブロックで、それを2次ログとして追加できるので、他のものを逃すことはありません。

_access_log   /var/log/nginx/domain.com.access.log;
access_log   /var/log/nginx/domain.com.cache.log cache_st;
_

次に、いくつかの統計を確認できます。

ヒット対ミス対バイパス対期限切れ

_awk '{print $3}' cache.log | sort | uniq -c | sort -r_

MISS URL

awk '($3 ~ /MISS/)' cache.log | awk '{print $7}' | sort | uniq -c | sort -r

BYPASS URL

awk '($3 ~ /BYPASS/)' cache.log | awk '{print $7}' | sort | uniq -c | sort -r

MISS vs BYPASS

  • [〜#〜] miss [〜#〜]は、パターンがキャッシュするように構成されているが、リクエスト時にキャッシュされなかった場合に発生します。正しい構成では、後続のリクエストは、他のパラメータのキャッシュ期間に基づいてキャッシュから提供されます。
  • [〜#〜] bypass [〜#〜]は、パターンがキャッシュを使用しないように明示的に構成された場合に発生します。例えばログインしたユーザーのキャッシュをスキップします。後続のリクエストもバイパスされます。

ソースの分析:- https://easyengine.io/tutorials/nginx/upstream-cache-status-in-access-log/

コンソールを介してオンザフライで分析するための別のオプションは、ncursesが機能する: https://goaccess.io/

2
Leo

何をキャッシュしようとしていますか? cms?静的ページ?通常、バッキング送信のキャッシュなし、期限切れ-1、またはキャッシュプライベートの場合、ミスが発生します。クッキーの場合にもミスをヒットします。

2
x86fantini