Quick question on NGINX cache

Jore community at thoughtmaybe.com
Thu May 28 03:20:04 UTC 2020


Hi everyone,

Just chasing up below, if anyone has any suggestions?

So to recap, the situation is, I have nginx running Wordpress with the
Hypercache plugin but only the homepage is cached, other pages "miss"
according to page headers.

Here is contents of the sites-enabled conf in question:


server {
        listen 80;
        listen 443 ssl http2;

        server_name NAMEOFSITECHANGED.COM;

        ssl_certificate /etc/nginx/ssl/NAMEOFSITECHANGED.COM.crt;
        ssl_certificate_key /etc/nginx/ssl/NAMEOFSITECHANGED.COM.key;
        keepalive_timeout 70;

        #enables all versions of TLS, but not SSLv2 or 3 which are crap
and now deprecated.
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

        #disable weak ciphers
        ssl_ciphers
"ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
        ssl_prefer_server_ciphers on;


        root /var/www/NAMEOFSITECHANGED.COM;

        access_log /var/log/nginx/NAMEOFSITECHANGED.COM_access.log;
        error_log /var/log/nginx/NAMEOFSITECHANGED.COM_error.log;


        # don't cache anything using 'post' such as a form on subscribe page
         if ($request_method = POST) { set $skip_cache 1; }

        # don't cache URLs containing the following elements
        if ($request_uri ~*
"/wp-admin/|wp-.*.php|index.php|preview=true") { set $skip_cache 1; }

        # don't use the cache for logged in users
        if ($http_cookie ~*
"comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in|nCacheBypass")
{ set $skip_cache 1; }


        #main
        location / {

            index index.htm index.php;
            try_files $uri $uri/ /index.php?$args;
            error_page 404 = /404;

            #handle old permalink URLs and rewrite
            #rewrite ^/?video/(.*) /$1 permanent;
        }


        #pass the PHP scripts to FastCGI
        location ~ \.php$ {

            include snippets/fastcgi-php.conf;
            include fastcgi_params;
          
            fastcgi_pass unix:/run/php/php7.3-fpm.sock;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_cache_bypass $skip_cache;
            fastcgi_cache WORDPRESS;
            fastcgi_cache_valid  60m;

            error_page 404 = /404;
        }


        #no log on static files and expires header is set to maximum age
        location ~*
^.+\.(css|ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|js|gif|png|ico)$
{
            access_log off;
            log_not_found off;
            expires max;
            add_header Pragma public;
            add_header Cache-Control "public, must-revalidate,
proxy-revalidate";
       }
}


And contents of /etc/nginx/nginx.conf:

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
    worker_connections 8192;
    # multi_accept on;
}

http {

    ##
    # Basic Settings
    ##

        #jore - extend times for SSL handshake etc to try keep server
load low
        ssl_session_cache   shared:SSL:10m;
        ssl_session_timeout 10m;

    #jore - turn off server version and headers
    server_tokens off;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    client_max_body_size 128M;
    # server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;


    ##
    # SSL Settings
    ##

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;

    ##
    # Logging Settings
    ##
    # Comment out to set individual site log locations in their own conf

    #access_log /var/log/nginx/access.log;
    #error_log /var/log/nginx/error.log;

    #jore - change the format of nginx http logs a little to suit awstats
    log_format main     '$remote_addr - $remote_user [$time_local]
"$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';


    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json
application/javascript text/xml application/xml application/xml+rss
text/javascript;

    ##
    # Virtual Host Configs
    ##

    #jore - set up settings for memcached
        fastcgi_cache_path /var/www/memcached levels=1:2
keys_zone=WORDPRESS:100m inactive=1440m;
        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;
        add_header X-Cached $upstream_cache_status;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}



/etc/nginx/conf.d is empty.

Any ideas as to what I've messed up?

Thanks!
Jore




