在同一台服务器上部署多个 WordPress 站点,核心思路只有一个:Nginx/Apache 虚拟主机(Virtual Host)配置 + 独立的数据库实例 + 隔离的文件目录。
别被那些“容器化”、“K8s”的大词吓到,对于大多数中小规模需求,传统的 LAMP/LNMP 架构配合 Nginx Server Block 是最稳定、最省资源、也最容易维护的方案。下面我按实战逻辑给你拆解。
一、 前置准备:理清资源边界
在动手之前,先明确几个关键点,这决定了你后续的架构复杂度:
- Web 服务器:推荐 Nginx。相比 Apache,Nginx 在处理并发和静态资源方面更轻量,且通过
server_name区分域名的配置方式极其清晰。 - PHP-FPM:建议为每个站点或每组站点使用不同的 PHP-FPM pool。虽然可以共用一个 pool,但如果某个站点因为插件冲突导致 PHP 崩溃,会影响同服务器的其他站点。独立 Pool 能实现故障隔离。
- 数据库:MySQL/MariaDB。必须为每个 WordPress 创建独立的数据库和用户。绝对不要让两个 WP 共用同一个数据库前缀或用户权限,这是安全红线。
- 域名解析:确保你的域名 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 或多台云服务器:
- 单个站点日均 PV 超过 5 万,且并发较高。
- 需要频繁进行灰度发布、A/B 测试,传统部署回滚成本高。
- 不同站点使用不同版本的 PHP(如一个用 7.4,一个用 8.2),此时 Docker 是唯一优雅解法。
- 业务增长迅速,需要弹性伸缩。
总结
在同一台服务器部署多个 WordPress,本质上是资源的多路复用。关键在于:
- 配置隔离(Nginx server block)
- 数据隔离(独立 DB 用户)
- 进程隔离(可选独立 PHP-FPM pool)
- 自动化运维(SSL 证书、备份脚本)
只要做好上述几点,一台 2C4G 的云主机跑 5-10 个中小型 WordPress 站点是完全可行的,成本极低且易于管理。
云技术博客