bagisto/bagisto-varnish

A Bagisto package that integrates Varnish Cache for enhanced performance with full-page caching and dynamic content handling.

v1.1.0 2025-09-29 14:14 UTC

This package is auto-updated.

Last update: 2025-09-30 09:08:18 UTC


README

This package integrates Varnish Cache with Bagisto to boost site performance by delivering cached pages quickly, while still supporting dynamic components through ESI (Edge Side Includes) or AJAX-based dynamic views.

πŸ“Œ Features

  • ⚑ Full-page caching via Varnish
  • πŸ”„ Automatic cache purging on product, category, or content updates
  • πŸ” ESI support for dynamic blocks
  • πŸ–± AJAX-based dynamic view loading for improved Core Web Vitals
  • πŸ›  Artisan commands for cache management
  • πŸ–₯ Admin tools for purging cache & exporting VCL
  • 🎨 Theme-ready Blade components
  • πŸ›‘ Middleware for cache headers (cacheable & non-cacheable routes)

πŸ”„ Request Flow

image

Explanation:

  • 443 (HTTPS) β†’ Nginx handles SSL termination and forwards traffic.
  • 80 (HTTP) β†’ Varnish Proxy caches and serves pages, or passes the request to the backend.
  • 8080 β†’ Bagisto (Laravel app) generates fresh content when needed.

Flow Summary: Browser β†’ Nginx β†’ Varnish Proxy β†’ Bagisto β†’ Response (cached or fresh)

πŸ“¦ Installation

1. Install via Composer

composer require bagisto/bagisto-varnish

2. Register the Service Provider

In bootstrap/providers.php:

Note: Autoloading via Composer’s package auto-discovery is not possible for this provider. The registry order mattersβ€”VarnishServiceProvider must be listed after the Shop package or at the end of the providers array. Auto-discovery would load it too early, which can cause issues.

'providers' => [
    Webkul\Varnish\Providers\VarnishServiceProvider::class,
],

3. Publish Assets & Config

php artisan vendor:publish --provider="Webkul\Varnish\Providers\VarnishServiceProvider"

βš™οΈ Varnish Server Configuration

  1. Install Varnish 6.x on your server.

  2. Replace /etc/varnish/default.vcl with the provided file:

    Varnish/vcls/6.0.vcl
    
  3. Restart Varnish:

    sudo systemctl restart varnish

🎨 Theme Integration

You can integrate dynamic content in two ways:

1 – Define Dynamic Views / Fragments

In config/varnish.php, define a key (identifier) and its corresponding Blade view path:

return [
    'esi' => [
        'views' => [
            ...

            'customer-desktop-dropdown' => 'varnish::shop.components.layouts.header.desktop.customer-dropdown',

            ...
        ]
    ],
];
  • Key β†’ Used in ESI or AJAX call (customer-desktop-dropdown)
  • Path β†’ Full Blade view path to render (varnish::...)

2 – ESI Include

<esi:include src="/esi?tag=customer-desktop-dropdown" />
  • Injects content at the Varnish level (server-side).
  • Appears immediately on page load.
  • May affect LCP/FCP if the backend is slow.

3 – AJAX Dynamic View (Recommended for LCP)

<x-varnish::dynamic-view view="customer-desktop-dropdown" />
  • Loads via AJAX after user interaction.
  • Improves LCP/FCP.
  • Ideal for non-critical dropdowns, modals, and menus.

πŸ—‚ Cache-Control Headers

For routes that should NOT be cached by Varnish:

Cache-Control: no-cache, no-store, must-revalidate

For routes that should be cached:

Cache-Control: public, max-age=604800, s-maxage=604800

(Example: 7 days)

Middleware for Cache Headers in Bagisto

We’ve created a middleware Webkul\Varnish\Http\Middleware\VarnishCache to handle cache headers.

Attach it to routes like this:

Route::get('/', [HomeController::class, 'index'])
    ->name('shop.home.index')
    ->middleware('cache.response');

πŸ›  UI Configuration (Export VCL)

Navigate to: Admin β†’ Configuration β†’ Full Page Cache β†’ Configuration

Select Varnish as the cache application, then provide the following:

  1. Access List – IPs allowed to purge the cache (e.g., localhost).
  2. Varnish Host URL – Varnish server IP and port for purging/banning cache via UI.
  3. Backend Host URL – Laravel Bagisto server IP used in the exported VCL.
  4. Backend Host Port – Laravel Bagisto server port used in the exported VCL.
  5. Grace Period – Duration for serving stale content if the backend is slow or unavailable.

πŸ›  Cache Management

Navigate to: Admin β†’ Configuration β†’ Full Page Cache β†’ Cache Management

  1. Purge by URLs – Enter full URLs (comma-separated) to clear specific cache entries. Paths and domains must match exactly.
  2. Purge Everything – Clears all cache entries from Varnish. Use with caution, as it may temporarily affect performance.

πŸ›‘ Automatic Cache Purging

The package automatically purges cache when:

  • Products, categories, pages, orders, reviews, refunds, or theme changes occur.

You can also manually trigger purging by adding your own events in EventServiceProvider and calling:

VarnishCache::forget($urls);

πŸ–₯ Admin Panel Tools

  • Purge Full Cache
  • Purge by URL
  • Export VCL

πŸš€ Best Practices

  • Use ESI for small, critical personalized blocks (e.g., login status, cart count).
  • Use AJAX dynamic views for non-critical interactive elements to improve Core Web Vitals.
  • Set Cache-Control headers with appropriate TTL values to control caching behavior.
  • Always test on a staging environment before deploying to production.
  • Monitor LCP, FCP, and TTFB after enabling Varnish.