PHP-FPMを使用して、完全にNginxをインストールしました。 Nginxプロキシを前面に持つApacheの世界から来ています。
Nginxには独自のムーディーキャッシングがあり、非常にアグレッシブなようです。キャッシングにはいくつかのレイヤーがあります。
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;
次に、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
また、サーバーブロックには次のスキップキャッシュディレクティブがあります。
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;
}
次に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;
}
これらすべてにもかかわらず、私の管理画面は非常に積極的にキャッシュされているので、プラグインをアクティブにすると、古い画面が表示されます。プラグインが非アクティブ化されたとき。手動でページを更新した場合にのみ、プラグインが実際にアクティブ化されていることがわかります。
何が欠けていますか?
@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";
}
その構成のビットはおなじみのようです。私はおそらく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には適用されません。