 #  Varnish and Joomla 

 

  ![Network Topology](https://cdn.richeyweb.com/images/articles/varnish-nginx-joomla/topology.webp)    - [The Joomla Forum post in question...](https://forum.joomla.org/viewtopic.php?f=835&t=1013670&p=3746913)
 


I made a statement in the [Joomla](/blog/hosting/cron-vs-joomla-lazy-scheduler-and-webcron "Cron vs Joomla Lazy Scheduler and WebCron") forums offering to describe how I use [Varnish](/blog/development/server-timing-for-geoip-data-delivery-to-achieve-gdpr-compliance "Server-Timing for GeoIP Data Delivery to Achieve GDPR Compliance") and Joomla together. Well...today is the day! Due to an unforeseen summer cold - I'm not doing the outside work that I thought I'd be doing, so it's time to make good on that promise.

What you see in the image above is a generic (simplified) version of the topology I use for my high traffic sites. There might be more than one [load balancer](/blog/hosting/tracking-ai-crawlers-with-nginx-and-google-analytics-4 "Tracking AI Crawlers with NGINX and Google Analytics 4"), maybe more than one Varnish [server](/blog/development/windownamestore-a-privacy-friendly-volatile-storage-solution-for-web-developers "WindowNameStore: A Privacy-Friendly Volatile Storage Solution for Web Developers"), more than one internal NGINX or [PHP](/blog/development/one-sh-tty-email-that-made-me-finally-do-something-about-spam "One Sh*tty Email That Made Me Finally Do Something About Spam") server, but this is the general layout. I like to put all of the applications behind a [firewall](/blog/personal/someone-elses-code "Someone Else’s Code"), in a private network, and leave only the load balancers accessible to the Internet. This is just my preference, a configuration that has served me well over the years. By no means is this the only way to do it, it's just what works for me and it's an easy configuration available on most server [hosting](/test-article "Shader BG Test") platforms.

## Simplified Varnish and Joomla

I am NOT going to impose a 7-server configuration on you. Varnish and Joomla [setup](/blog/development/the-humbling-art-of-free-software "The Humbling Art of Free Software") can be even further simplified to just 2 servers. In this way, I can more easily convey necessary configurations and required software. I'm going to show the Ubuntu 24.04 version of this software stack. Your environment may be slightly different (in process or package name) if you're using something other than Ubuntu. You'll have to rely on your own knowledge to set up the server OS, I'm only dealing with the aspects directly related to Varnish and Joomla!

Everyone runs SSL these days, so I feel it needs to be mentioned that the certificate is installed on the load balancer, and all communication between the load balancer and Joomla or Varnish and Joomla is on port 80. The load balancer handles the encrypted traffic with the public. Joomla is configured to use the "behind a load balancer" setting in global configuration.

To make the config files more clear, I'm giving each server an entry in /etc/hosts. This way I can refer to meaningful names like varnish and liveserver instead of IP addresses. You could easily use IP addresses if you wanted.

### /etc/hosts

 ```
127.0.0.1    varnish<br></br>192.168.1.2  liveserver
```

### Load Balancer + Varnish

This could be 2 separate servers, but for the purposes of this howto - we can squeeze them into one without any issues. This is the required package list (using Ubuntu package names):

- varnish
- nginx
- libnginx-mod-http-headers-more-filter
 
Yup, that's it. Configs will be detailed later.

### Linux NGINX MySQL PHP

As with the load balancer server, this could be many different servers, and if you wanted to use Apache instead of NGINX, you could do that - but you'd lose some of the load balancer magic..no big deal. Plenty of guides exist to help you configure the basic stack.

What is / why NGINX? I prefer NGINX (pronounced Engine-X) to Apache. I made the switch years ago, and found that it's faster and easier to configure and maintain.

Here's the required package list (again, using Ubuntu package names):

- nginx
- mariadb-server
- php-fpm
- php-mysqlnd
- php-redis
- php-json
- php-simplexml
- php-dom
- php-zip
- php-gd
- php-intl
 
This is a pretty standard [installation](/blog/development/generator-tag-claim-your-joomla-sites "Generator Tag: Claim Your Joomla Sites") for Joomla on LNMP stack.

### Some Basic Rules

Before we get started, some basic rules about setting up this Varnish and Joomla site tech stack. You'll need to be very careful about forms. If a form resides on a cached page, it's not going to work because the cached CSRF token won't be valid anymore. That means no login modules, at least on pages that can be cached.

Any page that submits data or displays any kind of dynamic result needs to be non-cached. Search results pages, user profiles, contact forms... It's a pain in the ass sometimes, but your site will be fast.

Next, we'll start with configuration on the load balancer.

## NGINX Load Balancer

The load balancer is the only server with services listening on the Internet. This requires specific configuration on the OTHER servers to prevent them from listening on public networks that may be attached.

Many writeups exist explaining now to turn NGINX into a load balancer. I utilize snippets to define potential destinations based on accessed locations in NGINX configuration. This way I can re-use the snippets in multiple locations.

### /etc/nginx/snippets/ssl.conf

Out of scope for this how-to, but it keeps SSL configurations neatly out of site configurations. Maybe I'll write another article explaining how to get an A+ with SSL Labs.

### /etc/nginx/snippets/varnish.conf

 ```

proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header REMOTE_ADDR $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_hide_header X-Powered-By;
more_clear_headers Server;
more_clear_headers X-Logged-In;
more_clear_headers Via;
more_clear_headers X-Varnish;
more_clear_headers X-Cache;
more_clear_headers X-Cache-Hits;
proxy_read_timeout 300; 
proxy_pass http://upstream_varnish;
proxy_redirect http://upstream_varnish https://$host;

```

### /etc/nginx/snippets/liveserver.conf

 ```

proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header REMOTE_ADDR $remote_addr; 
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://upstream_liveserver;
proxy_read_timeout 3600;
proxy_connect_timeout 300;
proxy_redirect http://upstream_liveserver https://$hostname; 
proxy_http_version 1.1; 
proxy_set_header Connection "";

```

### /etc/nginx/sites-available/default.conf

 ```

# port 80 forwards all traffic to 443
server { 
       listen 80 default_server; 
       listen [::]:80 default_server; 
       server_name www.yourdomain.com yourdomain.com;

       location / {
                return         301 https://$host$request_uri;
       }
}
server { 
       listen 443 ssl http2; 
       listen [::]:443 ssl http2;
       server_name www.yourdomain.com yourdomain.com;

       ssl_certificate /path/to/your/fullchain.pem;
       ssl_certificate_key /path/to/your/privkey.pem;
       include /etc/nginx/snippets/ssl.conf;

       upstream upstream_liveserver {<br></br>               least_conn; #only if your backend servers are NGINX
               server liveserver weight=5;
#               server liveserver1;
#               server liveserver2 backup;
       }

       upstream upstream_varnish {
               server varnish weight=5;
#               server varnish1;
#               server varnish2 backup;
       }

       location / {
               include /etc/nginx/snippets/varnish.conf;
       }
       location ~ ^/administrator {
               include /etc/nginx/snippets/liveserver.conf;
       }
}

```

Though simplified for this write-up, this is the basic configuration of the load balancer. It's not anything special, or complicated. Populate your upstream servers, modify the path to your certificates, update the server name, maybe add some access and error logs and you're good to go.

It might look like ALL traffic outside of /administrator is being cached with Varnish, but we'll handle cached and non-cached URLs in the next step.

Creating an NGINX configuration file on the actual backend server is well-documented elsewhere.

## Varnish Server / Caching Proxy

Probably the biggest reason Varnish isn't seen more often in Joomla setups is its configuration. Varnish VCL configuration files are complex and large but they're really not that complicated.

I started with a configuration created by fevangelou titled: [The perfect Varnish configuration for WordPress, Joomla, Drupal &amp; other (common) CMS based websites](https://gist.github.com/fevangelou/84d2ce05896cab5f730a). I found that configuration to be less than ideal for Joomla. The limitations are pretty extensive, but I'll sum them up in just a few bullets:

- Config contains Wordpress and Drupal specific configs
- List of pages to NOT [cache](/white-hat-seo/technical-seo "Technical SEO") is static
- Not well documented 
    - It has comments, but the Wordpress, Drupal, and Joomla configs are all mixed together. I only care about the Joomla configs.
 
None of that is a criticism for the original author - their config was my starting point.

Using my (free) [System - Expires Headers](/software/joomla/plugins/system-expires-headers) [plugin](/blog/development/bug-reports-a-developers-best-friend-not-a-burden "Bug Reports: A Developer's Best Friend, Not a Burden"), we can reduce the non-caching page list to just a few entries that are universal to Joomla installations. Using the plugin to control cached pages is discussed below the Varnish config.

### /etc/varnish/default.vcl

Um... I'm not putting the whole config file here. Even pared down, it's still over 300 lines long. I'll cover the highlights here, and just let you download the config file. Remember to edit it for your environment!!!

[default.vcl](/images/articles/varnish-nginx-joomla/default.vcl)

There are some basic configs that I'm just going to breeze over. For the most part, there are 4 sections you'll want to understand. Let's breeze over those bits first.  
  
These are commented, so you can pretty much read what each bit does in the comments above it.

- vcl - defines which version of Varnish your config is intended for.
- import - allows you to bring in additional functionality
- backend - allows you to define the source where Varnish retrieves its content
- director - useful if you have multiple backends and wish to load-balance
 
#### Action Sections

These are where the Varnish magic happens. This is also where you'll find the main differences between my configuration and that provided by fevangelou. I chose to focus on Joomla configuration, and to simplify the configuration using a plugin to define non-cached pages. This removed dozens of lines from the config file.

I'm not going into detail, this is a broad overview of what's happening in each section. The sections are heavily commented, and should be relatively self-explanatory.

When you see the following commands, this is what they mean:

- return(pass) - tells Varnish to pass the request to the backend rather than try and serve it from cache.
- return(pipe) - means Varnish stops inspecting each request, and just sends bytes straight to the backend.
- return(hash) - tell Varnish to deliver content from cache even if the request otherwise indicates that the request should be passed.
- return(deliver) - send the page to the browser
 
##### sub vcl\_recv

This section examines the incoming request and determines what to do with it. We do fun things in this section in preparation for the [response](/blog/development/canonical-http-headers-for-rss-feeds "Canonical HTTP Headers for RSS Feeds"). One of the first things is attaching the client IP address to a special header in order to hand it over to Joomla. We also strip out [cookies](/blog/development/gdpr-is-getting-a-facelift-and-im-not-crying-over-it "GDPR is Getting a Facelift - And I’m Not Crying Over It") that are unnecessary.

We also inspect several header and cookie values to determine if the request should NOT be served from cache. I opt to ALWAYS serve fresh pages to users who are logged in, so we look for the joomla\_user\_state cookie and act upon it if it's found

Likewise, there are some URLs that will never get cached - 2, to be precise. /administrator and [com\_ajax](/joomla-techniques/securing-joomla "Securing Joomla"). If the page is requested with XMLHttpRequest, it's also some kind of AJAX call, and those aren't cached.

Basically, you'll want to take a peek at this section and determine if there's something it's doing that you don't want it to do (or something it's NOT doing, perhaps another URL or cookie to pay attention to.)

The good news is, I stripped out all of the WP and Drupal stuff, so if it's in there - it's only stuff that's Varnish and Joomla related.

##### sub vcl\_backend\_response

Super similar to the previous section, this section deals with the response from the backend servers. There are various details you'll want to read through, but here are the highlights:

- We don't cache errors (5xx status codes)
- We don't cache if the page has ANY negative caching headers (no-store, no-cache, must-revalidate, Pragma=no-cache).
- The same pages that aren't allowed in the previous section aren't allowed to be cached here.
- POST requests are not cached
- Cookies are unset for guests to prevent them from being stored with cached pages
- We set some cache duration values
 
Again, I stripped out anything to do with WP or Drupal - the only things left in this section is Varnish and Joomla related.

##### sub vcl\_deliver

Final checks, setting Expires headers if they aren't already set, some cache headers (that the load balancer removes), and finally sending the response to the browser.

## Cached Page Control

Varnish and Joomla don't naturally play nice. Varnish wants to cache everything, and requires a list of pages to NOT cache, and there isn't really a mechanism within Joomla to indicate which pages should be cached and which not. It occurred to me that I wrote a plugin to do that exact thing - but with browser cache. So why not adapt that for use in Varnish? I mean, Varnish can inspect headers...

### Varnish and Joomla controlled by [System - Expires Headers](/software/joomla/plugins/system-expires-headers)

My plugin is pretty simple to use. You can define any number of cache configurations and assign those to menu items. More specifically, you can define which pages NOT to cache with a few simple settings and menu item selections. To be extremely specific, these are the settings to use in order to trigger my version of Varnish config to NOT cache a page:

- Expires: Off
- Cache-Control: On
- Cacheable: no-cache
- Check all 3: no-store, must-revalidate, and Pragma: no-cache
 
Then just apply it to as many of your menu items as need to be NOT cached. One thing to remember, if the page is ONLY visible to logged in users, it will never be cached - so no need to choose those menu items.

Varnish and Joomla has never been easier.

## Joomla Cache

This setup eliminates the need to use Joomla's Page Cache plugin. The ability to set global expires headers using the Expires Headers plugin, and Varnish level caching removes the caching burden from Joomla. One less plugin means less activity and faster dynamic page loads. This doesn't do anything to other cached content types (module cache, plugin cache, etc).

## Final Thoughts

Is this the absolute best configuration for Varnish and Joomla? Absolutely not. This is as much a starting point for me as it is for you. Maybe I have a little bit of a head start, but certainly there is someone smarter out there willing to devote some time to making this better. I sincerely hope they're willing to share their work as I have done here.

I am open to both suggestions and criticisms. By all means, tell me what I did wrong (or right, if you feel generous). I'm certain that there are improvements to be made and I'm not too proud to ask for them.

Good luck, and may your sites be super fast.



- [      email ](mailto:?subject=Varnish+and+Joomla&body=https%3A%2F%2Fwww.richeyweb.com%2Fblog%2Fhosting%2Fvarnish-and-joomla)
- [      facebook ](https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fwww.richeyweb.com%2Fblog%2Fhosting%2Fvarnish-and-joomla)
- [      x-twitter ](https://twitter.com/intent/tweet?text=Varnish+and+Joomla%3A+https%3A%2F%2Fwww.richeyweb.com%2Fblog%2Fhosting%2Fvarnish-and-joomla)
- [      linkedin ](http://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fwww.richeyweb.com%2Fblog%2Fhosting%2Fvarnish-and-joomla&title=Varnish+and+Joomla&summary=I+made+a+statement+in+the+Joomla+forums+offering+t...)
- [      pinterest ](http://pinterest.com/pin/create/button/?url=https%3A%2F%2Fwww.richeyweb.com%2Fblog%2Fhosting%2Fvarnish-and-joomla&media=https%3A%2F%2Fcdn.joomla.org%2Fimages%2Fjoomla-org-og.jpg&description=Varnish+and+Joomla)
 


 

   [  Previous article: unavailable\_after White-Hat SEO Hack Might Be Paying Off   unavailable\_after White-Hat SEO Hack Might Be Paying Off ](/blog/hosting/unavailable-after-white-hat-seo-hack-might-be-paying-off) [  Next article: Microsoft Deliverability - SendGrid and Blacklists  Microsoft Deliverability - SendGrid and Blacklists  ](/blog/hosting/microsoft-deliverability-sendgrid-and-blacklists)  

##### We Value Your Privacy

 

We use cookies to enhance your experience and for traffic analysis. By continuing to visit this site you agree to our use of cookies.

[Privacy Policy](/privacy-policy)

 Details 

###### Google Tag Manager Items

- Ad Storage
- Ad User Data
- Ad Personalization
- Analytics Storage
- Functionality Storage
- Personalization Storage
- Security Storage
 
 

 

 

 

 

 Decline Accept
```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://www.richeyweb.com/#organization","name":"RicheyWeb","url":"https://www.richeyweb.com/","logo":{"@type":"ImageObject","url":"https://www.richeyweb.com/images/logo/richeyweb.svg","contentUrl":"https://www.richeyweb.com/images/logo/richeyweb.svg","width":{"@type":"QuantitativeValue","value":38,"unitCode":"PX"},"height":{"@type":"QuantitativeValue","value":38,"unitCode":"PX"},"@id":"https://www.richeyweb.com/#logo"},"image":{"@id":"https://www.richeyweb.com/#logo"},"sameAs":["https://x.com/ComRicheyweb","https://www.facebook.com/RicheyWebDev/","https://www.youtube.com/channel/UCxnVG8BwOvQRO7hVqNX7T2g","https://community.joomla.org/service-providers-directory/listings/115:richeyweb.html"],"description":"RicheyWeb is a custom software developer specializing in Joomla extensions.","ContactPoint":[{"@type":"ContactPoint","url":"https://www.richeyweb.com/contact-us","telephone":"903-873-8460","contactType":"Owner/Administrator","areaServed":["United States",{"@type":"Country","name":"United States","sameAs":["https://en.wikipedia.org/wiki/United_States","https://www.wikidata.org/wiki/Q30","https://g.co/kg/m/09c7w0"]},"European Union",{"@type":"AdministrativeArea","name":"European Union","sameAs":["https://en.wikipedia.org/wiki/European_Union","https://www.wikidata.org/wiki/Q458","https://g.co/kg/m/0_6t_z8"]},"United Kingdom",{"@type":"Country","name":"United Kingdom","sameAs":["https://en.wikipedia.org/wiki/United_Kingdom","https://www.wikidata.org/wiki/Q145","https://g.co/kg/m/07ssc"]},"Australia",{"@type":"Country","name":"Australia","sameAs":["https://en.wikipedia.org/wiki/Australia","https://www.wikidata.org/wiki/Q408","https://g.co/kg/m/0chghy"]},"Canada",{"@type":"Country","name":"Canada","sameAs":["https://en.wikipedia.org/wiki/Canada","https://www.wikidata.org/wiki/Q16","https://g.co/kg/m/0d060g"]},"Russia",{"@type":"Country","name":"Russia","sameAs":["https://en.wikipedia.org/wiki/Russia","https://www.wikidata.org/wiki/Q159","https://g.co/kg/m/06bnz"]},"China",{"@type":"Country","name":"China","sameAs":["https://en.wikipedia.org/wiki/China","https://www.wikidata.org/wiki/Q148","https://g.co/kg/m/0d05w3"]}],"availableLanguage":"en"},{"@type":"ContactPoint","url":"https://www.richeyweb.com/bugs","telephone":"903-873-8460","contactType":"Technical Support","areaServed":["United States",{"@type":"Country","name":"United States","sameAs":["https://en.wikipedia.org/wiki/United_States","https://www.wikidata.org/wiki/Q30","https://g.co/kg/m/09c7w0"]},"European Union",{"@type":"AdministrativeArea","name":"European Union","sameAs":["https://en.wikipedia.org/wiki/European_Union","https://www.wikidata.org/wiki/Q458","https://g.co/kg/m/0_6t_z8"]},"United Kingdom",{"@type":"Country","name":"United Kingdom","sameAs":["https://en.wikipedia.org/wiki/United_Kingdom","https://www.wikidata.org/wiki/Q145","https://g.co/kg/m/07ssc"]},"Australia",{"@type":"Country","name":"Australia","sameAs":["https://en.wikipedia.org/wiki/Australia","https://www.wikidata.org/wiki/Q408","https://g.co/kg/m/0chghy"]},"Canada",{"@type":"Country","name":"Canada","sameAs":["https://en.wikipedia.org/wiki/Canada","https://www.wikidata.org/wiki/Q16","https://g.co/kg/m/0d060g"]},"Russia",{"@type":"Country","name":"Russia","sameAs":["https://en.wikipedia.org/wiki/Russia","https://www.wikidata.org/wiki/Q159","https://g.co/kg/m/06bnz"]},"China",{"@type":"Country","name":"China","sameAs":["https://en.wikipedia.org/wiki/China","https://www.wikidata.org/wiki/Q148","https://g.co/kg/m/0d05w3"]}],"availableLanguage":"en"}],"knowsAbout":["Computer programming",{"@type":"Thing","name":"Computer programming","sameAs":["https://en.wikipedia.org/wiki/Computer_programming","https://www.wikidata.org/wiki/Q80006","https://g.co/kg/m/01mf_"]},"PHP",{"@type":"Thing","name":"PHP","sameAs":["https://en.wikipedia.org/wiki/PHP","https://www.wikidata.org/wiki/Q59","https://g.co/kg/m/060kv"]},"JavaScript",{"@type":"Thing","name":"JavaScript","sameAs":["https://en.wikipedia.org/wiki/JavaScript","https://www.wikidata.org/wiki/Q2005","https://g.co/kg/m/02p97"]},"arduino","Computer forensics",{"@type":"Thing","name":"Computer forensics","sameAs":["https://en.wikipedia.org/wiki/Computer_forensics","https://www.wikidata.org/wiki/Q878553","https://g.co/kg/m/02wxbd"]},"White hat",{"@type":"Thing","name":"White hat","sameAs":["https://en.wikipedia.org/wiki/White_hat_(computer_security)","https://www.wikidata.org/wiki/Q7995625","https://g.co/kg/m/03ns_5"]},"Search engine optimization",{"@type":"Thing","name":"Search engine optimization","sameAs":["https://en.wikipedia.org/wiki/Search_engine_optimization","https://www.wikidata.org/wiki/Q180711","https://g.co/kg/m/019qb_"]},"Search engine marketing",{"@type":"Thing","name":"Search engine marketing","sameAs":["https://en.wikipedia.org/wiki/Search_engine_marketing","https://www.wikidata.org/wiki/Q846132","https://g.co/kg/m/06mw8r"]},"Digital marketing",{"@type":"Thing","name":"Digital marketing","sameAs":["https://en.wikipedia.org/wiki/Digital_marketing","https://www.wikidata.org/wiki/Q1323528","https://g.co/kg/g/122hcnps"]},"Web hosting service",{"@type":"Thing","name":"Web hosting service","sameAs":["https://en.wikipedia.org/wiki/Web_hosting_service","https://www.wikidata.org/wiki/Q5892272","https://g.co/kg/m/014pz4"]},"Email hosting service",{"@type":"Thing","name":"Email hosting service","sameAs":["https://en.wikipedia.org/wiki/Email_hosting_service","https://www.wikidata.org/wiki/Q5368818","https://g.co/kg/m/09w60m"]},"Internet hosting service",{"@type":"Thing","name":"Internet hosting service","sameAs":["https://en.wikipedia.org/wiki/Internet_hosting_service","https://www.wikidata.org/wiki/Q1210425","https://g.co/kg/m/09w5yw"]},"Virtual hosting",{"@type":"Thing","name":"Virtual hosting","sameAs":["https://en.wikipedia.org/wiki/Virtual_hosting","https://www.wikidata.org/wiki/Q588365","https://g.co/kg/m/024mvh"]},"Web performance",{"@type":"Thing","name":"Web performance","sameAs":["https://en.wikipedia.org/wiki/Web_performance","https://www.wikidata.org/wiki/Q7978612","https://g.co/kg/m/0gfj3f1"]},"Web content management system",{"@type":"Thing","name":"Web content management system","sameAs":["https://en.wikipedia.org/wiki/Web_content_management_system","https://www.wikidata.org/wiki/Q45211","https://g.co/kg/m/0615s2"]},"Content management system",{"@type":"Thing","name":"Content management system","sameAs":["https://en.wikipedia.org/wiki/Content_management_system","https://www.wikidata.org/wiki/Q131093","https://g.co/kg/m/0k23c"]},"General Data Protection Regulation",{"@type":"Thing","name":"General Data Protection Regulation","sameAs":["https://en.wikipedia.org/wiki/General_Data_Protection_Regulation","https://www.wikidata.org/wiki/Q1172506","https://g.co/kg/m/0pk_7xs"]},"SERP",{"@type":"Thing","name":"SERP","sameAs":["https://en.wikipedia.org/wiki/SERP","https://www.wikidata.org/wiki/Q2205811","https://g.co/kg/g/11c5szp7kc"]},"Artificial intelligence",{"@type":"Thing","name":"Artificial intelligence","sameAs":["https://en.wikipedia.org/wiki/Artificial_intelligence","https://www.wikidata.org/wiki/Q11660","https://g.co/kg/m/0mkz"]},"Prompt engineering",{"@type":"Thing","name":"Prompt engineering","sameAs":["https://en.wikipedia.org/wiki/Prompt_engineering","https://www.wikidata.org/wiki/Q108941486","https://g.co/kg/g/11p6kpgt_n"]},"E-learning",{"@type":"Thing","name":"E-learning","sameAs":["https://en.wikipedia.org/wiki/E-learning_(theory)","https://www.wikidata.org/wiki/Q182250","https://g.co/kg/g/122czm1f"]},"Sharable Content Object Reference Model",{"@type":"Thing","name":"Sharable Content Object Reference Model","sameAs":["https://en.wikipedia.org/wiki/Sharable_Content_Object_Reference_Model","https://www.wikidata.org/wiki/Q827811","https://g.co/kg/m/06_40"]},"Experience API",{"@type":"Thing","name":"Experience API","sameAs":["https://en.wikipedia.org/wiki/Experience_API","https://www.wikidata.org/wiki/Q7807728","https://g.co/kg/g/1yw9ktxr8"]},"Joomla",{"@type":"Thing","name":"Joomla","sameAs":["https://en.wikipedia.org/wiki/Joomla","https://www.wikidata.org/wiki/Q13167","https://g.co/kg/m/07qb81"]},"Nginx",{"@type":"Thing","name":"Nginx","sameAs":["https://en.wikipedia.org/wiki/Nginx","https://www.wikidata.org/wiki/Q306144","https://g.co/kg/m/02qft91"]},"MySQL",{"@type":"Thing","name":"MySQL","sameAs":["https://en.wikipedia.org/wiki/MySQL","https://www.wikidata.org/wiki/Q850","https://g.co/kg/m/04y3k"]}],"areaServed":["United States",{"@type":"Country","name":"United States","sameAs":["https://en.wikipedia.org/wiki/United_States","https://www.wikidata.org/wiki/Q30","https://g.co/kg/m/09c7w0"]},"European Union",{"@type":"AdministrativeArea","name":"European Union","sameAs":["https://en.wikipedia.org/wiki/European_Union","https://www.wikidata.org/wiki/Q458","https://g.co/kg/m/0_6t_z8"]},"United Kingdom",{"@type":"Country","name":"United Kingdom","sameAs":["https://en.wikipedia.org/wiki/United_Kingdom","https://www.wikidata.org/wiki/Q145","https://g.co/kg/m/07ssc"]},"Australia",{"@type":"Country","name":"Australia","sameAs":["https://en.wikipedia.org/wiki/Australia","https://www.wikidata.org/wiki/Q408","https://g.co/kg/m/0chghy"]},"Canada",{"@type":"Country","name":"Canada","sameAs":["https://en.wikipedia.org/wiki/Canada","https://www.wikidata.org/wiki/Q16","https://g.co/kg/m/0d060g"]},"Russia",{"@type":"Country","name":"Russia","sameAs":["https://en.wikipedia.org/wiki/Russia","https://www.wikidata.org/wiki/Q159","https://g.co/kg/m/06bnz"]},"China",{"@type":"Country","name":"China","sameAs":["https://en.wikipedia.org/wiki/China","https://www.wikidata.org/wiki/Q148","https://g.co/kg/m/0d05w3"]}],"memberOf":["Mensa International",{"@type":"Organization","name":"Mensa International","sameAs":["https://en.wikipedia.org/wiki/Mensa_International","https://www.wikidata.org/wiki/Q184194","https://g.co/kg/m/0140pf"]},"National Rifle Association",{"@type":"Organization","name":"National Rifle Association","sameAs":["https://en.wikipedia.org/wiki/National_Rifle_Association","https://www.wikidata.org/wiki/Q863259","https://g.co/kg/m/0j6f9"]},"CompTIA",{"@type":"Organization","name":"CompTIA","sameAs":["https://en.wikipedia.org/wiki/CompTIA","https://www.wikidata.org/wiki/Q597534","https://g.co/kg/m/040shq"]},"ISFCE LLC",{"@type":"Organization","name":"ISFCE LLC","sameAs":["https://isfce.com","https://g.co/kg/g/11wxm5r0rg"]}],"hasCredential":[{"@type":"EducationalOccupationalCredential","name":"Joomla 3 Certified Administrator","credentialCategory":"Certification","description":"Administrator Exam is the first available Joomla! certification exam","recognizedBy":{"@type":"Organization","name":"Open Source Matters, Inc.","sameAs":["https://en.wikipedia.org/wiki/Open_Source_Matters,_Inc.","https://g.co/kg/g/11f00wvjhz"]},"url":"https://certification.joomla.org/certified-user-directory/michael-richey","about":["Content management system",{"@type":"Thing","name":"Content management system","sameAs":["https://en.wikipedia.org/wiki/Content_management_system","https://www.wikidata.org/wiki/Q131093","https://g.co/kg/m/0k23c"]},"Web content management system",{"@type":"Thing","name":"Web content management system","sameAs":["https://en.wikipedia.org/wiki/Web_content_management_system","https://www.wikidata.org/wiki/Q45211","https://g.co/kg/m/0615s2"]},"Joomla",{"@type":"Thing","name":"Joomla","sameAs":["https://en.wikipedia.org/wiki/Joomla","https://www.wikidata.org/wiki/Q13167","https://g.co/kg/m/07qb81"]}],"educationalLevel":"expert","image":{"@type":"ImageObject","url":"https://www.richeyweb.com/images/contact/badge.webp","contentUrl":"https://www.richeyweb.com/images/contact/badge.webp","width":{"@type":"QuantitativeValue","value":300,"unitCode":"PX"},"height":{"@type":"QuantitativeValue","value":86,"unitCode":"PX"},"caption":"Joomla 3 Certified Administrator"}},{"@type":"EducationalOccupationalCredential","name":"Certified Computer Examiner","credentialCategory":"Certification","description":"Internationally recognized computer forensics certifiecation","recognizedBy":{"@type":"Organization","name":"ISFCE LLC","sameAs":["https://en.wikipedia.org/wiki/ISFCE_LLC","https://g.co/kg/g/11wxm5r0rg"]},"url":"https://isfce.com/","about":["Digital forensics",{"@type":"Thing","name":"Digital forensics","sameAs":["https://en.wikipedia.org/wiki/Digital_forensics","https://www.wikidata.org/wiki/Q3246940","https://g.co/kg/m/0cnxzfx"]},"Computer forensics",{"@type":"Thing","name":"Computer forensics","sameAs":["https://en.wikipedia.org/wiki/Computer_forensics","https://www.wikidata.org/wiki/Q878553","https://g.co/kg/m/02wxbd"]},"Mobile device forensics",{"@type":"Thing","name":"Mobile device forensics","sameAs":["https://en.wikipedia.org/wiki/Mobile_device_forensics","https://www.wikidata.org/wiki/Q6887097","https://g.co/kg/m/06zp3tp"]},"Network forensics",{"@type":"Thing","name":"Network forensics","sameAs":["https://en.wikipedia.org/wiki/Network_forensics","https://www.wikidata.org/wiki/Q7001032","https://g.co/kg/m/05pb280"]},"Database forensics",{"@type":"Thing","name":"Database forensics","sameAs":["https://en.wikipedia.org/wiki/Database_forensics","https://www.wikidata.org/wiki/Q5227405","https://g.co/kg/m/0cgqsy"]}],"educationalLevel":"expert","image":{"@type":"ImageObject","url":"https://www.richeyweb.com/images/contact/isfce-cce.webp","contentUrl":"https://www.richeyweb.com/images/contact/isfce-cce.webp","width":{"@type":"QuantitativeValue","value":150,"unitCode":"PX"},"height":{"@type":"QuantitativeValue","value":150,"unitCode":"PX"},"caption":"Certified Computer Examiner"}}],"hasOfferCatalog":{"@type":"OfferCatalog","name":"Web Services","itemListElement":[{"@type":"Offer","itemOffered":{"@type":"Service","name":"Hosting"}},{"@type":"Offer","itemOffered":{"@type":"Service","name":"Development"}},{"@type":"Offer","itemOffered":{"@type":"Service","name":"Search Engine Optimization"}}]}},{"@type":"WebSite","@id":"https://www.richeyweb.com/#website","url":"https://www.richeyweb.com/","name":"RicheyWeb","publisher":{"@id":"https://www.richeyweb.com/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://www.richeyweb.com/search?q={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string","valueMaxLength":256,"valueMinLength":2,"valuePattern":"^[A-Za-z0-9\\s]+$"}},"creator":{"@id":"https://www.richeyweb.com/#organization"},"copyrightHolder":{"@id":"https://www.richeyweb.com/#organization"}},{"@type":"WebPage","@id":"https://www.richeyweb.com/blog/hosting/varnish-and-joomla#webpage","url":"https://www.richeyweb.com/blog/hosting/varnish-and-joomla","name":"Varnish and Joomla","description":"Easy Varnish and Joomla setup for faster websites! A step-by-step guide to boost performance & caching. Advanced guide with config files provided.","isPartOf":{"@id":"https://www.richeyweb.com/#website"},"about":{"@id":"https://www.richeyweb.com/#organization"},"inLanguage":"en-GB"},{"@type":"Article","image":[{"@type":"ImageObject","url":"https://www.richeyweb.com/images/articles/varnish-nginx-joomla/varnish-and-joomla.webp","contentUrl":"https://www.richeyweb.com/images/articles/varnish-nginx-joomla/varnish-and-joomla.webp","width":{"@type":"QuantitativeValue","value":890,"unitCode":"PX"},"height":{"@type":"QuantitativeValue","value":500,"unitCode":"PX"},"caption":"Varnish and Joomla","representativeOfPage":true},{"@type":"ImageObject","url":"https://www.richeyweb.com/images/articles/varnish-nginx-joomla/topology.webp","contentUrl":"https://www.richeyweb.com/images/articles/varnish-nginx-joomla/topology.webp","width":{"@type":"QuantitativeValue","value":1432,"unitCode":"PX"},"height":{"@type":"QuantitativeValue","value":796,"unitCode":"PX"},"caption":"Network Topology"}],"headline":"Varnish and Joomla","description":"Easy Varnish and Joomla setup for faster websites! A step-by-step guide to boost performance & caching. Advanced guide with config files provided.","author":{"@type":"Person","name":"Michael Richey","url":"https://www.richeyweb.com/contact-us","@id":"https://www.richeyweb.com/contact-us#person"},"datePublished":"2025-05-31T00:00:00+00:00","dateModified":"2026-03-30T00:00:00+00:00","about":["Joomla",{"@type":"Thing","name":"Joomla","sameAs":["https://en.wikipedia.org/wiki/Joomla","https://www.wikidata.org/wiki/Q13167","https://g.co/kg/m/07qb81"]},"Content management system",{"@type":"Thing","name":"Content management system","sameAs":["https://en.wikipedia.org/wiki/Content_management_system","https://www.wikidata.org/wiki/Q131093","https://g.co/kg/m/0k23c"]},"Varnish",{"@type":"Thing","name":"Varnish","sameAs":["https://en.wikipedia.org/wiki/Varnish_(software)","https://www.wikidata.org/wiki/Q81683","https://g.co/kg/m/0279z4k"]},"Nginx",{"@type":"Thing","name":"Nginx","sameAs":["https://en.wikipedia.org/wiki/Nginx","https://www.wikidata.org/wiki/Q306144","https://g.co/kg/m/02qft91"]}],"mentions":["Operating system",{"@type":"Thing","name":"Operating system","sameAs":["https://en.wikipedia.org/wiki/Operating_system","https://www.wikidata.org/wiki/Q9135","https://g.co/kg/m/05khh"]},"Ubuntu",{"@type":"Thing","name":"Ubuntu","sameAs":["https://en.wikipedia.org/wiki/Ubuntu","https://www.wikidata.org/wiki/Q381","https://g.co/kg/m/03x5qm"]},"MySQL",{"@type":"Thing","name":"MySQL","sameAs":["https://en.wikipedia.org/wiki/MySQL","https://www.wikidata.org/wiki/Q850","https://g.co/kg/m/04y3k"]},"PHP",{"@type":"Thing","name":"PHP","sameAs":["https://en.wikipedia.org/wiki/PHP","https://www.wikidata.org/wiki/Q59","https://g.co/kg/m/060kv"]},"Apache HTTP Server",{"@type":"Thing","name":"Apache HTTP Server","sameAs":["https://en.wikipedia.org/wiki/Apache_HTTP_Server","https://www.wikidata.org/wiki/Q11354","https://g.co/kg/m/0_h2"]},"HTTPS",{"@type":"Thing","name":"HTTPS","sameAs":["https://en.wikipedia.org/wiki/HTTPS","https://www.wikidata.org/wiki/Q44484","https://g.co/kg/m/03jkw"]},"MariaDB",{"@type":"Thing","name":"MariaDB","sameAs":["https://en.wikipedia.org/wiki/MariaDB","https://www.wikidata.org/wiki/Q787177","https://g.co/kg/m/09gc20r"]},"Redis",{"@type":"Thing","name":"Redis","sameAs":["https://en.wikipedia.org/wiki/Redis","https://www.wikidata.org/wiki/Q2136322","https://g.co/kg/m/09gnj_f"]},"System - Expires Headers",{"@type":"Thing","@id":"https://www.richeyweb.com/software/joomla/plugins/system-expires-headers/#softwareapplication","name":"System - Expires Headers","sameAs":["https://extensions.joomla.org/extension/site-management/browsers-a-web-standards/expires-headers/","https://en.wikipedia.org/wiki/System_-_Expires_Headers"]}],"@id":"https://www.richeyweb.com/blog/hosting/varnish-and-joomla#article","isPartOf":{"@id":"https://www.richeyweb.com/blog/hosting/varnish-and-joomla#webpage"},"publisher":{"@id":"https://www.richeyweb.com/#organization"},"keywords":"Joomla, Varnish, NGINX, PHP, MySQL, Linux, Apache, load balancer, configuration, firewall, SSL, certificate, key, port 80, port 443, backend, VCL, import, backend, director, vcl_recv, vcl_backend_response, vcl_deliver, System - Expires Headers, plugin, cache, non-cached, dynamic, static, AJAX, cookies, headers, response, page, site, server, hosting, installation, setup, configuration files, snippets, sites-available, default.conf, sites-enabled, www.yourdomain.com, yourdomain.com, administrator, com_ajax, no-cache, no-store, must-revalidate, Pragma: no-cache, X-Real-Ip, X-Forwarded-For, Host, REMOTE_ADDR, X-Forwarded-Proto, X-Powered-By, Via, X-Cache, X-Cache-Hits, proxy_pass, proxy_redirect, http2, least_conn, weight, Joomla Cache, Page Cache, dynamic page loads, fast","articleSection":"Hosting","url":"https://www.richeyweb.com/blog/hosting/varnish-and-joomla"}]}
```
