Applicable to:
- Plesk for Linux
Question
How to enable leverage browser caching (cache expiration) for nginx?
Answer
Leverage browser caching for nginx can be enabled by adding directives for webserver. Check out the following "Requirements and limitations" before proceed with enabling.
Requirements and limitations:
- Depending on the type of content that is served, it might be required to enable caching for Apache too since different types of content is served by either nginx or Apache: How to enable leverage browser caching for Apache in Plesk
- The main conditions for enabling nginx leverage browser caching are:
1. Disabled Serve static files directly by nginx and Proxy mode options in Domains > example.com > Apache & nginx Settings.
(When it is enabled, the location directive is added to nginx configuration and further specified location directives (like in Additional nginx directives) with regular expressions will be ignored. Refer to official nginx documentation for details)
2. Website's docroot does not protected with password in Domains > example.com > Password-Protected Directories. - If Google PageSpeed Insights extension is used on the server and leverage browser caching for nginx is enabled globally, then the functionality of Google PageSpeed Insights is being broken.
Warning: Any customization made is done at your own will and risk and it is bound to be possibly overwritten by a Plesk update/upgrade process
Leverage browser caching can be enabled for a domain or server-wide.
-
Go to Domains > example.com > Apache & nginx Settings.
-
Check the Enable nginx caching checkbox, disable the Serve static files directly by nginx checkbox and click OK/Apply.
-
Log in to the server via SSH as root.
-
Create an additional nginx configuration file:
# touch /etc/nginx/conf.d/expires.global
-
Open this file using text editor and paste following directives into it:
CONFIG_TEXT: location ~* \.(js|jpg|jpeg|gif|png|css|tgz|gz|rar|bz2|doc|pdf|ppt|tar|wav|bmp|rtf|swf|ico|flv|txt|woff|woff2|svg)$ {
etag on;
if_modified_since exact;
add_header Pragma "public";
add_header Cache-Control "max-age=31536000, public";
} -
Create a directory for custom configuration templates:
# mkdir -p /usr/local/psa/admin/conf/templates/custom/domain/
-
Copy default nginx template to the newly created directory:
# cp -p /usr/local/psa/admin/conf/templates/default/domain/nginxDomainVirtualHost.php /usr/local/psa/admin/conf/templates/custom/domain/
-
Open
/usr/local/psa/admin/conf/templates/custom/domain/nginxDomainVirtualHost.phpwith text editor and add the following line in the bottom of the file:CONFIG_TEXT: include /etc/nginx/conf.d/expires.global;
So, the bottom of
/usr/local/psa/admin/conf/templates/custom/domain/nginxDomainVirtualHost.phpfile should look like:CONFIG_TEXT: . . .
include /etc/nginx/conf.d/expires.global;
<?php if (is_file($VAR->domain->physicalHosting->customNginxConfigFile)): ?>
include "<?php echo $VAR->domain->physicalHosting->customNginxConfigFile ?>";
<?php endif ?>
}As a result, all newly created domains will have leverage browser caching automatically enabled.
-
In order to apply this to all existing domains, it is required to reconfigure all the domains with the following command:
# /usr/local/psa/admin/bin/httpdmng --reconfigure-all
Warning: Consider running the above command during the maintenance time as it may cause some downtime for websites.
Note: the aforementioned directives will set etag header. That means that the content will be stored on the client side and not be refreshed until it is modified on the server. Alternatively, the expiration time can be specified explicitly using the following directives:
CONFIG_TEXT: location ~* \.(js|jpg|jpeg|gif|png|css|tgz|gz|rar|bz2|doc|pdf|ppt|tar|wav|bmp|rtf|swf|ico|flv|txt|woff|woff2|svg)$ {
expires 30d;
add_header Pragma "public";
add_header Cache-Control "public";
}
Where expires directive means how long cache will be stored. The value can be specified in days (expires 30d), hours (expires 2h) or minutes (expires 15m).
Comments
After applying the server-wide fix and rebuilding the configuration files, everything seems ok; however, when running the Webserver Configurations Troubleshooter again, it shows a failed error - this is very misleading, as the details output actually shows nothing wrong:
Checking nginx configuration ........................................ [OK]Checking for custom configuration templatesCustom template /usr/local/psa/admin/conf/templates/custom/domain/nginxDomainVirtualHost.php has been foundSome custom configuration templates have been found.The custom templates have higher priority than default templates in case of configs generation.Please check documentation for detailshttps://docs.plesk.com/current/redirect.html?book=advanced-administration-guide-linux&page=68693.htm[WARNING]It might be worth not throwing an error in this instance, or at least issuing a warning instead.
Same goes for the Plesk Repair Kit:
Checking for custom configuration templates Some custom configuration templates have been found. The custom templates have higher priority than default templates in case of configs generation Please check documentation for details:https://docs.plesk.com/current/redirect.html?book=advanced-administration-guide-linux&page=68693.htmIt shouldn't be flagged as an issue if its operational.
The documentation link is irrelevant in both cases as well.
Please sign in to leave a comment.