在 Linux 服务器上同时运行两个 WordPress 站点,核心思路是资源隔离与路由分发。根据服务器配置、运维习惯以及你对稳定性的要求,主要有三种主流方案。
以下从“最推荐(容器化)”到“传统方式”进行详细拆解,并附带关键配置要点。
方案一:Docker + Docker Compose(强烈推荐)
这是目前最主流、最干净、最容易迁移的方案。每个 WordPress 实例拥有独立的 PHP 版本、数据库和文件目录,互不干扰。
1. 架构设计
- Web 层:Nginx 作为反向X_X,根据域名将请求转发给不同的内部服务。
- 应用层:两个独立的
wordpress容器(php-fpm)。 - 数据层:两个独立的
mysql或mariadb容器(或者共用一个 MySQL 容器但使用不同数据库名,建议独立以保安全)。
2. 实施步骤概要
第一步:安装 Docker 和 Docker Compose
# CentOS/RHEL
sudo yum install -y docker-ce docker-compose-plugin
sudo systemctl enable --now docker
# Ubuntu/Debian
sudo apt update
sudo apt install -y docker.io docker-compose-plugin
sudo systemctl enable --now docker
第二步:创建项目目录结构
/var/www/sites/
├── site1/
│ ├── Dockerfile
│ ├── docker-compose.yml
│ └── data/ (挂载点)
└── site2/
├── Dockerfile
├── docker-compose.yml
└── data/ (挂载点)
第三步:编写 Site1 的 docker-compose.yml
version: '3.8'
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root_password_site1
MYSQL_DATABASE: wp_site1
MYSQL_USER: wp_user
MYSQL_PASSWORD: wp_pass_site1
volumes:
- ./data/db:/var/lib/mysql
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8081:80" # 内部端口,仅通过 Nginx 访问,不建议直接暴露
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wp_user
WORDPRESS_DB_PASSWORD: wp_pass_site1
WORDPRESS_DB_NAME: wp_site1
volumes:
- ./data/wp-content:/var/www/html/wp-content
注:Site2 的配置类似,只需修改端口(如 8082)、数据库密码和挂载路径即可。
第四步:配置 Nginx 反向X_X(关键)
你需要安装 Nginx(可以是宿主机上的,也可以是另一个容器),配置文件 /etc/nginx/conf.d/sites.conf:
server {
listen 80;
server_name www.site1.com site1.com;
location / {
proxy_pass http://127.0.0.1:8081; # 指向 Site1 的 Docker 内部端口
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
server {
listen 80;
server_name www.site2.com site2.com;
location / {
proxy_pass http://127.0.0.1:8082; # 指向 Site2 的 Docker 内部端口
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
优点:
- 隔离性好:PHP 版本可不同(如 Site1 用 PHP 7.4,Site2 用 PHP 8.2)。
- 清理方便:删除文件夹即可彻底移除站点。
- 环境一致:开发测试生产环境统一。
方案二:LNMP/LAMP 多虚拟主机(传统物理部署)
如果你不想学习 Docker,或者服务器资源极其有限(如 1核512M),可以使用传统的 Nginx/Apache + PHP-FPM 多进程模式。
1. 核心逻辑
- PHP-FPM:为每个站点启动一个独立的 PHP-FPM pool。
- Nginx:配置多个
serverblock,分别指向不同的 PHP-FPM socket 或端口。
2. 实施步骤概要
第一步:安装基础环境
# 以 CentOS 为例
yum install nginx php-fpm mariadb-server
第二步:配置 PHP-FPM 多 Pool
编辑 /etc/php-fpm.d/ 下的配置文件,或者新建 site1.conf 和 site2.conf。
/etc/php-fpm.d/site1.conf:
[site1]
user = nginx
group = nginx
listen = /run/php-fpm/site1.sock
pm = dynamic
pm.max_children = 5
...
/etc/php-fpm.d/site2.conf:
[site2]
user = nginx
group = nginx
listen = /run/php-fpm/site2.sock
pm = dynamic
pm.max_children = 5
...
重启 PHP-FPM:
systemctl restart php-fpm
第三步:配置 Nginx 虚拟主机
/etc/nginx/conf.d/site1.conf:
server {
listen 80;
server_name www.site1.com;
root /var/www/site1/public_html;
index index.php index.html;
location ~ .php$ {
fastcgi_pass unix:/run/php-fpm/site1.sock; # 关键:指向特定的 sock
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
同理配置 site2.conf,指向 /run/php-fpm/site2.sock 和 /var/www/site2/。
优点:
- 无虚拟化开销,性能略高(微乎其微)。
- 适合老旧系统或无法安装 Docker 的环境。
缺点:
- 配置繁琐,容易配错权限。
- 依赖关系复杂,升级 PHP 版本时可能影响所有站点。
方案三:WordPress Multisite(单站点多网络)
如果你的两个站点内容高度相关(如同一个公司的不同部门站,或同一个品牌的不同语言站),可以考虑启用 WP 的多站点功能(Multisite)。
1. 原理
在一个 WordPress 代码库下,通过子域名(site1.example.com, site2.example.com)或子目录(example.com/site1, example.com/site2)来区分不同站点。它们共享同一个数据库(不同表前缀)和同一套文件。
2. 实施前提
- 需要在
wp-config.php中开启:define('WP_ALLOW_MULTISITE', true); - 需要 Nginx 重写规则支持子域名映射。
3. 适用场景
- 站点间插件/主题完全通用。
- 管理员希望统一管理后台。
4. 不适用场景
- 两个站点业务无关(如一个是博客,一个是电商)。
- 需要不同的 PHP 版本或数据库版本。
- 担心一个站点被攻击导致整个网络瘫痪。
关键注意事项(避坑指南)
-
SSL/TLS 证书:
- 如果使用 Nginx 反代,确保为每个域名申请了 SSL 证书(Let’s Encrypt 免费且易用)。
- 在 Nginx 配置中正确引用证书路径,并强制 HTTPS。
-
固定 URL 设置:
- 在 WordPress 后台 -> 设置 -> 常规中,务必将“WordPress 地址”和“站点地址”设置为正确的域名(http/https)。
- 如果是 Docker 方案,注意容器内的
WORDPRESS_URL环境变量是否设置正确,否则图片链接可能出错。
-
资源限制:
- 两个站点同时运行会消耗双倍 CPU 和内存。
- 监控服务器负载(
htop,free -m)。如果内存不足(<2GB),建议至少分配 Swap 分区,或限制 PHP-FPM/Docker 的最大子进程数。
-
备份策略:
- 数据库:定期 mysqldump 导出 SQL 文件。
- 文件:特别是
wp-content/uploads目录,必须备份。 - 建议使用脚本自动备份到对象存储(如阿里云 OSS、腾讯云 COS)。
-
安全性:
- 不要直接使用 root 用户运行 PHP 或 Web 服务。
- 限制数据库远程访问,只允许本地连接(localhost 或 127.0.0.1)。
- 防火墙只开放 80/443 端口。
总结建议
- 新手/追求稳定/易维护:选 方案一(Docker)。虽然初期学习成本稍高,但长期来看省心无数倍。
- 老手/极简主义/低配机器:选 方案二(LNMP 多 Pool)。
- 同品牌/强关联站点:选 方案三(Multisite)。
对于大多数国内云服务器用户,Docker 方案是目前生态最成熟、文档最多、问题最容易排查的选择。
CLOUD云枢