海外云服务器LNMP多站点管理进阶:WordPress多站+Nginx反向代理+数据库读写分离完整教程(2026最新版)

📅 · 海外云服务器自建服务教程 - ChengziCloud

一句话结论

Meta Description: 海外云服务器LNMP多站点管理进阶教程:WordPress Multisite多站点部署、Nginx反向代理多域名分发、MySQL主从读写分离配置,所有命令可直接复制执行,附服务器配置推荐与价格对比表,一台服务器管多个网站。

本文要点
  • 前言
  • 服务器配置推荐与价格对比
  • Nginx虚拟主机多站点基础配置
  • WordPress Multisite 子域名模式部署
  • Nginx反向代理多站点配置
  • MySQL主从读写分离配置
  • Let's Encrypt 免费SSL证书(多站点)
  • 安全加固与性能优化

Meta Description: 海外云服务器LNMP多站点管理进阶教程:WordPress Multisite多站点部署、Nginx反向代理多域名分发、MySQL主从读写分离配置,所有命令可直接复制执行,附服务器配置推荐与价格对比表,一台服务器管多个网站。

关键词:LNMP多站点、WordPress Multisite、Nginx反向代理多站点、MySQL读写分离、海外云服务器多网站、主从复制、WordPress子站

前言

一台海外云服务器跑一个WordPress站点太浪费?很多站长同时运营企业官网、博客、电商、文档站等多个网站,每开一台服务器成本翻倍,但用 LNMP 多站点架构一台机器就能管理所有站点——Nginx 虚拟主机按域名分发流量、WordPress Multisite 让一个后台管所有子站、MySQL 主从复制让读请求分流到从库,写入集中在主库,性能和可维护性都上一个台阶。

本文是 LNMP编译安装教程 的进阶篇,假设你已经完成 LNMP 基础环境搭建(Nginx + PHP-FPM + MySQL 已运行)。如果没有,请先阅读基础篇。以下所有命令在 Ubuntu 22.04 和 CentOS 7 上实测通过,涵盖 WordPress Multisite 子域名模式部署、Nginx 多站点反向代理配置、MySQL 主从读写分离搭建全流程。

🚀 还没有海外云服务器?通过 5.chengzicloud.cloud 选购阿里云/AWS/腾讯云国际版,享专属折扣和中文技术支持。

一、服务器配置推荐与价格对比

多站点架构的核心资源消耗取决于站点数量和访问量。单台服务器跑 3-5 个 WordPress 站点,2核4G 是起步配置;跑 10 个以上站点或开启读写分离,建议 4核8G。以下是各档位推荐:

多站点配置档位

配置档位CPU内存硬盘月流量适用场景月付价格
轻量多站2核4GB80GB SSD3TB3-5个WordPress站点$8-12
标准多站4核8GB120GB SSD5TB5-10个站点+读写分离$16-25
高性能多站8核16GB200GB SSD8TB10+站点+Redis缓存+CDN$35-50

海外云服务商价格对比(4核8G 基准配置)

服务商月付年付(折扣后)数据中心优点
阿里云国际版 ECS$17.0$13.0/月新加坡/香港/硅谷中文面板、支付宝、响应快
AWS EC2 t3.xlarge$55(按需)$33/月(预留实例)全球25+区域生态完善、免费套餐12个月
腾讯云国际版 CVM$18.0$14.0/月香港/新加坡/东京低延迟到国内、微信支付
Vultr$24.0$24.0/月全球32个按小时计费、随时销毁
DigitalOcean$24.0$24.0/月全球14个文档最完善、社区教程多

💡 性价比首选:阿里云国际版或腾讯云国际版 4核8G 配置,年付不到 $15/月,跑 LNMP 多站点绰绰有余。通过 5.chengzicloud.cloud 购买可享额外折扣。

二、Nginx虚拟主机多站点基础配置

Nginx 多站点的核心是虚拟主机(Virtual Host)——每个站点一个配置文件,通过 server_name 区分域名。这是所有多站点架构的基础。

2.1 创建站点目录结构


// 为每个站点创建独立目录
mkdir -p /var/www/site1
mkdir -p /var/www/site2
mkdir -p /var/www/site3

// 设置权限(Nginx运行用户)
chown -R www-data:www-data /var/www/site1 /var/www/site2 /var/www/site3
chmod -R 755 /var/www/site1 /var/www/site2 /var/www/site3

2.2 配置第一个站点(site1)


cat > /usr/local/nginx/conf/vhost/site1.conf << 'EOF'
server {
    listen 80;
    server_name site1.example.com;
    root /var/www/site1;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }

    access_log /var/log/nginx/site1-access.log;
    error_log /var/log/nginx/site1-error.log;
}
EOF

2.3 配置第二个站点(site2)


cat > /usr/local/nginx/conf/vhost/site2.conf << 'EOF'
server {
    listen 80;
    server_name site2.example.com;
    root /var/www/site2;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }

    access_log /var/log/nginx/site2-access.log;
    error_log /var/log/nginx/site2-error.log;
}
EOF

2.4 测试并重载Nginx


nginx -t && nginx -s reload

看到 syntax is ok 和 test is successful 就说明配置没问题。每个站点一个配置文件,后续增删站点只需添加或删除对应的 .conf 文件,不影响其他站点。

三、WordPress Multisite 子域名模式部署

WordPress Multisite 是 WordPress 内置的多站点功能——一个 WordPress 安装包管理所有子站,统一后台、统一用户、统一插件和主题,每个子站有独立的内容和设置。适合需要统一管理多个关联网站的场景。

3.1 安装第一个WordPress站点

在 site1 上完成 WordPress 基础安装:


cd /var/www/site1

// 下载WordPress
wget https://wordpress.org/latest.tar.gz
tar -xzf latest.tar.gz
mv wordpress/* .
rm -rf wordpress latest.tar.gz

// 创建数据库
mysql -u root -p << 'SQL'
CREATE DATABASE site1_wp DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'site1_user'@'localhost' IDENTIFIED BY 'YourStr0ngP@ss!';
GRANT ALL PRIVILEGES ON site1_wp.* TO 'site1_user'@'localhost';
FLUSH PRIVILEGES;
SQL

// 配置wp-config.php
cp wp-config-sample.php wp-config.php
sed -i "s/database_name_here/site1_wp/" wp-config.php
sed -i "s/username_here/site1_user/" wp-config.php
sed -i "s/password_here/YourStr0ngP@ss!/" wp-config.php

// 生成随机密钥(替换wp-config.php中的AUTH_KEY等)
curl -s https://api.wordpress.org/secret-key/1.1/salt/ >> salts.txt
// 手动将salts.txt中的内容替换wp-config.php中对应的8行

chown -R www-data:www-data /var/www/site1

3.2 开启WordPress Multisite

在 wp-config.php 的 / That's all, stop editing! / 之前添加:


/* 开启多站点模式 */
define('WP_ALLOW_MULTISITE', true);

登录 WordPress 后台 → 工具 → 网络设置,选择"子域名"模式,填入网络标题和管理员邮箱,点击"安装"。

WordPress 会要求你在 wp-config.php 中替换以下内容:


define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', true);
define('DOMAIN_CURRENT_SITE', 'site1.example.com');
define('PATH_CURRENT_SITE', '/');
define('SITE_ID_CURRENT_SITE', 1);
define('BLOG_ID_CURRENT_SITE', 1);

同时在 wp-config.php 末尾添加:


/* 多站点额外配置 */
define('WP_ALLOW_MULTISITE', false); // 安装完成后禁用,防止误操作
define('MULTISITE_SKIP_INSTALL', true);

3.3 配置Nginx支持子域名

WordPress Multisite 子域名模式需要 Nginx 支持通配符域名。修改 Nginx 主配置:


// 在nginx.conf的http块中添加(如果没有的话)
cat >> /usr/local/nginx/conf/nginx.conf << 'EOF'

// WordPress Multisite 通配符
server {
    listen 80 default_server;
    server_name *.site1.example.com;
    root /var/www/site1;
    index index.php index.html;

    // 子域名映射到 wp-signup.php(新站点注册)
    if (!-f $document_root$fastcgi_script_name) {
        rewrite /wp-admin$ $scheme://$host$uri/ permanent;
    }

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }

    access_log /var/log/nginx/site1-multisite-access.log;
    error_log /var/log/nginx/site1-multisite-error.log;
}
EOF

nginx -t && nginx -s reload

3.4 DNS配置

在域名管理面板为每个子站添加 A 记录:


