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.
STATAMIC_STATIC_CACHING_STRATEGY=full
in .env
location / {
try_files /static${uri}_${args}.html $uri /index.php?$args;
}
valet secure
, because to run a site with https it create a config file in ~/.config/valet/Nginx
. This can be used to add the try_files
rule (under a weird location like location /41c270e4-5535-4daa-b23e-c269744c2f45/
. This exists two times, I added it to both, no idea if that’s required). Don’t forget to update APP_URL
in .env
and flush the config cachelocation / {
try_files /static/${host}${uri}_${args}.html $uri /index.php?$args;
}
For sites that have dynamic like 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 in Statamic by adding the following to the Kernel
class in app/Console/Kernel.php
:
/**
* Define the application's command schedule.
*
* @param IlluminateConsoleSchedulingSchedule $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
php please static:clear && php please static:warm