Skip to content

bagisto/bagisto-varnish

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

30 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Varnish Integration for Bagisto

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.

About

Varnish setup for Bagisto.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 2

  •  
  •