Setup Statamic Static Caching

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 the try_files rule (under a weird location, like location /41c270e4-5535-4daa-b23e-c269744c2f45/. This exists twice, I added it to both, no idea if that's required). Don't forget to update APP_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

  1. php please static:clear

  2. 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: