WordPress Multisite er en arkitektonisk grunnpilar for moderne plattformteknikk, men å drifte mer enn 1000 nettsteder på en felles kodebase avdekker feilmoduser som ikke finnes i enkeltstående installasjoner. Ved denne størrelsesordenen forvandles nettverksadministrasjon fra innholdspublisering til drift av distribuerte systemer. Uten streng teknisk styring fører delt tilstand på tvers av nettsteder til kaskaderende databaselåser, uforutsigbare cache-invalideringsstormer, ressursforurensning mellom leietakere og ukontrollert utvidelsesvekst.
Drift av et virksomhetsnettverk krever streng ansvarsfordeling, automatisert infrastruktur, programmatisk leietaker-provisjonering og håndheving av kjøretidsgrenser. Enten nettverket betjener globale bedriftsavdelinger, multibrand e-handelsporteføljer eller utdanningsinstitusjoner, fordrer stabilitet i stor skala at WordPress-installasjonen behandles som en styrt infrastrukturklynge.
Arkitektur i WordPress Multisite-nettverk
For å bygge solid styring på tvers av et firesifret antall nettsteder må ingeniører koble rutingstopologi nøyaktig sammen med databasestrukturene. WordPress Multisite støtter to strukturelle topologier nativt: subdomene-konfigurasjoner og underkatalog-konfigurasjoner.
Subdomener kontra underkataloger
Valget mellom subdomener (tenant.network.com) og underkataloger (network.com/tenant/) avgjør oppsett for reverse proxy, SSL-sertifikathåndtering, ruting-overhead og omfanget av informasjonskapsler (cookies).
I en subdomene-topologi:
- Wildcard DNS-oppføringer (
*.network.com) og automatiserte Let’s Encrypt-sertifikater via ACME-tjenester ruter trafikk direkte til kantservere. - Cookie-isoleringen forblir streng: Sesjonstokener og sikkerhets-nonces satt på
tenant-a.network.comlekker aldri inn i forespørselskonteksten tiltenant-b.network.com. - Web application firewalls (WAF) og CDN-distribusjoner kan knytte detaljerte tilgangsregler til individuelle vertsnavn.
- Reverse proxy-konfigurasjoner i Nginx eller Envoy mapper innkommende Host-headere direkte til backend-noder med minimal omskriving.
I en underkatalog-topologi:
- Hver forespørsel passerer gjennom hoveddomenet, noe som betyr at alle informasjonskapsler knyttet til rotstien overføres til samtlige delnettsteder med mindre eksplisitt stifiltrering legges inn i
wp-config.php. - Reverse proxy-regler må skille nøyaktig mellom plattformens kjerneendepunkter (
/wp-admin,/wp-includes,/wp-json), statiske ressurser (/wp-content) og leietakernes permalenker (/tenant-slug/*). - Sidelagring i hurtigbuffer krever komplekse regex-regler for å unngå at bufrede sider fra nærliggende underkataloger serveres feilaktig.
- Navnekonflikter mellom reserverte WordPress-endepunkter og leietakerstier krever streng håndheving av svartelister under registrering.
For virksomhetsnettverk som overstiger 1000 leietakere, gir subdomene-topologien overlegen sikkerhetsisolering, enklere rutingstabeller og tydelige grenser for cache-invalidering i CDN.
Databaseskjema og sentrale nettverkstabeller
Multisite erstatter standard enkelt-nettsteds MySQL-oppsett med et relasjonelt multitenant-skjema. Den overordnede tilstanden for nettverket styres via to dedikerte tabeller:
wp_site: Definerer selve nettverksentiteten og sporer hoveddomene og basisti for installasjonen (brukes spesielt når man drifter flere nettverk innenfor samme database viaWP_ALLOW_MULTISITE).wp_blogs: Det autoritative registeret over samtlige leietakere. Hver rad definerer et nettsted med felter somblog_id,site_id,domain,path,registered,last_updated,public,archived,mature,spam,deletedoglang_id.
Når en HTTP-forespørsel treffer WordPress, kaller ms_load_current_site_and_network() tabellen wp_blogs basert på innkommende domene og sti for å opprette det globale objektet $current_blog og sette variabelen $blog_id.
I tillegg til registertabellene skiller Multisite brukeridentitet fra nettstedinnhold. Brukerkontoer konsolideres i globale tabeller:
wp_users: Delt over hele nettverket. Hver brukerkonto eksisterer globalt nøyaktig én gang.wp_usermeta: Lagrer brukermetadata, inkludert rettigheter per nettsted. Rolletilganger indekseres dynamisk etter bloggprefikset (for eksempelwp_capabilitiesfor nettsted 1,wp_2_capabilitiesfor nettsted 2 ogwp_1042_capabilitiesfor nettsted 1042).
Alle øvrige innholdstabeller dupliseres per leietaker med numeriske prefikser: wp_{blog_id}_posts, wp_{blog_id}_postmeta, wp_{blog_id}_options, wp_{blog_id}_comments, wp_{blog_id}_commentmeta, wp_{blog_id}_terms og wp_{blog_id}_term_relationships. I et nettverk med 1200 nettsteder omfatter databaseskjemaet over 12 000 separate tabeller. Dette tabellvolumet krever finjustering av MySQL-parametere, spesielt table_open_cache (minimum 32 000) og innodb_open_files (minimum 64 000), sammen med innodb_file_per_table=1 for å unngå utmattelse av fildeskriptorer i operativsystemet.
Delte brukertabeller og autentiseringsgrenser
Konsolidering av brukerkontoer i de globale tabellene wp_users og wp_usermeta introduserer spesifikke driftsflaskehalser og sikkerhetsfaktorer.
Skalering av delte brukertabeller og metadata
I et nettverk med over 1000 nettsteder og hundretusener av registrerte brukere vokser wp_usermeta raskt til titalls millioner rader. Fordi rettigheter lagres som serialiserte tabeller per bloggprefiks (wp_{blog_id}_capabilities), utløser kontroll av brukertilganger spørringer mot uindekserte metanøkler.
For å forhindre ytelsesfall:
- Sammensatte indekser: Legg til databaseindekser som dekker
(user_id, meta_key(191))påwp_usermetafor å akselerere oppslag under innlogging. - Ekstern identitetsdelegering: Flytt autentisering fullstendig ut til SAML 2.0 eller OpenID Connect (OIDC) via leverandører som Okta, Microsoft Entra ID eller Keycloak. Brukere autentiserer seg eksternt, og WordPress oppretter sesjoner Just-In-Time (JIT) uten å stole på lokale passord-hasher.
- SCIM-synkronisering: Implementer SCIM-endepunkter for automatisk de-provisjonering. Når en ansatt slutter, vil deaktivering i Entra ID umiddelbart fjerne tilganger på tvers av samtlige 1000+ nettsteder.
Super admin-privilegier og rollesegmentering
Rettigheten manage_network gir absolutt administrativ kontroll. En Super Admin kan kjøre vilkårlig kode, manipulere databasealternativer på ethvert delnettsted og aktivere uprøvde programtillegg.
Prinsipper for å styre administrative privilegier:
- Ingen daglige Super Admin-kontoer: Super Admin-tilgang må forbeholdes automatiserte CI/CD-tjenestekontoer og nødprosedyrer sikret med maskinvarebaserte FIDO2/WebAuthn-sikkerhetsnøkler.
- Egendefinerte mellomroller: Etabler roller som
Cluster AdministratorellerAuditormed avgrensede oppgaver (manage_sites) uten tilgang tilmanage_network_pluginsellerunfiltered_html. - Dobbeltgodkjenning: Krev godkjenning fra to autoriserte ingeniører ved høyrisikooperasjoner som masseoppdateringer i databasen eller sletting av nettsteder.
Objektbuffer-arkitektur og globale grupper
Bruk av Redis eller Memcached som en persistent objektbuffer er obligatorisk for WordPress i bedriftsklassen. Uten eksplisitt gruppering av buffernøkler vil standardoppsettet føre til datakorrupsjon eller overbelastning av serverminne.
Konfigurasjon av globale buffergrupper
WordPress benytter buffergrupper for å organisere midlertidige og persistente objekter. I Multisite blir standardgrupper (posts, post_meta, options, terms) automatisk tildelt et prefiks basert på gjeldende blog_id. Globale data må imidlertid deles på tvers av alle nettsteder.
Funksjonen wp_cache_add_global_groups() registrerer grupper som omgår nettstedsprefikset og forblir felles for hele klyngen:
// I wp-content/object-cache.php eller en tidlig mu-plugin
wp_cache_add_global_groups([
"users",
"user_meta",
"user_logins",
"useremail",
"userslugs",
"site-transient",
"site-options",
"blog-lookup",
"blog-id-cache",
"networks",
"sites",
"global-posts",
]);Dersom grupper som blog-lookup eller site-options utelates, tvinges WordPress til å spørre MySQL-databasen ved hver eneste innkommende forespørsel for å finne blogg-ID-en til domenet, noe som skaper kraftige forsinkelser.
Cache-invalideringsstormer og minneisolasjon
Når 1000 nettsteder deler én felles Redis-klynge:
- Kastingspolitikk (eviction): Konfigurer Redis med
volatile-lruellerallkeys-lruog tildel tilstrekkelig minne (minimum 8 GB for store nettverk). - Unikt miljøsalt: Definer
WP_CACHE_KEY_SALTunikt iwp-config.phpfor henholdsvis test- og produksjonsmiljø for å hindre nøkkelkollisjoner under distribusjoner. - Forbud mot global tømming: Kjør aldri
redis-cli flushdbellerwp_cache_flush()i produksjon. Tømming av hele hurtigbufferen for 1000 nettsteder samtidig skaper umiddelbare cache stampedes (dogpiling), der tusenvis av samtidige databasespørringer overvelder MySQL-tilkoblingspoolen. Ugyldiggjør i stedet målrettede grupper eller enkeltnøkler.
Ytelsesfallgruver ved switch_to_blog i batch-kjøringer
Den vanligste årsaken til minneutmattelse og systemkrasj i Multisite-automatisering er feil bruk av switch_to_blog().
Mekanikken bak kontekstbytte
Når koden kaller switch_to_blog( $new_blog_id ), gjennomfører WordPress en rekke globale tilstandsendringer:
- Skyver gjeldende nettsteds-ID, tabellprefiks og databasehåndtak over på den interne stakken
$GLOBALS["_wp_switched_stack"]. - Oppdaterer
$wpdb->blogidog tilbakestiller tabellreferanser (peker$wpdb->poststilwp_{new_blog_id}_posts). - Bytter aktive opplastingsstier via
wp_upload_dir(). - Bytter pekere for opsjonstabellens hurtigbuffer og laster nettstedsspesifikke innstillinger.
Når operasjonen er ferdig, henter restore_current_blog() forrige tilstand tilbake fra stakken og reverserer tabellprefiksene.
Minnelekkasjer i switch_to_blog-løkker
Selv om funksjonen fungerer fint for enkelthandlinger, fører en løkke over 1000 nettsteder med switch_to_blog() til voldsomme minnelekkasjer:
// ANTY-MØNSTER: Denne lokken vil bruke opp minnet pa 1000 nettsteder
$sites = get_sites(["number" => 1500]);
foreach ($sites as $site) {
switch_to_blog($site->blog_id);
// Sporringer, innstillingssjekker, taksonomioppdateringer
restore_current_blog();
}De underliggende årsakene til minnelekkasjen omfatter:
- Voksende interne minnebuffere: Kjernefunksjoner legger metadata, SQL-spørringer og registrerte posttyper til interne tabeller (
$wp_object_cache,$wpdb->queries,$wp_filter) som aldri frigjøres automatisk under kjøringen. - Hengende filtre og handlinger: Kroker (hooks) lagt til mens man er byttet til en blogg blir ofte værende i globale filtertabeller og kjøres på nytt i feil kontekst på etterfølgende nettsteder.
- Spørringslogging: Hvis
SAVEQUERIESer satt til true, akkumulerer$wpdb->querieshver eneste SQL-streng som kjøres på tvers av alle 1000 nettsteder, og bruker hundrevis av megabyte med RAM i løpet av få minutter.
Robust mønster for batch-behandling med minnegjenvinning
For å iterere trygt over tusenvis av nettsteder må ingeniører dele arbeidet inn i bolker og tømme minnebufferne systematisk:
// ROBUST MØNSTER: Bolkevis kjoring med minnerensing
$site_ids = get_sites([
"fields" => "ids",
"number" => 0,
"archived" => 0,
"deleted" => 0,
]);
$batch_size = 50;
$chunks = array_chunk($site_ids, $batch_size);
foreach ($chunks as $chunk) {
foreach ($chunk as $blog_id) {
switch_to_blog($blog_id);
// Utfor vedlikeholdsoppgave for det aktuelle nettstedet
process_site_maintenance($blog_id);
restore_current_blog();
}
// Nullstill intern minnebuffer mellom hver bolk
if (function_exists("wp_cache_flush_runtime")) {
wp_cache_flush_runtime();
} elseif (is_object($GLOBALS["wp_object_cache"]) && method_exists($GLOBALS["wp_object_cache"], "flush")) {
$GLOBALS["wp_object_cache"]->flush();
}
// Nullstill logg over databasesporringer
if (isset($GLOBALS["wpdb"]) && is_object($GLOBALS["wpdb"])) {
$GLOBALS["wpdb"]->queries = [];
}
// Kjør soppelsamleren i PHP eksplisitt
gc_collect_cycles();
}Ved store datamigreringer er den optimale arkitekturen å unngå kontekstbytte i samme prosess overhodet: start uavhengige delprosesser via WP-CLI, slik at hvert nettsted behandles i en isolert PHP-livssyklus.
Retningslinjer for nettverksaktivering av programtillegg og temaer
Håndtering av programvare på tvers av 1000 nettsteder krever streng kontroll over programtilleggenes livssyklus. Å la lokale administratorer aktivere vilkårlige utvidelser fører til sikkerhetshull, ytelsesfall og databasekonflikter.
Nettverksaktivering kontra lokal aktivering
I WordPress Multisite eksisterer programtillegg i tre operative tilstander:
- Nettverksaktivert (Network Activated): Aktivert globalt i nettverksadministrasjonen. Programtillegget kjører på samtlige nettsteder uten mulighet for deaktivering lokalt.
- Tilgjengelig i nettverket: Installert i
wp-content/pluginsog gjort tilgjengelig for lokale administratorer til manuell aktivering etter behov. - Must-Use (
mu-plugins): Lastes automatisk inn av PHP-motoren fra mappenwp-content/mu-pluginsfør vanlige programtillegg. Disse kan under ingen omstendigheter deaktiveres fra kontrollpanelet.
Beste praksis for virksomhetsretningslinjer
For å sikre stabil drift på tvers av 1000+ nettsteder:
- Blokker filendringer og installasjon fra kontrollpanelet: Deaktiver installasjon av temaer og programtillegg i dashbordet ved å sette
define("DISALLOW_FILE_MODS", true);iwp-config.php. - Kjernefunksjonalitet i mu-plugins: Plasser all kode for styring, sikkerhet, SSO, objektbuffer og overvåking i mappen
wp-content/mu-plugins. - Gruppeinndeling med kodeflagg: Når spesifikke nettsteder trenger dedikerte utvidelser (for eksempel nettbutikk på 50 av 1000 nettsteder), styr tilgangen via nettstedsmetadata og programmatiske filtre fremfor manuelle klikk:
// I mu-plugins/tenant-feature-flags.php
add_filter("option_active_plugins", function ($plugins) {
$blog_id = get_current_blog_id();
$tier = get_site_meta($blog_id, "tenant_tier", true);
if ($tier === "ecommerce") {
$plugins[] = "woocommerce/woocommerce.php";
}
return array_unique($plugins);
});Dette sikrer at programvaredistribusjon styres via Git-versjonert konfigurasjon og sentrale metadata.
WP-CLI-automatisering og sentralisert nettverksstyring
Å administrere over 1000 nettsteder manuelt gjennom nettleseren er umulig. Automatisering med WP-CLI er kjernen i storskala Multisite-drift.
Nettverkskommandoer og batch-arbeidsflyter
WP-CLI tilbyr innebygd støtte for Multisite gjennom kommandosettene wp site og wp network.
Viktige styringskommandoer:
# Eksporter alle aktive blogg-ID-er til en ren tekstfil
wp site list --field=blog_id --archived=0 --deleted=0 > active_sites.txt
# Kjør parallell sjekk av programtillegg med xargs
cat active_sites.txt | xargs -n 1 -P 4 -I {} wp plugin is-active redis-cache --url="$(wp site get {} --field=url)"
# Systematisk sok og erstatt pa tvers av alle tabeller
wp site list --field=url | while read site_url; do
echo "Behandler nettsted: $site_url"
wp search-replace "https://gammelt-domene.no" "https://nytt-domene.no" --url="$site_url" --precise --skip-columns=guid --recurse-objects
doneParallellkjøring av vedlikehold med xargs
Sekvensiell behandling av 1000 nettsteder tar timevis ved tunge oppgaver som søkeindeksering eller hurtigbufferoppvarming. Ved å utnytte parallellkjøring på operativsystemnivå reduseres tidsbruken dramatisk:
#!/usr/bin/env bash
# Parallell vedlikeholdskjorer for Multisite
set -euo pipefail
WP_PATH="/var/www/html"
CONCURRENCY=8
mapfile -t BLOG_IDS < <(wp site list --path="$WP_PATH" --field=blog_id --archived=0 --deleted=0)
echo "Starter vedlikehold over ${#BLOG_IDS[@]} nettsteder med parallellitet $CONCURRENCY"
printf "%s
" "${BLOG_IDS[@]}" | xargs -I {ID} -P "$CONCURRENCY" bash -c '
SITE_URL=$(wp site get "{ID}" --field=url --path="'"$WP_PATH"'")
wp transient delete --expired --url="$SITE_URL" --path="'"$WP_PATH"'" --quiet
wp cache flush --url="$SITE_URL" --path="'"$WP_PATH"'" --quiet
'
echo "Nettverksvedlikehold fullfort uten feil."Ved å starte en ny CLI-prosess for hvert nettsted sikrer man at minneforbruket tilbakestilles ved hver oppgave.
Automatisert leietaker-provisjonering med blueprints og WP-CLI
Vekst over 1000 nettsteder fordrer kontinuerlig opprettelse av nye nettsteder. Provisjoneringen må være deterministisk, automatisert og repeterbar.
Moderne blueprint-arkitektur
Manuell nettstedopprettelse i administrasjonspanelet fører til menneskelige feil og mangelfulle oppsett. Moderne plattformteknikk benytter automatiserte blueprints som trigges via API-kall eller interne utviklerportaler.
En komplett provisjoneringsflyt består av følgende trinn:
- Validering: Kontroll av tilgjengelighet for subdomene mot reserverte nøkkelord.
- Registrering: Kjøring av
wp site createmed nødvendige parametere. - Skjemaoppsett: Kjøring av databasemigreringer og innstilling av standardverdier (tidssone, permalenker, språk).
- Ressursisolering: Tildeling av egne mapper eller bøtteprefikser i S3 for medieopplastinger.
- Rolletilordning: Tildeling av administratorrettigheter til brukere tilknyttet SSO-katalogen.
- Verifiseringstest: Automatisk kontroll av HTTP-svarkoder, TLS-sertifikater og sikkerhetshoder.
Produksjonsskript for provisjonering
#!/usr/bin/env bash
# Automatisert provisjonering av nye leietakere
set -euo pipefail
SUBDOMAIN="$1"
SITE_TITLE="$2"
ADMIN_EMAIL="$3"
TIER="${4:-standard}"
NETWORK_DOMAIN="virksomhet.internal"
FULL_SLUG="${SUBDOMAIN}.${NETWORK_DOMAIN}"
echo "Starter provisjonering for ${FULL_SLUG}..."
# 1. Registrer nettstedet i Multisite-katalogen
NEW_BLOG_ID=$(wp site create --slug="$SUBDOMAIN" --title="$SITE_TITLE" --email="$ADMIN_EMAIL" --porcelain)
echo "Nettsted registrert med blog_id: $NEW_BLOG_ID"
# 2. Konfigurer standardinnstillinger
SITE_URL="https://${FULL_SLUG}"
wp option update permalink_structure "/%postname%/" --url="$SITE_URL"
wp option update blogdescription "" --url="$SITE_URL"
wp option update default_comment_status "closed" --url="$SITE_URL"
wp option update default_ping_status "closed" --url="$SITE_URL"
wp option update timezone_string "Europe/Oslo" --url="$SITE_URL"
# 3. Lagre metadata pa nettstedet
wp site meta set "$NEW_BLOG_ID" tenant_tier "$TIER"
wp site meta set "$NEW_BLOG_ID" provisioning_timestamp "$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
# 4. Aktiver felles kjernetema
wp theme activate "enterprise-core-theme" --url="$SITE_URL"
# 5. Nullstill hurtigbuffer for det nye nettstedet
wp cache flush --url="$SITE_URL"
echo "Provisjonering fullfort for $SITE_URL (ID: $NEW_BLOG_ID)"Ved å integrere dette skriptet i GitOps-arbeidsflyter kan ingeniørteam sette opp fullt konfigurerte, sikre WordPress-nettsteder på under 15 sekunder.
Ring-utrullinger og canary release-pipelines
Å oppdatere kjerne, temaer eller programtillegg på 1000 nettsteder samtidig utgjør en uakseptabel driftsrisiko. En enkelt fatal PHP-feil i en mal kan stanse hele virksomheten.
Progressiv utrullingsarkitektur
Styringsmodeller for virksomheter benytter progressive ring-utrullinger (canary releases):
+--------------------------------------------------------------+
| Ring 0: Syntetiske testnettsteder (Playwright E2E-tester) |
+--------------------------------------------------------------+
| Bestatt
v
+--------------------------------------------------------------+
| Ring 1: Interne testnettsteder (10 interne team-nettsteder) |
+--------------------------------------------------------------+
| Observasjon (2 timer)
v
+--------------------------------------------------------------+
| Ring 2: Canary-leietakere (5% av ikke-kritiske nettsteder) |
+--------------------------------------------------------------+
| Observasjon (24 timer)
v
+--------------------------------------------------------------+
| Ring 3: Generell tilgjengelighet (Resterende 95% av klyngen) |
+--------------------------------------------------------------+GitOps-automatisering og kvalitetskontroll
CI/CD-pipelines (GitHub Actions, GitLab CI) styrer oppdateringer basert på sanntidstelemetri:
- Pipelinen ruller ut oppdatert kode til testklyngen.
- Automatiserte Playwright-tester verifiserer sentrale brukerreiser på tvers av ulike nettstedstyper.
- Pipelinen oppdaterer metadata for nettsteder i Ring 1 og aktiverer ny kodeversjon via filtre.
- Overvåkingssystemer (Prometheus, Datadog) analyserer feilrater i PHP, 5xx-svarkoder og databaselatenstid.
- Hvis feilraten overstiger 0,05%, ruller pipelinen automatisk tilbake metadataene, slik at trafikken umiddelbart ledes tilbake til stabil versjon uten behov for filtilbakerulling på serverne.
Konklusjon
Å skalere WordPress Multisite til over 1000 nettsteder krever solid plattformstyring, nøyaktig databaseoptimalisering og helhetlig automatisering. Ved å erstatte manuelle handlinger i kontrollpanelet med WP-CLI-skript, konfigurere globale hurtigbuffergrupper riktig, unngå minnefeller med switch_to_blog og innføre trinnvise canary-utrullinger, skapes en trygg, robust og skalerbar flerbrukermiljø for virksomheten.







