努力
加油

如何在同一台服务器上部署多个WordPress站点?

在同一台服务器上部署多个 WordPress 站点,核心思路只有一个:Nginx/Apache 虚拟主机(Virtual Host)配置 + 独立的数据库实例 + 隔离的文件目录。

别被那些“容器化”、“K8s”的大词吓到,对于大多数中小规模需求,传统的 LAMP/LNMP 架构配合 Nginx Server Block 是最稳定、最省资源、也最容易维护的方案。下面我按实战逻辑给你拆解。

一、 前置准备:理清资源边界

在动手之前,先明确几个关键点,这决定了你后续的架构复杂度:

  1. Web 服务器:推荐 Nginx。相比 Apache,Nginx 在处理并发和静态资源方面更轻量,且通过 server_name 区分域名的配置方式极其清晰。
  2. PHP-FPM:建议为每个站点或每组站点使用不同的 PHP-FPM pool。虽然可以共用一个 pool,但如果某个站点因为插件冲突导致 PHP 崩溃,会影响同服务器的其他站点。独立 Pool 能实现故障隔离。
  3. 数据库:MySQL/MariaDB。必须为每个 WordPress 创建独立的数据库和用户。绝对不要让两个 WP 共用同一个数据库前缀或用户权限,这是安全红线。
  4. 域名解析:确保你的域名 A 记录都指向这台服务器的 IP。如果是子域名(如 blog.example.com),记得添加对应的 CNAME 或 A 记录。

二、 标准部署流程(以 LNMP 环境为例)

假设你已经装好了 Nginx、MySQL 和 PHP。我们以部署第二个站点 site2.com 为例,第一个站点 site1.com 已经存在。

1. 创建网站目录结构

保持目录清晰是后期运维的生命线。建议采用如下结构:

/var/www/
├── site1.com/
│   ├── html/          # 存放 wp-content, wp-config.php 等
│   └── logs/          # 访问日志和错误日志
└── site2.com/
    ├── html/
    └── logs/

执行命令创建目录并赋予权限:

sudo mkdir -p /var/www/site2.com/html
sudo chown -R www-data:www-data /var/www/site2.com

注意:www-data 是 Ubuntu/Debian 下 Nginx 和 PHP 的默认运行用户。CentOS 下通常是 nginx 或 apache。请根据你的系统调整。

2. 配置 MySQL 数据库

登录 MySQL:

mysql -u root -p

依次执行以下 SQL(替换为你的实际信息):

-- 创建专用数据库
CREATE DATABASE site2_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 创建专用用户并授权(强烈建议不要用 root)
CREATE USER 'site2_user'@'localhost' IDENTIFIED BY 'your_strong_password';
GRANT ALL PRIVILEGES ON site2_db.* TO 'site2_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

3. 下载并解压 WordPress

