How to enable leverage browser caching for nginx?

Follow

Comments

26 comments

  • Avatar
    Atthawut Prathumrat

    nginx not ngnix :P

  • Avatar
    Yulia Plokhotnikova

    @minzkung Thanks! I corrected it :)

  • Avatar
    Horacio Stolovitzky

    Is possible to enable globally?

  • Avatar
    Bulat Tsydenov

    @Horacio Stolovitzky, Hi! Please check this article again, it now contains the steps how to enable it globally.

  • Avatar
    Kironet (Edited )

    Hi, after implementing this(not globally), my dynamic website stopped showing styles, images, etc.., and loading has time increased from 1.5s to +-10s. What can cause that? 

  • Avatar
    Thanhkieu2022

    Leverage Browser Caching you should use the plugin: Leverage Browser Caching
    link down: https://wordpress.org/plugins/leverage-browser-caching/

    I used for website: http://www.thuocmaxman.vn/ and get 99/100 points. only ... / google analytics.js (2 hours)

  • Avatar
    Robert Asilbekov

    @Bogdan Dovgopol

    Instructions in the article cannot increase loading time.  It looks like some rewrite directives are missing. 

  • Avatar
    Ivan Postnikov

    @Thanhkieu2022

    Thank you for sharing this information. This is another way of enabling Leverage Browser Caching.

    Other Pleskians may find it useful.

  • Avatar
    Sharul Hafiz

    Tried on Wordpress. Wordpress is not compatible with this. Will result in 404.

  • Avatar
    Ivan Postnikov

    @Sharul

    For Wordpress try this plugin.

  • Avatar
    Miomir Besarabic

    @Thanhkieu2022, @Ivan Postnikov

    This plugin is only for Apache but this is article about leverage browser caching for nginx. Please don't post wrong information.

     

     

  • Avatar
    Ivan Postnikov

    @Miomir

    Thank you for the notice about the plugin.

    I have double checked it. It is applicable for Apache only.

     

  • Avatar
    Miomir Besarabic (Edited )

    This works if you add under Apache & nginx Settings in Additional nginx directives:

    Add Expires Headers

    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 365d;
    }
    location ~* \.(pdf|html|swf)$ {
    expires 90d;
    }

    Add Cache-Control Headers

    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 90d;
    add_header Cache-Control "public, no-transform";
    }

    I have tested with Wordpress and it works great. If Serve static files directly by nginx option is enabled in Domains > example.com > Apache & nginx Settings, it is required to disable it.

    Pingdom and GTmetrix honor this.

  • Avatar
    Markus Wernecke

    Thank you very much for all amazing and helpful articles.

    I use nginx only in subscription settings (service plans)

    Please, please, for all those who use this environment it would be the greatest gift if you could write also support articles for using

    only nginx

    Wish you all the best. PLESK is awesome...

  • Avatar
    Ivan Postnikov

    Hello @Markus!

    Thank you for the feedback.

    Sure, new articles are driven by demand. If there will be questions or issues regarding using Nginx only, the corresponding articles will be created.

  • Avatar
    Peter Shaw (Edited )

    This works well for my WordPress installation and sets the expires headers that I'm after, however URLs for "virtual files" that don't physically exist on the server in WordPress [such as robots.txt] now return a 404 page. I believe this is because no further Nginx processing takes place after the headers are set with the location directive.

    Much advice on the internet suggests the use of try_files directive but the solution I am looking for is more along the lines of "for any file that doesn't physically exist on the server, ask Apache for it". Is something along these lines possible?

    I give robots.txt as an example but the solution needs to be generic so it can also handle secure files that are stored outside of the webroot with rewriting carried out by Apache.

     

    ***EDIT***

    From digging into the NGINX docs I see that what I actually want is a nested location directive - the initial block is lifted from the default nginx config within plesk, the second block adds expires headers to relevant files:

    location / {
        proxy_pass http://77.68.75.xxx:7080;
        proxy_set_header Host             $host;
        proxy_set_header X-Real-IP        $remote_addr;
        proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header X-Accel-Internal /internal-nginx-static-location;
        access_log off;

        location ~* \.(js|jpg|jpeg|gif|png|css|tgz|gz|rar|bz2|doc|pdf|ppt|tar|wav|bmp|rtf|swf|ico|flv|woff|woff2|svg|ttf)$ {
            etag on;
            if_modified_since exact;
            add_header Pragma "public";
            add_header Cache-Control "max-age=1209600, public";
        }
    }

    I can test the above by manually editing the /vhosts/system/[domain]/conf/nginx.conf file and restarting nginx systemctl restart nginx.

    This directive can't be applied using the Additional Nginx Directives option within plesk as a location directive for / already exists in the template, so any changes will be overwritten each time nginx.conf is recreated. How/where can I amend the plesk nginx template so that the individual vhost conf files that are generated use this modified directive?

  • Avatar
    Alexandr Redikultsev

    Hello,  @Peter Shaw.

    Please try combining the directives with the ones specified in the following knowledge base article:

    A WordPress website on a Plesk server shows "404 Not Found" on all pages except index.php, when running on FPM by nginx

     

  • Avatar
    Lenor

    Any disadvantages to enable this for all Customers? 

    Does it make more CPU / RAM Load? 

  • Avatar
    Robert Asilbekov

    @Lenor

    > Does it make more CPU / RAM Load?

    No

    > Any disadvantages to enable this for all Customers?

    It might affect some customers websites. For example, if the content was changed but the web browser may keep using the old version from the local cache as the content is yet to be expired.

  • Avatar
    Tomasz Paluszkiewicz

    in your article about enabling gzip compression, you advise to create

    /etc/nginx/conf.d/gzip.conf 

    (which will be automatically picked up because of wildard include in nginx.conf)
    but in this article you advise creating

    /etc/nginx/conf.d/expires.global 

    and then adding include rule inside

    /usr/local/psa/admin/conf/templates/default/domain/nginxDomainVirtualHost.php

    why the difference? what are the (dis-)advantages of one approach over the other?

  • Avatar
    Robert Asilbekov

    @Tomasz Paluszkiewicz 

    Because "location" directive is not allowed in "http" context.

  • Avatar
    Tomasz Paluszkiewicz

    @Robert Asilbekov 

    but then, gzip compression could also be applied the same way as expiry rules, right?

  • Avatar
    Robert Asilbekov

    @Tomasz Paluszkiewicz 

    Correct, gzip compression could be also enabled this way. But it is better to enable gzip globally in "http" context and later it can be turned off for a particular subscription.

     

    Because gzip contexts are: httpserverlocationif in location

     

     

  • Avatar
    Alisa Kasyanova

    @Peter Shaw
    Hi! Please refer to our documentation here. You can edit nginx template, so the directive will be applied to all domains.

  • Avatar
    Peter Shaw (Edited )

    Thanks @Alisa Kasyanova,

    Created /usr/local/psa/admin/conf/templates/custom/domain/service/proxy.php and copied in the corresponding file from /templates/default. Added the following block below 'access_log off;':

    access_log off;
    <?php /** add expires headers where required. **/ ?>
                    location ~* \.(js|jpg|jpeg|gif|png|css|tgz|gz|rar|bz2|doc|pdf|ppt|tar|wav|bmp|rtf|swf|ico|flv|woff|woff2|svg|ttf)$ {
                    etag on;
                    if_modified_since exact;
                    add_header Pragma "public";
                    add_header Cache-Control "max-age=86400, public";
                    }

    Regenerate nginx configuration files with /usr/local/psa/admin/bin/httpdmng --reconfigure-all

    EDIT ***

    The above is along the right lines but it is not the correct solution to the issue as ther resulting nginx.conf file doesn't give the desired headers for all requests - some requests for virtual files are not passed on when they should be.

  • Avatar
    Alisa Kasyanova

    @Peter Shaw

    I suppose it is because the resulting nginx configuration file for a domain (you can check any, say, /etc/nginx/plesk.conf.d/vhosts/example.com.conf) has a location directive inside another location directive.

    Try to add lines starting from "location..." to /usr/local/psa/admin/conf/templates/custom/domain/nginxDomainVirtualHost.php . For example, before "<?php if (!$VAR->domain->physicalHosting->proxySettings['nginxTransparentMode'] " and reconfigure the files. Then check the /etc/nginx/plesk.conf.d/vhosts/example.com.conf) again: it should have the "location..." as a separate section.

    Hope it helps!

Please sign in to leave a comment.

Have more questions? Submit a request