在一台服务器上部署两个独立的 WordPress 实例,核心思路是“资源隔离”与“路径/域名区分”。
作为在云计算和运维领域深耕多年的技术人员,我推荐两种主流且稳定的方案。选择哪种取决于你的业务场景、技术栈偏好以及是否希望利用云厂商的负载均衡能力。
方案一:Nginx 反向X_X + 多站点(Subdirectory/Subdomain)
适用场景:两个网站内容关联性强,或希望统一管理 SSL 证书,节省 IP 资源。
优点:配置集中,易于维护;无需额外购买独立服务器资源。
缺点:数据库共享(需不同前缀),插件冲突风险略高,单点故障影响所有站点。
步骤详解:
-
准备环境
- 安装 Nginx、PHP-FPM、MySQL/MariaDB。
- 确保 PHP-FPM 支持多个池(pool),或者使用同一个 pool 但通过
fastcgi_pass区分。
-
创建数据库和用户
CREATE DATABASE wp_site1_db; CREATE USER 'wp_user1'@'localhost' IDENTIFIED BY 'password1'; GRANT ALL PRIVILEGES ON wp_site1_db.* TO 'wp_user1'@'localhost'; CREATE DATABASE wp_site2_db; CREATE USER 'wp_user2'@'localhost' IDENTIFIED BY 'password2'; GRANT ALL PRIVILEGES ON wp_site2_db.* TO 'wp_user2'@'localhost'; FLUSH PRIVILEGES; -
下载并解压 WordPress
cd /var/www/html wget https://wordpress.org/latest.tar.gz tar xzvf latest.tar.gz mv wordpress site1 cp -r site1 site2 chown -R www-data:www-data /var/www/html/site1 /var/www/html/site2 -
配置 Nginx 虚拟主机
假设你使用子目录方式:example.com/site1和example.com/site2创建
/etc/nginx/sites-available/site1.conf:server { listen 80; server_name example.com; root /var/www/html/site1; index index.php index.html; location /site1 { try_files $uri $uri/ /site1/index.php?$args; } location ~ .php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; } location ~ /.ht { deny all; } }⚠️ 注意:上述配置为简化版。实际生产中,建议为每个站点创建独立的 Nginx 配置文件,并通过
server_name绑定不同域名,或使用子目录时正确设置location块。更常见的做法是使用子域名:site1.example.com→/var/www/html/site1site2.example.com→/var/www/html/site2
-
完成 WordPress 安装
- 访问
http://site1.example.com,按提示输入wp_site1_db的用户名密码。 - 访问
http://site2.example.com,按提示输入wp_site2_db的用户名密码。
- 访问
-
SSL 证书配置
- 使用 Certbot 自动申请 Let’s Encrypt 证书。
- 若共用域名,可使用 SNI 支持;若子域名,可为每个子域名单独申请证书。
方案二:Docker 容器化部署(推荐)
适用场景:需要高度隔离、快速迁移、避免依赖冲突,适合现代 DevOps 流程。
优点:完全隔离(进程、文件系统、网络),便于备份和恢复,可轻松扩展。
缺点:学习曲线稍高,需掌握 Docker 基础。
步骤详解:
-
安装 Docker 和 Docker Compose
curl -fsSL https://get.docker.com | sh sudo usermod -aG docker $USER # 安装 docker-compose(v2 已集成进 docker 命令) -
项目结构
/opt/wordpress-multi/ ├── site1/ │ ├── docker-compose.yml │ └── data/ # 存放 wp-content 等数据 ├── site2/ │ ├── docker-compose.yml │ └── data/ └── nginx-proxy/ # 可选:统一反向X_X ├── docker-compose.yml └── conf.d/ -
Site1 的
docker-compose.ymlversion: '3.8' services: db: image: mysql:5.7 volumes: - ./data/db:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: rootpass1 MYSQL_DATABASE: wp_site1 MYSQL_USER: wp_user1 MYSQL_PASSWORD: pass1 wordpress: depends_on: - db image: wordpress:latest ports: - "8081:80" volumes: - ./data/wp-content:/var/www/html/wp-content environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: wp_user1 WORDPRESS_DB_PASSWORD: pass1 WORDPRESS_DB_NAME: wp_site1 -
Site2 的
docker-compose.yml
类似 Site1,但修改端口为8082,数据库密码、用户名、卷路径等。 -
启动服务
cd /opt/wordpress-multi/site1 && docker compose up -d cd /opt/wordpress-multi/site2 && docker compose up -d -
反向X_X(可选但推荐)
使用 Nginx Proxy Manager 或 Caddy 实现域名解析到localhost:8081和localhost:8082,并自动管理 HTTPS。
关键注意事项(避坑指南)
-
性能瓶颈
- 单台服务器同时运行两个 WP 实例,CPU 和内存会成为瓶颈。
- 优化建议:
- 启用 OPcache(PHP)。
- 使用 Redis 或 Memcached 作为对象缓存。
- 限制 PHP-FPM 的最大子进程数(
pm.max_children)。 - 考虑使用云厂商的 CDN 提速静态资源。
-
安全隔离
- 即使在同一服务器,也要确保两个 WP 实例的
wp-config.php权限严格(chmod 600)。 - 防火墙仅开放必要端口(80/443)。
- 定期更新 WordPress 核心、主题和插件。
- 即使在同一服务器,也要确保两个 WP 实例的
-
备份策略
- 数据库:使用
mysqldump定时备份,或 MySQL 主从复制。 - 文件:将
wp-content/uploads目录单独备份。 - 容器化方案:直接备份 Docker Volume 中的数据目录即可。
- 数据库:使用
-
云厂商特定建议
- 如果使用阿里云 ECS 或腾讯云 CVM,建议开启快照功能,在重大操作前创建系统盘和数据盘快照。
- 若流量增长,可考虑将数据库迁移至云数据库 RDS,Web 层继续使用当前服务器或横向扩展。
总结
| 方案 | 复杂度 | 隔离性 | 资源利用率 | 推荐指数 |
|---|---|---|---|---|
| Nginx 多站点 | 中 | 低(共享 DB) | 高 | ⭐⭐⭐ |
| Docker 容器化 | 中高 | 高(完全隔离) | 中 | ⭐⭐⭐⭐⭐ |
最终建议:
如果你是初学者或追求简单,选 Nginx 多站点。
如果你注重稳定性、安全性和未来扩展性,强烈建议使用 Docker 容器化部署。这是目前业界最佳实践,尤其适合云计算环境。
CLOUD云枢