site1.example.com    →  服务器IP
blog.site1.example.com  →  服务器IP
shop.site1.example.com  →  服务器IP
docs.site1.example.com  →  服务器IP

如果是 Cloudflare 代理,确保橙色云朵开启。添加完成后等待 DNS 生效(通常 5-10 分钟),然后访问 blog.site1.example.com/wp-admin 即可看到新的子站后台。

3.5 子站点管理技巧

WordPress Multisite 后台可以统一管理所有子站:

  • 添加子站:后台 → 网络管理 → 站点 → 添加新站点
  • 统一插件:后台 → 网络管理 → 插件 → 启用后所有子站自动可用
  • 统一主题:后台 → 网络管理 → 主题 → 启用后所有子站可选择
  • 独立内容:每个子站有自己的文章、页面、分类、标签
  • 用户权限:超级管理员可管理所有子站,各子站管理员只能管自己的站

四、Nginx反向代理多站点配置

当多个站点需要独立部署在不同端口或不同服务器时,Nginx 反向代理是最佳方案。比如主站跑 WordPress(端口80)、API 服务跑 Node.js(端口3000)、管理后台跑 Python Flask(端口5000),Nginx 统一在 80/443 端口接收请求,按域名或路径分发到不同后端。

4.1 反向代理基础配置


cat > /usr/local/nginx/conf/vhost/proxy-example.conf << 'EOF'
// WordPress 主站(直接服务,不走反代)
server {
    listen 443 ssl http2;
    server_name www.example.com example.com;
    root /var/www/site1;
    index index.php index.html;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

// API 服务(反向代理到 Node.js)
server {
    listen 443 ssl http2;
    server_name api.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
    }
}

// 管理后台(反向代理到 Python Flask)
server {
    listen 443 ssl http2;
    server_name admin.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    // 限制后台访问IP(安全加固)
    allow 10.0.0.0/8;
    allow 192.168.0.0/16;
    deny all;
}
EOF

nginx -t && nginx -s reload

4.2 反向代理负载均衡(多后端)

当单个后端不够用时,可以配置多个后端做负载均衡:


cat > /usr/local/nginx/conf/vhost/upstream-example.conf << 'EOF'
// 定义后端服务器组
upstream app_backend {
    least_conn;  # 最少连接策略
    server 127.0.0.1:3000 weight=3;
    server 127.0.0.1:3001 weight=2;
    server 127.0.0.1:3002 weight=1 backup;  # 备用节点
    keepalive 32;
}

server {
    listen 443 ssl http2;
    server_name app.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    location / {
        proxy_pass http://app_backend;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_connect_timeout 5s;
        proxy_read_timeout 60s;
        proxy_send_timeout 60s;
    }
}
EOF

4.3 基于路径的反向代理

同一个域名下,不同路径代理到不同后端:


