Назад | Перейти на главную страницу

Статус nginx x-cache переключается между попаданием и истечением срока действия на сайте WordPress (тестовый файл php ОК)

У меня есть настройка кеша nginx для сайта WordPress, и он переключается между статусом заголовка nginx x-cache: HIT и x-cache: EXPIRED вроде бы случайно:

C:\Users\curl-7.48>curl -I http://example.com
HTTP/1.1 200 OK
Server: nginx/1.8.0
Date: Sun, 03 Apr 2016 14:15:15 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.5.9-1ubuntu4.14
X-Cached: Sun, 03 Apr 2016 14:15:12 GMT
Set-Cookie: PHPSESSID=vfuo4s72b2ffulacumgu9aidf0; path=/
Link: <http://example.com/wp-json/>; rel="https://api.w.org/"
Link: <http://example.com/>; rel=shortlink
Z_LOCATION: PHP MAIN
URI: /index.php
X-Cache: HIT

C:\Users\curl-7.48>curl -I http://example.com
HTTP/1.1 200 OK
Server: nginx/1.8.0
Date: Sun, 03 Apr 2016 14:15:17 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.5.9-1ubuntu4.14
X-Cached: Sun, 03 Apr 2016 14:15:16 GMT
Set-Cookie: PHPSESSID=fbd37bsvi27cd3hcmrcg4lsio6; path=/
Link: <http://example.com/wp-json/>; rel="https://api.w.org/"
Link: <http://example.com/>; rel=shortlink
Z_LOCATION: PHP MAIN
URI: /index.php
X-Cache: EXPIRED     

C:\Users\curl-7.48>curl -I http://example.com
HTTP/1.1 200 OK
Server: nginx/1.8.0
Date: Sun, 03 Apr 2016 14:15:46 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.5.9-1ubuntu4.14
X-Cached: Sun, 03 Apr 2016 14:15:43 GMT
Set-Cookie: PHPSESSID=dkngc066edc1apnogulga1mtg4; path=/
Link: <http://example.com/wp-json/>; rel="https://api.w.org/"
Link: <http://example.com/>; rel=shortlink
Z_LOCATION: PHP MAIN
URI: /index.php
X-Cache: HIT

У меня также есть простой скрипт time.php, который всегда показывает попадание: <?php echo time(); ?>

C:\Users\curl-7.48\bin>curl -I http://example.com/time.php
HTTP/1.1 200 OK
Server: nginx/1.8.0
Date: Sun, 03 Apr 2016 14:26:17 GMT
Content-Type: text/html
Connection: keep-alive
X-Powered-By: PHP/5.5.9-1ubuntu4.14
Z_LOCATION: PHP MAIN
URI: /time.php
X-Cache: HIT

Вопросы пожалуйста:

  1. Я кэширую в / dev / shm / nginx. Любые указатели на то, что происходит и как найти неисправность (использование памяти в порядке, нет подкачки страниц памяти на диск, inodes в порядке)?

  2. Это связано с тем, что мое приложение PHP возвращает заголовки, которые заставляют nginx не кешировать? Любой способ обнаружить это? Я не вижу заголовков, которые говорят об этом в выводе CURL (если я чего-то не упускаю)?

  3. Имеет ли значение заказ fastcgi_pass php; должно ли это быть в начале или в конце location ~ \.php$ блок?

  4. Также как найти фактический файл, который является кешированной страницей для time.php в пределах /dev/shm/nginx... (есть много каталогов первого уровня 0x0-0xf, затем второй каталог 0x00 to 0xff)?

  5. При беге fatrace Я не вижу, что / dev / shm / nginx читается - я что-то там упустил? Кеширует ли nginx недавно прочитанные файлы в хранилище локальной памяти?

  6. Я настраиваю ведение журнала кеша согласно Мои страницы не обслуживаются из кеша, но на самом деле nginx кэширует файлы и вижу, я получаю много "GET /all/?source=p1& HTTP/1.1" BYPASS и "GET /video/aab HTTP/1.1" EXPIRED записи, это связано?

Моя конфигурация nginx ниже:

http
{
    client_max_body_size 100m;
    proxy_connect_timeout 15s;
    proxy_send_timeout  15s;
    proxy_read_timeout  15s;
    fastcgi_send_timeout 15s;
    fastcgi_read_timeout 15s;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 32 32k;

    fastcgi_cache_path /dev/shm/nginx levels=1:2 keys_zone=MYCACHE:512m max_size=4096m inactive=120m;
    fastcgi_cache_key "$scheme$request_method$host$request_uri";

    server
    {
        server_name example.com;
        root /home/example/public_html/;
        index index.php;

        access_log /home/example/logs/access.log;
        error_log  /home/example/logs/error.log;

        # Rules to work out when cache should or should not be used
        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 uris containing the following segments
        if ($request_uri ~* "/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;
        }

        location = /favicon.ico {
            log_not_found off;
            access_log off;
        }

        location / {
            try_files $uri $uri/ /index.php?$args;
        }

        location ~ \.php$ {
            try_files $uri =404;

            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            include fastcgi_params;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

            fastcgi_cache_valid 200 120m;
            fastcgi_cache_use_stale error timeout invalid_header http_500;
            fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

            fastcgi_cache MYCACHE;
            fastcgi_cache_methods GET HEAD;
            fastcgi_cache_bypass $skip_cache;
            fastcgi_no_cache $skip_cache;

            #more_clear_headers Server; more_clear_headers "Pragma";
            add_header Z_LOCATION "PHP MAIN"; add_header URI $uri; # DEBUG
            add_header X-Cache $upstream_cache_status;

            fastcgi_pass php;
        }

        location ~ /purge(/.*) {
            fastcgi_cache_purge MYCACHE "$scheme$request_method$host$1";
        }
    }
}