在管理多个WordPress网站时,重复安装、更新插件、管理用户和备份数据等工作会消耗大量时间。WordPress多站点网络(Multisite)功能允许你在一个WordPress安装中运行多个站点,共享同一套核心代码、插件和主题,极大简化了多站点的运维工作。本文将从零开始,详细介绍WordPress多站点网络的安装、配置、域名映射、管理与优化全流程。

一、WordPress多站点网络概述
WordPress多站点(Multisite)是WordPress核心内置的一项功能,它允许用户通过单次WordPress安装创建和管理多个站点。每个站点可以有独立的域名、子域名或子目录,同时共享同一套插件、主题和用户数据库。
多站点的核心优势
- 集中管理:所有站点的插件、主题更新只需操作一次,大幅降低维护成本
- 资源共享:用户账号、媒体文件、插件和主题在站点间可共享
- 统一备份:只需备份一个数据库即可覆盖所有站点
- 快速创建:几分钟内即可创建一个新站点,无需重复安装WordPress
- 权限隔离:超级管理员可控制每个站点的可用插件和主题
适用场景
| 场景 | 说明 | 推荐模式 |
|---|---|---|
| 企业多品牌 | 同一公司管理多个品牌官网 | 子域名模式 |
| 教育机构 | 为每个院系/课程创建独立站点 | 子目录模式 |
| SaaS平台 | 为每个客户创建独立站点 | 域名映射 |
| 博客网络 | 多作者博客网络 | 子域名模式 |
| 开发测试 | 统一管理多个开发/测试环境 | 子目录模式 |
二、安装与启用多站点网络
启用多站点网络需要在现有的WordPress安装基础上进行配置。以下是详细步骤:
2.1 前置条件检查
在启用多站点之前,确保满足以下条件:
- WordPress已安装完成且可以正常访问
- 使用的是全新安装或已停用所有插件
- 服务器支持通配符DNS(子域名模式)或支持URL重写(子目录模式)
- PHP版本 >= 7.4(推荐8.0+)
- MySQL版本 >= 5.7(推荐8.0+)
2.2 启用多站点功能
编辑WordPress根目录下的
1 | wp-config.php |
文件,在
1 | /* That's all, stop editing! Happy publishing. */ |
行之前添加以下代码:
1
2
3
4
5
6
7
8
9
10 // 启用多站点功能
define('WP_ALLOW_MULTISITE', true);
// 设置多站点网络
define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', true); // true=子域名模式,false=子目录模式
define('DOMAIN_CURRENT_SITE', 'example.com');
define('PATH_CURRENT_SITE', '/');
define('SITE_ID_CURRENT_SITE', 1);
define('BLOG_ID_CURRENT_SITE', 1);
关键参数说明:
-
1SUBDOMAIN_INSTALL
:设为
1true使用子域名模式(site1.example.com),设为
1false使用子目录模式(example.com/site1)
-
1DOMAIN_CURRENT_SITE
:主站点的域名
-
1SITE_ID_CURRENT_SITE
和
1BLOG_ID_CURRENT_SITE:通常都设为1
2.3 配置Nginx/Apache伪静态规则
多站点模式需要正确的服务器重写规则。以下是Nginx配置示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 # Nginx 多站点配置
server {
listen 80;
server_name example.com *.example.com;
root /var/www/wordpress;
index index.php index.html;
# 日志
access_log /var/log/nginx/wordpress-multisite.access.log;
error_log /var/log/nginx/wordpress-multisite.error.log;
# 多站点重写规则
location / {
try_files $uri $uri/ /index.php?$args;
}
# 上传文件重写(映射 ms-files.php)
location ~ ^/files/(.*)$ {
try_files /wp-content/blogs.dir/$blogid/$uri /wp-includes/ms-files.php?file=$1;
}
# PHP 处理
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.0-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
# 禁止访问敏感文件
location ~ /\.(ht|git|svn) {
deny all;
}
}
对于Apache服务器,确保
1 | .htaccess |
文件包含以下重写规则:
1
2
3
4
5
6
7
8
9
10
11
12
13 RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
# 添加斜杠
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]