On 25/5/20 5:07 am, Jore wrote:
>
> Hi there,
>
> Thanks for that.
>
> Could you provide an example conf by any chance please, so I can get
> my head around that?
>
> Thanks!
> Jore
>
>
> On 24/5/20 8:56 am, Alex Evonosky wrote:
>> Jore-
>>
>> I applied the proxy_hide_header for no-cache headers to NGINX can
>> process it and cache it.
>>
>> On Sat, May 23, 2020 at 5:17 PM Jore <community at thoughtmaybe.com
>> <mailto:community at thoughtmaybe.com>> wrote:
>>
>>     Hi Alex/all,
>>
>>     How did you fix?
>>
>>     I've got a very similar issue.
>>
>>     nginx running Wordpress with the Hypercache plugin but only the
>>     homepage is cached, other pages "miss" according to page headers.
>>
>>     Thanks,
>>     Jore
>>
>>
>>     On 24/5/20 7:04 am, Alex Evonosky wrote:
>>>     Disregard, found the issue.
>>>
>>>     thank you.
>>>
>>>     On Sat, May 23, 2020 at 4:18 PM Alex Evonosky
>>>     <alex.evonosky at gmail.com <mailto:alex.evonosky at gmail.com>> wrote:
>>>
>>>         "Can you be more specific? Which "cache"? Browser cache?
>>>         Nginx content
>>>         cache? try_files has nothing to do with caching..."
>>>
>>>
>>>         Nginx content cache
>>>
>>>
>>>         "Either way, you need to check your headers to ensure that
>>>         they allow
>>>         caching for said pages. Also if any cookies are being sent
>>>         then nginx
>>>         won't cache the page."
>>>
>>>
>>>         I looked at the headers using CURL..  
>>>
>>>         The issue seems this:
>>>
>>>
>>>         The request hits NGINX and the backend server(s) for
>>>         Wordpress are cached just fine from just the FQDN ---
>>>         example.com <http://example.com>
>>>
>>>         however, if I try to go to say, example.com/?page_id=1234
>>>         <http://example.com/?page_id=1234>, the headers do not show
>>>         NGINX anymore, as only the servers for Wordpress show up;
>>>         Almost like a 
>>>         cache punch-hole.
>>>
>>>
>>>         ===== proxy.conf ====
>>>
>>>         proxy_cache_path /tmp/cache keys_zone=my_cache:10m
>>>         max_size=10m inactive=60m;
>>>
>>>         #proxy_redirect off;
>>>         proxy_set_header Host $host;
>>>         proxy_set_header X-Real-IP $remote_addr;
>>>         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
>>>         add_header X-Cache-Status $upstream_cache_status;
>>>         client_max_body_size 10m;
>>>         client_body_buffer_size 128k;
>>>         proxy_connect_timeout 90;
>>>         proxy_send_timeout 90;
>>>         proxy_read_timeout 90;
>>>         proxy_buffers 32 4k;
>>>
>>>
>>>
>>>         ==== nginx.conf ====
>>>
>>>         http {
>>>                 upstream example.com <http://example.com> {
>>>                 least_conn;
>>>                 server 10.10.10.138:8999 <http://10.10.10.138:8999>;
>>>                 server 10.10.10.84:8999 <http://10.10.10.84:8999>;
>>>                 }
>>>
>>>         server {
>>>         listen 82;
>>>         location / {
>>>         try_files $uri $uri/ /$args /index.php?$args;
>>>         proxy_cache my_cache;
>>>         proxy_cache_use_stale error timeout http_500 http_502
>>>         http_503 http_504;
>>>         proxy_cache_background_update on;
>>>         proxy_pass http://example.com;
>>>         proxy_cache_valid any 60m;
>>>         proxy_cache_methods GET HEAD POST;
>>>         proxy_http_version 1.1;
>>>         proxy_set_header Connection keep-alive;
>>>         proxy_ignore_headers Cache-Control Expires Set-Cookie;
>>>               }
>>>         }
>>>
>>>         sendfile on;
>>>         tcp_nopush on;
>>>         tcp_nodelay on;
>>>         keepalive_timeout 65;
>>>         types_hash_max_size 2048;
>>>
>>>         gzip on;
>>>         gzip_disable "msie6";
>>>
>>>         # include /etc/nginx/conf.d/*.conf;
>>>         # include /etc/nginx/sites-enabled/*;
>>>         include /etc/nginx/proxy.conf;
>>>
>>>         }
>>>
>>>
>>>
>>>
>>>
>>>         Thank you,
>>>         Alex
>>>
>>>
>>>
>>>
>>>         On Sat, May 23, 2020 at 8:43 AM J.R. <themadbeaker at gmail.com
>>>         <mailto:themadbeaker at gmail.com>> wrote:
>>>
>>>             > And the main page caches OK, but any page the resides
>>>             on the "?page_id" is
>>>             > not getting cached.  Is there more to the "try_files"
>>>             that needs applied
>>>             > for caching of these permalinks?
>>>
>>>             Can you be more specific? Which "cache"? Browser cache?
>>>             Nginx content
>>>             cache? try_files has nothing to do with caching...
>>>
>>>             Either way, you need to check your headers to ensure
>>>             that they allow
>>>             caching for said pages. Also if any cookies are being
>>>             sent then nginx
>>>             won't cache the page.
>>>             _______________________________________________
>>>             nginx mailing list
>>>             nginx at nginx.org <mailto:nginx at nginx.org>
>>>             http://mailman.nginx.org/mailman/listinfo/nginx
>>>
>>>
>>>     _______________________________________________
>>>     nginx mailing list
>>>     nginx at nginx.org <mailto:nginx at nginx.org>
>>>     http://mailman.nginx.org/mailman/listinfo/nginx
>>     _______________________________________________
>>     nginx mailing list
>>     nginx at nginx.org <mailto:nginx at nginx.org>
>>     http://mailman.nginx.org/mailman/listinfo/nginx
>>
>>
>> _______________________________________________
>> nginx mailing list
>> nginx at nginx.org
>> http://mailman.nginx.org/mailman/listinfo/nginx
>
> _______________________________________________
> nginx mailing list
> nginx at nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.nginx.org/pipermail/nginx/attachments/20200528/ac54550f/attachment-0001.htm>


More information about the nginx mailing list