使用Nginx或Apache如何实现一台服务器托管多个WordPress?

在单台服务器上托管多个 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

🧪 验证是否成功

  1. 访问 http://site1.com → 应看到 site1 的 WordPress 首页
  2. 访问 http://site2.com → 应看到 site2 的独立内容
  3. 检查数据库:mysql -u root -p → SHOW DATABASES; 应看到两个独立库
  4. 测试 PHP 执行:创建 info.php 含 <?php phpinfo(); ?>,确认无冲突

⚠️ 注意事项

  • ❌ 不要共享 wp-config.php(必须每个站点独立)
  • ❌ 避免所有站点共用同一个 MySQL 用户(权限最小化原则)
  • ✅ 推荐使用 Multisite 仅适用于同一品牌下子站(如 blog1.example.com, blog2.example.com),不适用于完全独立的商业站点

需要我提供一键部署脚本(Bash)或 Docker 化方案吗?