在同一台服务器上搭建两个 WordPress 站点,核心思路就两个:要么用 Nginx/Apache 的反向XX做域名区分(多站点模式),要么用 Docker 容器隔离环境。
对于大多数个人站长或小团队来说,Docker 方案是目前的最佳实践,因为它干净、可迁移、互不干扰。如果你不想折腾容器,传统的 LNMP/LAMP 手动配置也是可行的,但维护成本高。
下面我分两种主流场景给你拆解,重点推荐 Docker 方案。
方案一:Docker Compose 部署(强烈推荐)
这是目前最优雅的方式。每个 WordPress 实例拥有独立的 PHP 版本、数据库容器和 Web 服务,通过一个 docker-compose.yml 文件管理。
1. 基础环境准备
确保你的服务器安装了 Docker 和 Docker Compose。
# CentOS/Ubuntu 通用安装示例
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
systemctl enable --now docker
2. 目录结构规划
为了清晰,我们创建两个独立的项目目录:
/opt/wp-sites/
├── site1/ # 第一个站点
│ ├── docker-compose.yml
│ └── data/ # 存放 wp-content 和数据卷
└── site2/ # 第二个站点
├── docker-compose.yml
└── data/
3. 编写 Site1 的配置文件 (site1/docker-compose.yml)
这里使用 MySQL 5.7 或 MariaDB,Nginx 作为反向XX前端,PHP-FPM 处理业务。
version: '3.8'
services:
db:
image: mysql:5.7
volumes:
- ./data/db:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: root_password_here
MYSQL_DATABASE: wordpress_db1
MYSQL_USER: wp_user1
MYSQL_PASSWORD: wp_pass1
wordpress:
depends_on:
- db
image: wordpress:php8.1-fpm
volumes:
- ./data/wp-content:/var/www/html/wp-content
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_NAME: wordpress_db1
WORDPRESS_DB_USER: wp_user1
WORDPRESS_DB_PASSWORD: wp_pass1
WORDPRESS_TABLE_PREFIX: wp1_
nginx:
image: nginx:alpine
ports:
- "8081:80" # 内部端口映射,实际访问靠外部 Nginx 反代
volumes:
- ./data/wp-content:/var/www/html/wp-content
- ./nginx.conf:/etc/nginx/conf.d/default.conf
depends_on:
- wordpress
注意: nginx.conf 需要简单配置一下指向 PHP-FPM:
server {
listen 80;
server_name _;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ .php$ {
fastcgi_pass wordpress:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
启动 Site1:
cd /opt/wp-sites/site1
docker compose up -d
4. 编写 Site2 的配置文件
重复上述步骤,修改端口映射(如 8082:80)、数据库密码、环境变量前缀等。确保两个站点的数据库用户名/密码不同,避免冲突。
5. 前置反向XX(关键步骤)
现在你有了两个运行在本地不同端口的 WordPress 实例(比如 8081 和 8082)。你需要在服务器最外层装一个 Nginx,根据域名将流量分发到这两个端口。
安装系统级 Nginx:
yum install nginx -y # 或 apt install nginx
配置 /etc/nginx/conf.d/sites.conf:
upstream site1_backend {
server 127.0.0.1:8081;
}
upstream site2_backend {
server 127.0.0.1:8082;
}
server {
listen 80;
server_name www.site1.com;
location / {
proxy_pass http://site1_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen 80;
server_name www.site2.com;
location / {
proxy_pass http://site2_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
重启 Nginx,绑定好域名解析,两个站点就跑起来了。
方案二:传统 LNMP 手动部署(适合老旧服务器或不熟悉 Docker 的人)
这种方式所有组件都在宿主机上,资源占用略低,但“污染”严重,一个站点崩了可能影响另一个。
1. 安装基础环境
以 CentOS 为例,安装 Nginx, PHP (FPM), MySQL/MariaDB。
yum install nginx php-fpm php-mysqlnd mariadb-server -y
systemctl start nginx php-fpm mariadb
2. 配置 PHP-FPM 池隔离
这是关键。默认 PHP-FPM 只有一个池。你需要为每个站点创建独立的 PHP-FPM 配置文件,监听不同的 Unix Socket 或 TCP 端口。
复制 /etc/php-fpm.d/www.conf 为 site1.conf 和 site2.conf。
site1.conf 关键修改:
[site1]
user = nginx
group = nginx
listen = /run/php-fpm/site1.sock
listen.owner = nginx
listen.group = nginx
pm.max_children = 5
...
site2.conf 关键修改:
[site2]
user = nginx
group = nginx
listen = /run/php-fpm/site2.sock # 注意 socket 路径不同
listen.owner = nginx
listen.group = nginx
pm.max_children = 5
...
重启 PHP-FPM:systemctl restart php-fpm
3. 配置 Nginx 虚拟主机
创建两个 Server Block。
site1.conf:
server {
listen 80;
server_name www.site1.com;
root /usr/share/nginx/site1;
location / {
index index.php index.html;
try_files $uri $uri/ /index.php?$args;
}
location ~ .php$ {
fastcgi_pass unix:/run/php-fpm/site1.sock; # 指向对应的 socket
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
同理配置 site2,只是 root 路径改为 /usr/share/nginx/site2,fastcgi_pass 指向 site2.sock。
4. 初始化数据库和 WordPress
分别创建两个数据库,下载两份 WordPress 源码放入对应目录,然后浏览器访问进行安装。
常见坑与优化建议
-
内存限制:
同一台服务器跑两个 WP,PHP 进程数要控制。如果服务器只有 2G 内存,建议pm.max_children设为 5-10,否则容易 OOM(内存溢出)。如果使用 Docker,可以在docker-compose.yml中给容器设置mem_limit。 -
静态资源缓存:
两个站点共用同一个 Nginx,建议开启 Gzip 压缩,并设置静态文件(jpg, css, js)的长期缓存(expires 1y),减少磁盘 I/O 和网络带宽压力。 -
安全加固:
- 防火墙:只开放 80/443 端口。不要暴露 8081/8082 或 MySQL 的 3306 端口。
- HTTPS:强烈建议使用 Let’s Encrypt (Certbot) 免费证书。Nginx 配置 SSL 时,记得把 HTTP 自动跳转到 HTTPS。
-
备份策略:
- Docker 方案:只需备份
data目录下的文件以及数据库 dump。因为镜像是固定的,重建容器很快。 - 传统方案:定期打包
/usr/share/nginx/目录和导出 SQL 数据。
- Docker 方案:只需备份
-
关于“WordPress 多站点网络(Multisite)”:
你可能听说过 WP 自带的 Multisite 功能(子域名或子目录模式)。我不推荐用于生产环境的多个独立业务站点。Multisite 适合管理同一个品牌下的多个子站(如博客的不同语言版),但它共享数据库表结构和部分插件逻辑,扩展性差,且一旦主站被黑,牵连极大。如果是完全独立的两个业务,务必物理/逻辑隔离。
总结
- 新手/求稳/易维护:选 Docker Compose。虽然前期配置稍复杂,但后期扩容、迁移、清理环境极其方便,不会留下垃圾文件。
- 老手/极致性能/资源极度紧张:选 LNMP 手动配置。去掉了容器的开销,直接利用宿主机内核,但运维负担重。
对于绝大多数国内云服务器用户(阿里云 ECS、腾讯云 CVM 等),Docker 方案是当下最主流且合规的选择。
云技术博客