Nginx - desativa o armazenamento em cache agressivo para áreas admin do Wordpress

2

Eu tenho uma instalação totalmente Nginx agora, com PHP-FPM. Vindo de um mundo de Apache com Nginx proxying na frente.

Parece que o Nginx tem seu próprio cachê mal-humorado, muito agressivo. Existem algumas camadas de cache:

  1. O cache fastcgi do Nginx em si. No meu nginx.conf eu tenho as seguintes configurações:

    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. Depois, há o php opcache. Eu o desabilitei por enquanto:

    ;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. Eu também tenho as seguintes diretivas de cache de salto nos blocos de servidor:

    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. Então, no bloco PHP, eu uso esse material 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;
    }
    

Apesar de tudo isso, minhas telas de administrador são tão agressivamente armazenadas que, quando eu ativo um plugin, ele mostra a tela antiga. Quando o plugin foi desativado. Somente quando atualizo manualmente a página, vejo que o plug-in está efetivamente ativado.

O que estou perdendo?

    
por PKHunter 14.02.2017 / 12:15

2 respostas

2

A maneira sugerida pelo @MichaelHampton é melhor para IMHO (mais fácil, mais eficiente), mas aqui está uma abordagem alternativa / adicional que pode ser útil em algumas situações. Vem do meu tutorial sobre o Wordpress / Nginx. Alguns temas mexem com cabeçalhos de cache de uma forma muito ruim, então eu basicamente quero reescrever todos os cabeçalhos de maneira diferente para diferentes áreas do site. Eu também removi o cabeçalho Pragma antigo.

Eu defino blocos para URLs ou subdiretórios específicos para que eu possa classificar os limites ou os cabeçalhos de controle com mais precisão.

Tenha em atenção que "more_clear_headers" e "add_header" fazem parte da extensão Headers More Nginx . Se você olhar para o tutorial que eu fiz o link acima, parte dois, ele dá instruções passo a passo de como construir o Nginx com esse módulo - é bem fácil.

# 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;
}

Para adicionar mais alguma coisa para adicionar à resposta de Michael, também uso esse bloco. Ele desativa o cache do Wordpress Admin de uma segunda maneira e também desabilita o armazenamento em cache de feeds, sitemap, xmlrpc e alguns outros. Parte disso é para o Wordpress, eu suspeito que parte dele é para um site PHP escrito que eu corro.

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

Essa configuração parece familiar. Eu acho que provavelmente veio do wiki do WordPress. De qualquer forma, é supercomplicada e, na maior parte, desnecessária.

Vou extrair minha configuração de um site WordPress ao vivo:

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;

Isso é tudo. A única coisa que você realmente precisa verificar é se o usuário tem um cookie indicando que ele está logado, deixou um comentário e queria ser lembrado, ou digitou uma senha. Todo o resto não importa ou não se aplica ao WordPress.

    
por 14.02.2017 / 14:05