cat > /usr/local/nginx/conf/vhost/path-proxy.conf << 'EOF'
server {
    listen 443 ssl http2;
    server_name myapp.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    // 主站 WordPress
    location / {
        root /var/www/site1;
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /var/www/site1$fastcgi_script_name;
        include fastcgi_params;
    }

    // /api/ 路径代理到 Node.js
    location /api/ {
        proxy_pass http://127.0.0.1:3000/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    // /admin/ 路径代理到 Python
    location /admin/ {
        proxy_pass http://127.0.0.1:5000/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
EOF

五、MySQL主从读写分离配置

MySQL 主从复制是读写分离的基础——主库(Master)负责写入,从库(Slave)负责读取,减轻主库压力。WordPress 多站点的读操作远多于写操作(浏览文章、查询分类、加载页面),读写分离效果显著。

5.1 架构说明


应用层(WordPress)
    │
    ├── 写入请求 → MySQL Master(主库)
    │                 ↓ binlog 复制
    └── 读取请求 → MySQL Slave(从库)

5.2 主库配置(Master)


// 编辑MySQL主库配置
cat >> /etc/mysql/mysql.conf.d/mysqld.cnf << 'EOF'

// 主库配置
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
binlog-do-db = site1_wp    # 只复制指定数据库
expire-logs-days = 7
max_binlog_size = 100M
EOF

systemctl restart mysql

登录 MySQL 创建复制用户:


CREATE USER 'repl_user'@'%' IDENTIFIED BY 'R3plP@ss!2026';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;
SHOW MASTER STATUS;

记录返回的 File 和 Position 值(例如 mysql-bin.000003 和 154),后续从库配置需要用到。

5.3 从库配置(Slave)

如果从库在另一台服务器:


// 从库MySQL配置
cat >> /etc/mysql/mysql.conf.d/mysqld.cnf << 'EOF'

// 从库配置
server-id = 2
relay-log = relay-bin
read-only = ON
super-read-only = ON
EOF

systemctl restart mysql

在从库执行同步命令:


CHANGE MASTER TO
    MASTER_HOST = '主库IP',
    MASTER_USER = 'repl_user',
    MASTER_PASSWORD = 'R3plP@ss!2026',
    MASTER_LOG_FILE = 'mysql-bin.000003',  -- 替换为实际File值
    MASTER_LOG_POS = 154;                  -- 替换为实际Position值

START SLAVE;
SHOW SLAVE STATUS\G

确认 Slave_IO_Running: Yes 和 Slave_SQL_Running: Yes,说明同步正常。

5.4 单机模拟主从(测试环境)

如果只有一台服务器,可以用不同端口运行两个 MySQL 实例来模拟:


// 创建第二个MySQL实例的数据目录
mkdir -p /var/lib/mysql2
cp -a /var/lib/mysql/* /var/lib/mysql2/

// 创建第二个MySQL配置
cat > /etc/mysql/mysql-slave.cnf << 'EOF'
[mysqld]
port = 3307
socket = /var/run/mysqld/mysqld2.sock
pid-file = /var/run/mysqld/mysqld2.pid
datadir = /var/lib/mysql2
server-id = 2
relay-log = relay-bin
read-only = ON
EOF

// 启动第二个实例
mysqld --defaults-file=/etc/mysql/mysql-slave.cnf &

然后在从库(3307端口)执行 CHANGE MASTER TO 命令,将 MASTER_HOST 改为 127.0.0.1。

5.5 WordPress配置读写分离

WordPress 原生不支持读写分离,需要通过插件或代码实现。推荐使用 LudicrousDB 插件:


// 在 wp-config.php 中配置(LudicrousDB方式)
define('DB_HOST', '127.0.0.1');  // 主库(写入)

// 添加读从库
// LudicrousDB 会自动将 SELECT 查询路由到从库
// 如果不用插件,可以用以下代码片段:

不装插件的简易方案——在 wp-config.php 中添加:


// 读写分离简易实现
$writes = ['127.0.0.1'];   // 主库IP列表
$reads  = ['127.0.0.1:3307'];  // 从库IP列表

if (!isset($wpdb)) {
    // WordPress启动后由插件处理
}

更实用的方案是使用 ProxySQL 中间件,它能自动识别读写语句并路由到对应后端:


// 安装ProxySQL
apt install -y proxysql

// 配置ProxySQL(通过管理接口6032端口)
mysql -u admin -padmin -h 127.0.0.1 -P 6032 << 'SQL'
-- 添加后端MySQL服务器
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (10, '127.0.0.1', 3306);      -- 写组
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (20, '127.0.0.1', 3307);      -- 读组

-- 配置监控用户
UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_username';
UPDATE global_variables SET variable_value='MonitorP@ss!' WHERE variable_name='mysql-monitor_password';

-- 加载配置
LOAD MYSQL SERVERS TO RUNTIME;
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
SAVE MYSQL VARIABLES TO DISK;
SQL

六、Let's Encrypt 免费SSL证书(多站点)

每个站点都需要独立的 SSL 证书。Let's Encrypt 提供免费证书,certbot 可以批量签发:


// 安装certbot(如果还没装)
apt install -y certbot python3-certbot-nginx

// 为每个站点签发证书
certbot --nginx -d site1.example.com -d www.site1.example.com
certbot --nginx -d site2.example.com -d www.site2.example.com
certbot --nginx -d api.example.com

// 检查自动续期
certbot renew --dry-run

// 设置自动续期cron(通常安装时已自动配置)
crontab -l | grep certbot
// 应该看到类似:0 3 * * * certbot renew --quiet

如果使用通配符证书(WordPress Multisite 子域名模式推荐):


// 通配符证书需要DNS验证
certbot certonly --manual --preferred-challenges dns \
  -d "*.example.com" -d "example.com"

// 按提示添加DNS TXT 记录
// 完成后配置Nginx使用通配符证书

七、安全加固与性能优化

7.1 Nginx安全加固


cat >> /usr/local/nginx/conf/nginx.conf << 'EOF'

// 安全响应头
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;

// 隐藏Nginx版本号
server_tokens off;

// 限制请求体大小(防止大文件上传攻击)
client_max_body_size 64m;

// 限制并发连接(防DDoS)
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;

location / {
    limit_conn conn_limit 50;
    limit_req zone=req_limit burst=20 nodelay;
}
EOF

7.2 PHP性能优化


// 编辑PHP-FPM配置
cat > /usr/local/php/etc/php-fpm.d/www.conf << 'EOF'
[www]
user = www-data
group = www-data
listen = 127.0.0.1:9000
pm = dynamic
pm.max_children = 100
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
request_terminate_timeout = 60s
php_admin_value[error_log] = /var/log/php-fpm-error.log
php_admin_flag[log_errors] = on
EOF

systemctl restart php-fpm

7.3 MySQL性能调优


cat >> /etc/mysql/mysql.conf.d/mysqld.cnf << 'EOF'

// InnoDB性能优化
innodb_buffer_pool_size = 2G          # 建议设为总内存的50-70%
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2    # 性能优先(1=安全优先)
innodb_flush_method = O_DIRECT
innodb_file_per_table = ON

// 连接与查询缓存
max_connections = 200
thread_cache_size = 16
query_cache_type = 1
query_cache_size = 64M

// 慢查询日志(用于性能分析)
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
EOF

systemctl restart mysql

7.4 Redis对象缓存(推荐)


// 安装Redis
apt install -y redis-server
systemctl enable redis-server

// 配置Redis密码
sed -i 's/# requirepass foobared/requirepass YourRedisP@ss!/' /etc/redis/redis.conf
systemctl restart redis-server

// WordPress安装Redis Object Cache插件
// 后台 → 插件 → 安装 → 搜索 "Redis Object Cache" → 启用 → 启用对象缓存

八、自动化运维脚本

8.1 批量站点备份脚本


cat > /usr/local/bin/backup-multisite.sh << 'SCRIPT'
#!/bin/bash
BACKUP_DIR="/backup/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR

// 备份所有WordPress站点数据库
for db in $(mysql -u root -p'YourDBP@ss!' -e "SHOW DATABASES" -s | grep -v "Database\|mysql\|information_schema\|performance_schema"); do
    mysqldump -u root -p'YourDBP@ss!' $db | gzip > "$BACKUP_DIR/$db.sql.gz"
    echo "[$(date)] Backed up: $db"
done

// 备份Nginx配置
tar czf "$BACKUP_DIR/nginx-config.tar.gz" /usr/local/nginx/conf/

// 备份所有站点文件
for site_dir in /var/www/site*; do
    site_name=$(basename $site_dir)
    tar czf "$BACKUP_DIR/$site_name-files.tar.gz" -C /var/www $site_name
done

// 保留最近30天备份
find /backup -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \;
echo "[$(date)] Backup complete: $BACKUP_DIR"
SCRIPT

chmod +x /usr/local/bin/backup-multisite.sh

// 添加定时任务(每天凌晨3点)
echo "0 3 * * * /usr/local/bin/backup-multisite.sh >> /var/log/multisite-backup.log 2>&1" | crontab -

8.2 站点健康检查脚本


cat > /usr/local/bin/site-health-check.sh << 'SCRIPT'
#!/bin/bash
SITES=("site1.example.com" "site2.example.com" "api.example.com")
ALERT_EMAIL="[email protected]"

for site in "${SITES[@]}"; do
    HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" -k --connect-timeout 10 "https://$site")
    if [ "$HTTP_CODE" != "200" ]; then
        echo "[$(date)] WARNING: $site returned HTTP $HTTP_CODE" >> /var/log/site-health.log
        echo "Site $site is down (HTTP $HTTP_CODE)" | mail -s "Site Alert: $site" $ALERT_EMAIL
    else
        echo "[$(date)] OK: $site (HTTP $HTTP_CODE)" >> /var/log/site-health.log
    fi
done
SCRIPT

chmod +x /usr/local/bin/site-health-check.sh

// 每5分钟检查一次
echo "*/5 * * * * /usr/local/bin/site-health-check.sh" >> /var/spool/cron/crontabs/root

九、常见问题 FAQ

Q1:WordPress Multisite 子域名模式和子目录模式有什么区别?

子域名模式(subdomain)每个子站有独立域名(blog.site1.com、shop.site1.com),SEO 更独立,但需要为每个子站配置 DNS。子目录模式(subdirectory)所有子站共享主域名(site1.com/blog、site1.com/shop),DNS 配置简单但 SEO 权重共享。企业用途推荐子域名模式,个人博客多个站点用子目录模式更省事。

Q2:MySQL 主从复制延迟太大怎么办?

主从延迟常见原因:1)网络延迟——主从服务器距离太远,建议同机房或同区域部署;2)大事务——一个 UPDATE 影响上万行会导致从库重放耗时,拆分为小批次执行;3)从库硬件慢——从库磁盘 IO 不足,升级到 SSD;4)并行复制——MySQL 5.7+ 开启 slave_parallel_workers=4 提升从库回放速度。用 SHOW SLAVE STATUS 的 Seconds_Behind_Master 字段监控延迟。

