努力
加油

如何在同一台服务器上搭建两个WordPress站点?

在同一台服务器上搭建两个 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 源码放入对应目录,然后浏览器访问进行安装。


常见坑与优化建议

  1. 内存限制:
    同一台服务器跑两个 WP,PHP 进程数要控制。如果服务器只有 2G 内存,建议 pm.max_children 设为 5-10,否则容易 OOM(内存溢出)。如果使用 Docker,可以在 docker-compose.yml 中给容器设置 mem_limit。

  2. 静态资源缓存:
    两个站点共用同一个 Nginx,建议开启 Gzip 压缩,并设置静态文件(jpg, css, js)的长期缓存(expires 1y),减少磁盘 I/O 和网络带宽压力。

  3. 安全加固:

    • 防火墙:只开放 80/443 端口。不要暴露 8081/8082 或 MySQL 的 3306 端口。
    • HTTPS:强烈建议使用 Let’s Encrypt (Certbot) 免费证书。Nginx 配置 SSL 时,记得把 HTTP 自动跳转到 HTTPS。
  4. 备份策略:

    • Docker 方案:只需备份 data 目录下的文件以及数据库 dump。因为镜像是固定的,重建容器很快。
    • 传统方案:定期打包 /usr/share/nginx/ 目录和导出 SQL 数据。
  5. 关于“WordPress 多站点网络(Multisite)”:
    你可能听说过 WP 自带的 Multisite 功能(子域名或子目录模式)。我不推荐用于生产环境的多个独立业务站点。Multisite 适合管理同一个品牌下的多个子站(如博客的不同语言版),但它共享数据库表结构和部分插件逻辑,扩展性差,且一旦主站被黑,牵连极大。如果是完全独立的两个业务,务必物理/逻辑隔离。

总结

  • 新手/求稳/易维护:选 Docker Compose。虽然前期配置稍复杂,但后期扩容、迁移、清理环境极其方便,不会留下垃圾文件。
  • 老手/极致性能/资源极度紧张:选 LNMP 手动配置。去掉了容器的开销,直接利用宿主机内核,但运维负担重。

对于绝大多数国内云服务器用户(阿里云 ECS、腾讯云 CVM 等),Docker 方案是当下最主流且合规的选择。