三、多站点网络配置详解
启用多站点后,WordPress后台会出现「网络管理员(Network Admin)」面板。在这个面板中,你可以管理所有子站点的设置。
3.1 网络基本设置
进入「设置 → 网络设置」,配置以下关键选项:
- 注册设置:控制是否允许新用户注册,以及是否允许站点管理员添加新用户
- 新站点设置:设置欢迎邮件模板、第一篇文章内容等
- 上传设置:限制文件上传大小(默认1500KB,建议根据服务器配置调整)
- 菜单设置:控制插件菜单的显示方式
3.2 通过WP-CLI管理多站点
WP-CLI对多站点提供了强大的命令行管理能力,以下是常用操作:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 # 创建新站点
wp site create --slug=newsite --title="新站点" --email=admin@example.com
# 列出所有站点
wp site list --fields=blog_id,url,registered,last_updated,status
# 归档/取消归档站点
wp site archive 2
wp site unarchive 2
# 激活/停用站点
wp site activate 2
wp site deactivate 2
# 删除站点
wp site delete 2 --yes
# 在指定站点上安装插件
wp plugin install yoast-seo --activate --url=site1.example.com
# 在所有站点上激活插件
wp plugin activate yoast-seo --network
3.3 数据库结构
多站点模式下,WordPress使用以下数据库表结构:
| 表前缀 | 用途 | 说明 |
|---|---|---|
| wp_ | 主站点 | 第一号站点的标准WordPress表 |
| wp_2_ | 站点2 | 第二号站点的标准WordPress表 |
| wp_3_ | 站点3 | 第三号站点的标准WordPress表 |
| wp_blogs | 站点列表 | 记录所有子站点信息 |
| wp_signups | 注册记录 | 用户和站点注册信息 |
| wp_site | 网络信息 | 多站点网络元数据 |
| wp_sitemeta | 网络选项 | 全网络范围的设置 |
| wp_registration_log | 注册日志 | 站点创建日志 |
了解这个结构对于数据库优化和故障排查非常重要。每个站点有独立的
1 | wp_N_posts |
、
1 | wp_N_options |
等表,但用户表
1 | wp_users |
和
1 | wp_usermeta |
是共享的。
四、域名映射(Domain Mapping)实战
域名映射是多站点网络中最核心也最容易出错的部分。从WordPress 4.5开始,域名映射已内置到核心中,不再需要Merc环境插件。以下是完整配置流程:
4.1 DNS配置
对于每个要映射的独立域名,需要将其DNS A记录指向同一台服务器:
1
2
3
4
5
6
7
8
9 # DNS 配置示例(以Cloudflare为例)
# 域名: brand-a.com
A brand-a.com → 35.194.243.81
# 域名: brand-b.com
A brand-b.com → 35.194.243.81
# 如果使用子域名模式,还需要通配符记录
A *.example.com → 35.194.243.81
4.2 服务器配置
Nginx需要配置一个catch-all的server块来处理所有映射的域名:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 server {
listen 80 default_server;
server_name example.com *.example.com brand-a.com brand-b.com;
root /var/www/wordpress;
index index.php index.html;
# 关键:将所有域名指向同一个WordPress安装
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.0-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
4.3 WordPress中映射域名
有两种方式将独立域名映射到子站点:
方法一:通过后台界面
- 登录网络管理员后台
- 进入「站点 → 所有站点」
- 点击要编辑的站点
- 在「编辑站点」页面,将「站点地址(URL)」改为独立域名,如
1https://brand-a.com
- 保存更改
方法二:通过WP-CLI
1
2
3
4
5
6 # 修改站点URL为独立域名
wp option update siteurl https://brand-a.com --url=site1.example.com
wp option update home https://brand-a.com --url=site1.example.com
# 或者直接在数据库层面修改
wp search-replace 'site1.example.com' 'brand-a.com' --url=site1.example.com --skip-columns=guid

4.4 SSL证书配置
多站点环境下的SSL证书配置是很多开发者遇到的难题。推荐使用Let’s Encrypt的通配符证书或合并多个域名的证书:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 # 方法一:通配符证书(适用于子域名模式)
certbot certonly --dns-cloudflare --dns-cloudflare-credentials /root/.cloudflare.ini -d "*.example.com" -d "example.com"
# 方法二:多域名证书(适用于独立域名映射)
certbot certonly --webroot -w /var/www/wordpress -d example.com -d brand-a.com -d brand-b.com
# Nginx SSL配置
server {
listen 443 ssl http2 default_server;
server_name example.com *.example.com brand-a.com brand-b.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# SSL优化
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
root /var/www/wordpress;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.0-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
# HTTP跳转HTTPS
server {
listen 80 default_server;
server_name example.com *.example.com brand-a.com brand-b.com;
return 301 https://$host$request_uri;
}
五、多站点性能优化策略
多站点网络共享同一套服务器资源,当站点数量增长时,性能问题会逐渐显现。以下是针对多站点的优化策略:
5.1 数据库优化
多站点模式下数据库表数量会快速增长(每个站点约12张表),以下是优化建议:
1
2
3
4
5
6
7
8
9
10 # wp-config.php 中配置自动优化
define('WP_ALLOW_REPAIR', false); // 生产环境关闭自动修复
# 定期清理废弃数据(通过WP-CLI或自定义脚本)
wp db query "DELETE FROM wp_options WHERE option_name LIKE '_transient_%' AND option_value = ''"
wp db query "DELETE FROM wp_2_options WHERE option_name LIKE '_transient_%' AND option_value = ''"
# 为多站点表创建索引(提升查询性能)
ALTER TABLE wp_blogs ADD INDEX idx_domain (domain);
ALTER TABLE wp_blogs ADD INDEX idx_blog_status (blog_id, public, archived, deleted);
5.2 对象缓存配置
多站点环境下使用Redis/Memcached对象缓存可以显著提升性能:
1
2
3
4
5
6
7
8
9
10
11
12 // wp-config.php 配置Redis缓存
define('WP_REDIS_HOST', '127.0.0.1');
define('WP_REDIS_PORT', 6379);
define('WP_REDIS_DATABASE', 0);
define('WP_REDIS_MAXTTL', 3600);
// 多站点专用:为每个站点使用不同的Redis key前缀
define('WP_REDIS_PREFIX', 'wp_multisite');
// Redis连接超时设置
define('WP_REDIS_TIMEOUT', 2);
define('WP_REDIS_READ_TIMEOUT', 2);
5.3 页面缓存策略
对于多站点,推荐使用Nginx FastCGI Cache配合Redis,避免依赖PHP层面的缓存插件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 # nginx.conf 主配置
fastcgi_cache_path /var/cache/nginx levels=1:2
keys_zone=wordpress:100m
inactive=60m
max_size=1g
use_temp_path=off;
# server块中的缓存配置
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.0-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
# FastCGI缓存
fastcgi_cache wordpress;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_valid 200 301 302 10m;
fastcgi_cache_valid 404 1m;
fastcgi_cache_use_stale error timeout invalid_header updating;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
# 添加缓存命中状态头
add_header X-Cache-Status $upstream_cache_status;
}
5.4 媒体文件优化
多站点的媒体文件默认存储在
1 | wp-content/uploads/sites/N/ |
目录中(N为站点ID)。建议配置CDN来加速静态资源:
1
2
3
4
5
6
7
8
9
10
11
12 // wp-config.php 中设置CDN
define('CDN_URL', 'https://cdn.example.com');
// functions.php 中替换媒体URL
add_filter('wp_get_attachment_url', function($url) {
$upload_dir = wp_upload_dir();
$cdn_url = defined('CDN_URL') ? CDN_URL : '';
if ($cdn_url && strpos($url, $upload_dir['baseurl']) !== false) {
$url = str_replace($upload_dir['baseurl'], $cdn_url, $url);
}
return $url;
});
六、安全加固与权限管理
多站点网络的安全管理比单站点更复杂,因为一个站点的漏洞可能影响整个网络。
6.1 超级管理员与站点管理员权限分离
多站点引入了「超级管理员」角色,拥有对所有站点的完全控制权。普通站点管理员只能管理自己站点的设置。以下是权限分配的最佳实践:
- 超级管理员:仅限核心运维人员,负责网络设置、插件主题安装、站点创建与删除
- 站点管理员:各站点独立的管理员,可管理本站的内容、用户、插件配置
- 编辑/作者/贡献者:内容生产角色,与单站点模式一致
6.2 插件与主题的安全控制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 // 通过 wp-config.php 控制插件激活方式
define('WP_NETWORK_AUTO_UPDATE', true); // 允许网络级自动更新
// 在 functions.php 中限制站点管理员可用的插件
add_filter('network_admin_plugin_action_links', function($actions, $plugin_file) {
// 核心插件不允许站点管理员禁用
$protected_plugins = ['wordfence/wordfence.php', 'seo-by-rank-math/rank-math.php'];
if (in_array($plugin_file, $protected_plugins)) {
unset($actions['deactivate']);
}
return $actions;
}, 10, 2);
// 禁止站点管理员安装新主题
remove_action('admin_menu', 'current_theme_info');
6.3 数据库备份策略
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 #!/bin/bash
# 多站点数据库备份脚本
DB_NAME="wordpress"
DB_USER="wp_user"
DB_PASS="your_password"
BACKUP_DIR="/backup/wordpress"
DATE=$(date +%Y%m%d_%H%M%S)
# 创建备份目录
mkdir -p $BACKUP_DIR
# 导出完整数据库
mysqldump -u$DB_USER -p$DB_PASS $DB_NAME | gzip > $BACKUP_DIR/db_full_$DATE.sql.gz
# 仅导出特定站点数据(站点ID=2)
mysqldump -u$DB_USER -p$DB_PASS $DB_NAME $(mysql -u$DB_USER -p$DB_PASS $DB_NAME -e "SHOW TABLES LIKE 'wp_2_%'" | grep wp_2_ | tr '
' ' ') | gzip > $BACKUP_DIR/site2_$DATE.sql.gz
# 保留最近30天的备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +30 -delete
echo "Backup completed: $BACKUP_DIR/db_full_$DATE.sql.gz"
七、常见问题与故障排查
7.1 重定向循环问题
这是多站点最常见的故障之一,通常由域名映射配置不正确引起:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 // 检查 wp_options 表中的 siteurl 和 home
wp option get siteurl --url=brand-a.com
wp option get home --url=brand-a.com
// 如果值不匹配,手动修复
wp option update siteurl https://brand-a.com --url=brand-a.com
wp option update home https://brand-a.com --url=brand-a.com
// 检查 wp_blogs 表中的 domain 字段
wp db query "SELECT blog_id, domain, path FROM wp_blogs"
// 清除缓存后重试
wp cache flush
wp redis flush
7.2 上传文件路径错误
某些旧版插件可能无法正确处理多站点的媒体路径,需要在
1 | wp-config.php |
中显式设置:
1
2
3
4
5 // 确保上传路径正确
define('UPLOADS', 'wp-content/uploads');
// 修复 MS_FILES 重写(如果使用旧版多站点)
define('UPLOADBLOGSDIR', 'wp-content/blogs.dir');
7.3 内存不足错误
多站点模式下PHP内存消耗更大,建议适当增加内存限制:
1
2
3
4
5
6
7 // wp-config.php
define('WP_MEMORY_LIMIT', '512M');
define('WP_MAX_MEMORY_LIMIT', '1024M');
// php.ini 或 php-fpm pool 配置
memory_limit = 512M
max_execution_time = 300
7.4 站点迁移与导入
将单站点迁移到多站点网络或在不同多站点网络间迁移站点时,需要特别处理数据库表前缀:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 # 导出单站点数据
wp db export single-site.sql
# 修改表前缀以匹配目标多站点结构
sed -i 's/`wp_/`wp_5_/g' single-site.sql
# 导入到多站点的特定子站点
wp db import single-site.sql
# 更新该站点的URL
wp search-replace 'old-domain.com' 'site5.example.com' --url=site5.example.com
# 重建该站点的用户关联
wp user import-csv users.csv --url=site5.example.com
八、进阶配置与最佳实践
8.1 多站点邮件配置
多站点网络中各站点可能需要独立的邮件发送配置,推荐使用SMTP插件并配置网络级默认值:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 // 在 wp-config.php 中设置默认SMTP
define('SMTP_HOST', 'smtp.sendgrid.net');
define('SMTP_PORT', 587);
define('SMTP_USER', 'apikey');
define('SMTP_PASS', 'your_api_key');
define('SMTP_FROM', 'noreply@example.com');
define('SMTP_FROM_NAME', 'Site Network');
// 在 functions.php 中为每个站点定制发件人
add_filter('wp_mail_from', function($from_email) {
$blog_id = get_current_blog_id();
$custom_from = [
2 => 'noreply@brand-a.com',
3 => 'noreply@brand-b.com',
];
return isset($custom_from[$blog_id]) ? $custom_from[$blog_id] : $from_email;
});
8.2 使用 sunset_{$key} 钩子清理站点
当删除一个子站点时,WordPress会触发
1 | delete_blog |
动作,你可以利用它清理关联数据:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 // 在 mu-plugins 中注册清理函数
add_action('delete_blog', function($blog_id, $drop) {
// 清理CDN缓存
$cdn_api = get_site_option('cdn_api_key');
if ($cdn_api) {
wp_remote_post("https://api.cloudflare.com/client/v4/zones/purge_cache", [
'headers' => [
'Authorization' => 'Bearer ' . $cdn_api,
'Content-Type' => 'application/json',
],
'body' => json_encode(['files' => ["https://*.example.com/sites/{$blog_id}/"]]),
]);
}
// 记录删除日志
error_log("Site {$blog_id} deleted at " . current_time('mysql'));
}, 10, 2);
8.3 多站点API扩展
WordPress REST API在多站点模式下默认不暴露站点列表,可以通过自定义端点扩展:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 // 注册自定义REST API端点:获取所有站点列表
add_action('rest_api_init', function() {
register_rest_route('multisite/v1', '/sites', [
'methods' => 'GET',
'callback' => function($request) {
$sites = get_sites([
'public' => 1,
'deleted' => 0,
'number' => 100,
]);
$result = [];
foreach ($sites as $site) {
$result[] = [
'id' => $site->blog_id,
'url' => $site->siteurl,
'name' => get_blog_option($site->blog_id, 'blogname'),
'description' => get_blog_option($site->blog_id, 'blogdescription'),
];
}
return $result;
},
'permission_callback' => function() {
return current_user_can('manage_network');
},
]);
});
总结
WordPress多站点网络是一个功能强大但配置复杂的功能。通过本文的详细指南,你应该能够完成从安装启用、域名映射、SSL配置到性能优化和安全加固的全流程工作。关键要点总结如下:
- 启用前务必备份现有网站数据和数据库
- 根据使用场景选择子域名或子目录模式
- 域名映射需要DNS、服务器和WordPress三层配合
- 多站点的性能优化应从数据库、对象缓存和页面缓存三个层面同时入手
- 安全管理的核心是超级管理员权限控制和网络级插件策略
- 定期备份和监控是多站点长期稳定运行的保障
对于规模较大的多站点网络(超过50个子站点),建议引入专业的监控工具(如New Relic、Datadog)来追踪各站点的性能指标,并考虑使用负载均衡和数据库读写分离来应对高并发场景。多站点网络的成功不仅取决于初始配置的正确性,更在于持续的优化和运维实践。
汤不热吧