cd /var/www/site2.com/html
wget https://wordpress.org/latest.tar.gz
tar -xzvf latest.tar.gz
mv wordpress/* .
rm -rf wordpress latest.tar.gz

4. 配置 Nginx Server Block

这是最关键的一步。在 /etc/nginx/sites-available/ 下创建一个新文件,例如 site2.com:

server {
    listen 80;
    server_name site2.com www.site2.com;

    root /var/www/site2.com/html;
    index index.php index.html index.htm;

    # 日志路径,方便排查问题
    access_log /var/www/site2.com/logs/access.log;
    error_log /var/www/site2.com/logs/error.log;

    # 禁止访问隐藏文件(如 .git, .env)
    location ~ /. {
        deny all;
    }

    # 静态资源缓存优化
    location ~* .(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    # PHP 处理
    location ~ .php$ {
        include snippets/fastcgi-php.conf;
        # 【重要】这里指定特定的 PHP-FPM socket 或端口
        # 如果共用 pool,写 fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        # 如果有独立 pool,建议配置类似:fastcgi_pass unix:/run/php/php7.4-site2-fpm.sock;
        fastcgi_pass unix:/run/php/php7.4-fpm.sock; 
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # WordPress 伪静态规则
    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    # 禁止 wp-config.php 被访问
    location ~ /wp-config.php$ {
        deny all;
    }
}

启用配置并重启 Nginx:

sudo ln -s /etc/nginx/sites-available/site2.com /etc/nginx/sites-enabled/
sudo nginx -t  # 检查语法
sudo systemctl reload nginx

5. 配置 PHP-FPM(可选但推荐)

如果你希望每个站点有独立的 PHP 进程池,可以在 /etc/php/7.4/fpm/pool.d/ 下复制一份 www.conf 并重命名为 site2.conf,修改其中的 [site2] 名称、listen 路径(如 /run/php/php7.4-site2-fpm.sock)以及 user/group。然后重启 PHP-FPM。

如果只是简单部署,共用主 pool 也可以,但要注意内存限制。

6. 完成安装

浏览器访问 http://site2.com,按照 WordPress 可视化向导输入之前创建的数据库信息,完成安装。


三、 进阶优化与避坑指南

1. SSL/HTTPS 证书管理

现在没有 HTTPS 的网站很难生存。推荐使用 Certbot (Let’s Encrypt) 自动化管理证书。

sudo certbot --nginx -d site2.com -d www.site2.com

Certbot 会自动修改你的 Nginx 配置文件,添加 HTTPS 监听和重定向规则,非常省心。

2. 性能优化:对象缓存

WordPress 对数据库查询很敏感。在多站点场景下,建议安装 Redis Object Cache 插件。

  • 服务端安装 Redis:sudo apt install redis-server
  • 客户端配置 WP 插件连接本地 Redis。
  • 这能极大降低多站点同时在线时的数据库压力。

3. 备份策略

不要依赖单一机制。

  • 文件备份:使用 rsync 或 tar 定期打包 /var/www/site2.com 目录。
  • 数据库备份:使用 mysqldump 定时导出 site2_db。
  • 工具推荐:可以使用 UpdraftPlus 插件做远程备份(存到 OSS/S3),或者用 Cron 脚本结合 rclone 自动同步到云存储。

4. 安全加固

  • 禁用 XML-RPC:除非你需要 Jetpack 或移动应用发布,否则在 Nginx 中直接拒绝请求:
    location = /xmlrpc.php {
        deny all;
    }
  • 限制上传大小:在 php.ini 或站点专属 php.ini 中调整 upload_max_filesize 和 post_max_size,防止恶意大文件上传拖垮服务器。
  • 防火墙:只开放 80/443 和 SSH 端口,关闭不必要的服务端口。

5. 常见问题排查

  • 502 Bad Gateway:通常是 PHP-FPM 挂了或没启动。检查 systemctl status php7.4-fpm。
  • 403 Forbidden:通常是目录权限不对。确保 www-data 用户对 /var/www/site2.com/html 有读取和执行权限。
  • 白屏:查看 error.log,90% 的情况是 PHP 内存不足或插件冲突。临时将 WP_MEMORY_LIMIT 调高到 256M 试试。

四、 什么时候该考虑分离部署?

如果满足以下任一情况,建议不要再堆叠在一台服务器上,而是迁移到 Docker Compose 或多台云服务器:

  1. 单个站点日均 PV 超过 5 万,且并发较高。
  2. 需要频繁进行灰度发布、A/B 测试,传统部署回滚成本高。
  3. 不同站点使用不同版本的 PHP(如一个用 7.4,一个用 8.2),此时 Docker 是唯一优雅解法。
  4. 业务增长迅速,需要弹性伸缩。

总结

在同一台服务器部署多个 WordPress,本质上是资源的多路复用。关键在于:

  1. 配置隔离(Nginx server block)
  2. 数据隔离(独立 DB 用户)
  3. 进程隔离(可选独立 PHP-FPM pool)
  4. 自动化运维(SSL 证书、备份脚本)

只要做好上述几点,一台 2C4G 的云主机跑 5-10 个中小型 WordPress 站点是完全可行的,成本极低且易于管理。