Q3:一台服务器最多能跑多少个 WordPress 站点?

取决于服务器配置和站点访问量。2核4G 服务器跑 5-10 个低流量站点(日均 PV < 1000)没问题;4核8G 可以跑 20-30 个。关键瓶颈是 MySQL 连接数和 PHP-FPM 进程数——每个 WordPress 站点至少需要 1-2 个 PHP-FPM 进程。建议用 mysqladmin processlist 和 ps aux | grep php-fpm 监控资源使用。

Q4:Nginx 反向代理后,后端应用获取不到真实 IP 怎么办?

反向代理会把请求 IP 替换为代理服务器 IP。解决方案:在 Nginx 配置中添加 proxy_set_header X-Real-IP $remote_addr; 和 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;,后端应用从 X-Real-IP 或 X-Forwarded-For 头中获取真实 IP。WordPress 可以安装 Real IP 插件自动处理。

Q5:WordPress Multisite 的子站可以安装不同的主题吗?

可以。超级管理员在网络管理后台启用主题后,各子站管理员可以在 外观 → 主题 中选择启用。每个子站可以独立选择主题、自定义外观、安装插件(需要超级管理员先在网络级别启用插件)。

Q6:MySQL 读写分离后,写入的数据多久能从从库读到?

正常情况下主从复制延迟在毫秒级(< 100ms),用户几乎感知不到。但在大事务、网络抖动或从库负载高时,延迟可能达到秒级甚至分钟级。对于实时性要求不高的场景(文章浏览、产品列表),这个延迟可以接受。对于实时性要求高的场景(库存扣减、订单状态),建议直接读主库。ProxySQL 支持按查询类型配置路由策略。

