Setup Statamic Static Caching for super fast websites
Setting up Static Caching in Statamic isn't too hard and brings a huge performance boost. Here are the steps I had to take to enable it both locally with Laravel Valet and on a production server managed through Laravel Forge.
Enable and configure Nginx
- Enable Static caching by setting
STATAMIC_STATIC_CACHING_STRATEGY=full
in.env
- Add the following directive to Nginx config
location / {
try_files /static${uri}_${args}.html $uri /index.php?$args;
}
- Laravel Forge provides easy access to a site's Nginx config. On my local Valet dev environment I had to first run
valet secure
because to run a site with https Valet creates a config file in~/.config/valet/Nginx
. This can then be used to add thetry_files
rule (under a weird location, likelocation /41c270e4-5535-4daa-b23e-c269744c2f45/
. This exists twice, I added it to both, no idea if that's required). Don't forget to updateAPP_URL
in.env
and flush the config cache
Clear and warm the static caches regularly
For sites that have dynamic content such as scheduled publishing or filtering by date, it makes sense to rebuild the static cache frequently.
The commands to do so are
php please static:clear
php please static:warm
We can add those to Laravel's scheduler (related: Setting Up Job Scheduling for Statamic )by adding the following to the Kernel
class in app/Console/Kernel.php
:
/**
* Define the application's command schedule.
*
* @param \\Illuminate\\Console\\Scheduling\\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
// $schedule->command('cache:clear')->daily();
// $schedule->command('config:cache')->daily();
// $schedule->command('route:cache')->daily();
// $schedule->command('statamic:stache:warm')->daily();
$schedule->command('statamic:static:clear')->dailyAt('03:00');
$schedule->command('statamic:static:warm')->dailyAt('03:00');
}
daily
runs at midnight, while dailyAt
can be given any time of the day.
All that is left to do is to set up a Cronjob that calls php /home/forge/mysite.tld/artisan schedule:run
every minute:
