在单台服务器上托管多个 WordPress 站点,核心思路是通过域名区分站点(虚拟主机),每个站点拥有独立的目录、数据库和配置文件。以下是基于 Nginx 和 Apache 的实现方案:
✅ 前提条件
- 已安装 Web 服务器(Nginx 或 Apache)
- 已安装 PHP(建议版本 ≥ 7.4)、MySQL/MariaDB
- 已配置 DNS(将多个域名指向同一服务器 IP)
- 每个站点需要独立域名(如
site1.com,site2.com)
🌐 方案一:使用 Nginx + PHP-FPM
步骤 1:创建站点目录结构
sudo mkdir -p /var/www/site1.com/public_html
sudo mkdir -p /var/www/site2.com/public_html
sudo chown -R www-data:www-data /var/www/site1.com
sudo chown -R www-data:www-data /var/www/site2.com
步骤 2:下载并部署 WordPress
对每个站点重复以下操作:
cd /var/www/site1.com/public_html
curl -O https://wordpress.org/latest.tar.gz
tar -xzf latest.tar.gz --strip-components=1
rm latest.tar.gz
步骤 3:创建独立数据库
CREATE DATABASE site1_db;
CREATE USER 'site1_user'@'localhost' IDENTIFIED BY 'strong_password';
GRANT ALL PRIVILEGES ON site1_db.* TO 'site1_user'@'localhost';
FLUSH PRIVILEGES;
为 site2 重复此步骤,命名改为
site2_db等。
步骤 4:配置 Nginx 虚拟主机
编辑 /etc/nginx/sites-available/site1.com:
server {
listen 80;
server_name site1.com www.site1.com;
root /var/www/site1.com/public_html;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ .php$ {
fastcgi_pass unix:/run/php/php8.1-fpm.sock; # 根据实际 PHP 版本调整
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 禁止访问 wp-config.php
location = /wp-config.php { deny all; }
}
启用站点:
sudo ln -s /etc/nginx/sites-available/site1.com /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
为 site2 创建类似配置,修改
server_name、root、fastcgi_pass(若共用 PHP-FPM 则 socket 可相同)。
步骤 5:设置正确权限(安全加固)
sudo find /var/www/site1.com -type f -exec chmod 644 {} ;
sudo find /var/www/site1.com -type d -exec chmod 755 {} ;
sudo chmod 777 /var/www/site1.com/public_html/wp-content/uploads
🌐 方案二:使用 Apache + mod_php 或 PHP-FPM
步骤 1:启用必要模块
sudo a2enmod rewrite ssl headers
sudo systemctl restart apache2
步骤 2:创建站点目录(同上)
步骤 3:创建 .htaccess(WordPress 自动包含标准规则)
确保每个站点的 public_html/.htaccess 存在(WordPress 安装时自动生成)。
步骤 4:配置 Apache VirtualHost
编辑 /etc/apache2/sites-available/site1.conf:
<VirtualHost *:80>
ServerName site1.com
ServerAlias www.site1.com
DocumentRoot /var/www/site1.com/public_html
<Directory /var/www/site1.com/public_html>
AllowOverride All
Require all granted
</Directory>
# 可选:PHP-FPM 处理(推荐用于性能优化)
# <FilesMatch .php$>
# SetHandler "proxy:unix:/run/php/php8.1-fpm.sock|fcgi://localhost/"
# </FilesMatch>
</VirtualHost>
启用站点:
sudo a2ensite site1.conf
sudo a2dissite 000-default.conf # 禁用默认站点
sudo systemctl restart apache2
为 site2 创建
site2.conf,修改对应参数。
🔐 安全与运维建议
| 项目 | 建议 |
|---|---|
| SSL 证书 | 使用 Let’s Encrypt 为每个域名单独申请证书(Certbot 支持多域名) |
| 隔离性 | 每个站点独立用户/权限,避免跨站文件泄露 |
| 备份 | 定期备份各站点数据库 + 文件(可用 mysqldump + rsync) |
| 更新管理 | 分别登录各 WP 后台更新插件/主题,或使用 WP-CLI 批量操作 |
| 资源限制 | 在 Nginx/Apache 中设置 limit_req_zone 或 LimitRequestBody 防止 DDoS |
🧪 验证是否成功
- 访问
http://site1.com→ 应看到 site1 的 WordPress 首页 - 访问
http://site2.com→ 应看到 site2 的独立内容 - 检查数据库:
mysql -u root -p→SHOW DATABASES;应看到两个独立库 - 测试 PHP 执行:创建
info.php含<?php phpinfo(); ?>,确认无冲突
⚠️ 注意事项
- ❌ 不要共享
wp-config.php(必须每个站点独立) - ❌ 避免所有站点共用同一个 MySQL 用户(权限最小化原则)
- ✅ 推荐使用 Multisite 仅适用于同一品牌下子站(如 blog1.example.com, blog2.example.com),不适用于完全独立的商业站点
需要我提供一键部署脚本(Bash)或 Docker 化方案吗?
PHPWP博客