web-dev-qa-db-ja.com

Nginx-Wordpress管理領域の積極的なキャッシュを無効にする

PHP-FPMを使用して、完全にNginxをインストールしました。 Nginxプロキシを前面に持つApacheの世界から来ています。

Nginxには独自のムーディーキャッシングがあり、非常にアグレッシブなようです。キャッシングにはいくつかのレイヤーがあります。

  1. Nginxのfastcgiキャッシュ自体。私のnginx.confには次の設定があります:

    fastcgi_cache_path        /var/run/nginx-cache  levels=1:2 keys_zone=WORDPRESS:100m inactive=60m;
    fastcgi_cache_key         "$scheme$request_method$Host$request_uri";
    fastcgi_cache_use_stale   error timeout invalid_header http_500;
    fastcgi_ignore_headers    Cache-Control Expires Set-Cookie;
    
  2. 次に、php opcacheがあります。今は無効にしています:

    ;zend_extension=opcache.so
    opcache.enable=0
    opcache.enable_cli=0
    opcache.memory_consumption=250
    opcache.interned_strings_buffer=8
    opcache.max_accelerated_files=6000
    opcache.revalidate_freq=600
    opcache.fast_shutdown=1
    
  3. また、サーバーブロックには次のスキップキャッシュディレクティブがあります。

    set $skip_cache 0;
    
    # POST requests and urls with a query string should always go to PHP
    if ($request_method = POST) {
            set $skip_cache 1;
    }
    if ($query_string != "") {
            set $skip_cache 1;
    }
    
    #Don't cache the following URLs
    if ($request_uri ~* "/(wp-login.php|wp-admin|login.php|backend|admin)"){
        set $skip_cache 1;
    }
    
    #Don't cache if there is a cookie called PHPSESSID
    if ($http_cookie ~* "PHPSESSID"){
        set $skip_cache 1;
    }
    
    #Don't cache if there is a cookie called wordpress_logged_in_[hash]
    if ($http_cookie ~* "wordpress_logged_in_"){
        set $skip_cache 1;
    }
    
    # Don't cache uris containing the following segments
    if ($request_uri ~* "cms/|/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {
            set $skip_cache 1;
    }
    
    # For the arc 
    if ($request_uri ~* "site/|/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {
            set $skip_cache 1;
    }
    
    # Don't use the cache for logged in users or recent commenters
    if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
            set $skip_cache 1;
    }
    
  4. 次にPHPブロックで、私はそのskip_cacheのものを使用します:

    location ~ \.php$ {
    
          try_files $uri $uri/ =404;
            fastcgi_split_path_info ^(.+\.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_cache_bypass                $skip_cache;
          fastcgi_no_cache                    $skip_cache;
            fastcgi_cache                       WORDPRESS;
            fastcgi_cache_valid  200 301 302    60m;
    }
    

これらすべてにもかかわらず、私の管理画面は非常に積極的にキャッシュされているので、プラグインをアクティブにすると、古い画面が表示されます。プラグインが非アクティブ化されたとき。手動でページを更新した場合にのみ、プラグインが実際にアクティブ化されていることがわかります。

何が欠けていますか?

2
PKHunter

@MichaelHamptonが提案する方法はIMHOが最も良い(最も簡単で、最も効率的)ですが、状況によっては役立つ代替/追加のアプローチがあります。私の Wordpress/Nginxチュートリアル から来ています。いくつかのテーマは、ヘッダーをキャッシュする方法を非常に悪い方法で混乱させます。そのため、基本的に、すべてのヘッダーをWebサイトの領域ごとに異なる方法で書き直したいと思います。古いプラグマヘッダーも削除します。

特定のURLまたはサブディレクトリのブロックを定義して、レート制限またはヘッダーをより正確に制御できるようにします。

「more_clear_headers」と「add_header」は Headers More Nginx拡張 の一部であることに注意してください。上記のパート2にリンクしたチュートリアルを見ると、そのモジュールを使用してNginxをビルドする方法が段階的に示されています。非常に簡単です。

# Rate limiting for login pages
limit_req_zone $binary_remote_addr zone=login:1m rate=5r/m;

# Rate limit wp-login.php to help prevent brute force attacks
location = /blog/wp-login.php {
  # Next line applies the rate limit defined above
  limit_req zone=login burst=3;       
  fastcgi_keep_conn on;
  fastcgi_intercept_errors on;
  fastcgi_pass   php;
  include        fastcgi_params;
  fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
  more_clear_headers "Cache-Control";
  more_clear_headers Server; more_clear_headers "Pragma"; more_clear_headers "Expires";

  # No caching
  more_clear_headers "Cache-Control";
  add_header Cache-Control "private, max-age=0, no-cache, no-store";
  more_clear_headers "Expires";

  # Debugging aid - remove
  # add_header Z_LOCATION "WP-LOGIN"; add_header URI $uri;
}

# Wordpress admin caching headers are generally set correctly, for pages and resources. The only reason we define
# this block separately is to avoid messing with the headers in the main php block.
# This is probably unnecessary because of the skip_cache variable and may be removed
location ~* wp-admin {
  fastcgi_keep_conn on;
  fastcgi_intercept_errors on;
  fastcgi_pass   php;
  include        fastcgi_params;
  fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;

  # Debugging aid - remove
  # add_header Z_LOCATION "WP_ADMIN"; add_header URI $uri; add_header "Z_SKIP_CACHE" $skip_cache;
}

Michaelの答えに追加する何かを追加するには、このブロックも使用します。 Wordpress Adminのキャッシュを2番目の方法で無効にします。また、フィード、サイトマップ、xmlrpcなどのキャッシュを無効にします。一部はWordpress用で、一部はカスタム用だと思います。 PHP実行しているWebサイト。

if ($request_uri ~* "/wp-admin/|/admin-*|/purge*|/xmlrpc.php|wp-.*.php|/feed/|sitemap(_index)?.xml|wp-cron") {
  set $fastcgi_nocache "true";
}   
2
Tim

その構成のビットはおなじみのようです。私はおそらくWordPress wikiからのものだと思います。いずれにせよ、それは非常に複雑で、ほとんど不要です。

ライブ構成をプルするつもりですWordPressサイト:

set $fastcgi_nocache "";
if ($http_cookie ~ (comment_author_.*|wordpress_logged_in.*|wp-postpass_.*)) {
    set $fastcgi_nocache "true";
}
fastcgi_ignore_headers Expires Cache-Control;
fastcgi_hide_header Pragma;
fastcgi_cache_bypass $fastcgi_nocache;
fastcgi_no_cache $fastcgi_nocache;

それで全部です。本当に確認する必要があるのは、ユーザーがログインしていることを示すCookieを持っているか、コメントを残して記憶したいか、または投稿パスワードを入力したかだけです。それ以外は問題ではないか、WordPressには適用されません。

3
Michael Hampton