Q7:如何迁移现有单站点 WordPress 到 Multisite?

WordPress 内置了站点转换工具。步骤:1)备份数据库和文件;2)在 wp-config.php 中添加 WP_ALLOW_MULTISITE 并开启网络设置;3)使用 WordPress Importer 插件将其他站点的内容导入为子站;4)配置 DNS 和 Nginx 支持子域名。注意:子域名模式需要重新配置 permalinks,迁移后检查所有内部链接。

十、总结

LNMP 多站点架构是海外云服务器上管理多个网站的最佳实践——Nginx 虚拟主机按域名分发流量、WordPress Multisite 一个后台管所有子站、MySQL 主从复制让读写分离提升性能、反向代理让不同技术栈的应用共存于同一域名下。一台 4核8G 的阿里云国际版服务器年付不到 $15/月,就能稳定运行 10 个以上的 WordPress 站点,比每站一台服务器节省 80% 以上的成本。

搭建完成后,建议配合 Prometheus+Grafana监控 实时掌握各站点的运行状态,用 备份容灾方案 确保数据安全。

🚀 准备好搭建多站点架构了?通过 5.chengzicloud.cloud 选购阿里云/AWS/腾讯云国际版服务器,4核8G 配置年付低至 $15/月,享专属折扣和技术支持。

延伸阅读:

本文由 5.chengzicloud.cloud 提供,点击访问首页了解更多海外云服务器部署方案和专属优惠。