Skip to content

Architecture

Request Flow

Production Infrastructure

                     ┌──────────────────┐
                     │   Cloudflare     │
                     │   CDN + WAF      │
                     └────────┬─────────┘

               ┌──────────────┴──────────────┐
               │                             │
        ┌──────┴──────┐              ┌───────┴─────┐
        │  Varnish 1  │              │  Varnish 2  │
        └──────┬──────┘              └───────┬─────┘
               │                             │
               └──────────────┬──────────────┘

         ┌────────┬───────────┼───────────┬────────┐
         │        │           │           │        │
      ┌──┴──┐  ┌──┴──┐    ┌──┴──┐     ┌──┴──┐    │
      │ WS1 │  │ WS2 │    │ WS3 │     │ WS4 │    │
      └─────┘  └─────┘    └─────┘     └─────┘    │

                           ┌───────────────────────┘

                     ┌─────┴─────┐       ┌──────────┐
                     │   MySQL   │       │  Redis   │
                     │  Database │       │  Cache   │
                     └───────────┘       └──────────┘

         ┌──────────────┐
         │ Admin Server │  admin.dezeen.com
         │  (separate)  │  WordPress admin only
         └──────────────┘

Key Architecture Decisions

Separate Admin Server

WordPress admin (admin.dezeen.com) runs on a dedicated server, isolating editorial traffic from public web traffic. This prevents heavy admin operations (bulk edits, imports) from affecting frontend performance.

Varnish Page Cache

Two Varnish servers sit between Cloudflare and the Apache web nodes. Varnish caches full HTML pages with a ~1 day TTL. Cache invalidation happens via:

  • Automatic purge on post publish/update
  • dezeen-cloudflare-purge-manager plugin for Cloudflare
  • dezeen-cache-control plugin for Cache-Control headers

Static Assets on Separate Domain

Media and compiled assets are served from static.dezeen.com, controlled by the STATIC_ASSETS_DIRECTORY and DZN_TEMPLATE_DIRECTORY constants. This enables independent CDN caching and cookie-free asset delivery.

Laravel Platform

A separate Laravel application handles Awards submissions, Competitions, and Longlists at the /platform path. WordPress communicates with it via REST API authenticated with JWT.

WordPress Application Layers

Responsibility Split

LayerResponsibility
mu-plugins/dezeen/CPT/taxonomy registration, REST API, core business logic, content manipulation, awards/events/hotlist systems
dezeen- plugins*Feature modules (search, newsletters, ads, caching, feeds, etc.)
2016dezeen themeTemplates, asset compilation, shortcodes, admin options, frontend rendering
3rd-party pluginsACF (content modelling), Yoast (SEO), WP Rocket (caching), Smush (images)

Database

PropertyValue
EngineMySQL 5.7
Prefixvetg_
Charsetlatin1
Custom tablesvetg_competition_visibility, vetg_dezeen_services_data, vetg_events_guide, vetg_events_guide_types, vetg_events_guide_city_guides

Unknowns / Needs Verification

  • Redis status: WP_REDIS_HOST is defined in wp-config.php but technical-debt-and-roadmap.md states Redis is "planned but not yet implemented". Verify if Redis is active in production.
  • Varnish VCL files: Referenced in setup/production/varnish/ but exact purge rules need inspection of varnish-1-v8.vlc and varnish-2-v8.vlc.
  • Load balancer: Whether Cloudflare or Jelastic handles round-robin to Varnish nodes.