在CentOS或Ubuntu系统上如何隔离两个WordPress站点?

在CentOS或Ubuntu上隔离两个WordPress站点,主要有以下几种方案,推荐程度从高到低排列:

方案一:使用独立的虚拟主机(推荐)

这是最标准、最安全的方式,通过Web服务器配置实现隔离。

1. Nginx配置示例

# 站点1:/etc/nginx/sites-available/site1.conf
server {
    listen 80;
    server_name site1.com www.site1.com;

    root /var/www/site1;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ .php$ {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php/php8.1-fpm-site1.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    # 安全设置
    location ~ /.ht {
        deny all;
    }
}

# 站点2:/etc/nginx/sites-available/site2.conf
server {
    listen 80;
    server_name site2.com www.site2.com;

    root /var/www/site2;
    # 其他配置类似,但使用不同的PHP-FPM socket
    fastcgi_pass unix:/var/run/php/php8.1-fpm-site2.sock;
}

2. Apache配置示例

# 站点1:/etc/apache2/sites-available/site1.conf
<VirtualHost *:80>
    ServerName site1.com
    ServerAlias www.site1.com
    DocumentRoot /var/www/site1

    <Directory /var/www/site1>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    # 使用不同的PHP-FPM
    <FilesMatch .php$>
        SetHandler "proxy:unix:/var/run/php/php8.1-fpm-site1.sock|fcgi://localhost"
    </FilesMatch>
</VirtualHost>

方案二:使用不同的PHP-FPM进程池

1. 创建独立的PHP-FPM配置

# 复制默认配置
sudo cp /etc/php/8.1/fpm/pool.d/www.conf /etc/php/8.1/fpm/pool.d/site1.conf
sudo cp /etc/php/8.1/fpm/pool.d/www.conf /etc/php/8.1/fpm/pool.d/site2.conf

2. 修改site1.conf

[site1]
user = site1_user
group = site1_group
listen = /var/run/php/php8.1-fpm-site1.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 5

# 安全隔离
chdir = /
php_admin_value[open_basedir] = /var/www/site1:/tmp
php_admin_value[upload_tmp_dir] = /var/www/site1/wp-content/uploads

3. 重启PHP-FPM

sudo systemctl restart php8.1-fpm

方案三:文件系统权限隔离

1. 创建独立的用户和组

# 创建用户和组
sudo groupadd site1_group
sudo groupadd site2_group
sudo useradd -g site1_group -s /bin/false site1_user
sudo useradd -g site2_group -s /bin/false site2_user

# 设置目录权限
sudo chown -R site1_user:site1_group /var/www/site1
sudo chown -R site2_user:site2_group /var/www/site2
sudo chmod 750 /var/www/site1 /var/www/site2

2. 配置Web服务器用户

# 将Web服务器用户添加到两个组
sudo usermod -a -G site1_group,site2_group www-data

方案四:数据库隔离

1. 创建独立的数据库和用户

-- 为站点1创建数据库和用户
CREATE DATABASE site1_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'site1_user'@'localhost' IDENTIFIED BY '强密码';
GRANT ALL PRIVILEGES ON site1_db.* TO 'site1_user'@'localhost';
FLUSH PRIVILEGES;

-- 为站点2创建独立的数据库和用户
CREATE DATABASE site2_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'site2_user'@'localhost' IDENTIFIED BY '强密码';
GRANT ALL PRIVILEGES ON site2_db.* TO 'site2_user'@'localhost';
FLUSH PRIVILEGES;

方案五:使用容器化(高级方案)

Docker Compose示例

version: '3.8'

services:
  wordpress1:
    image: wordpress:latest
    container_name: wp-site1
    restart: always
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db1
      WORDPRESS_DB_USER: site1_user
      WORDPRESS_DB_PASSWORD: password1
      WORDPRESS_DB_NAME: site1_db
    volumes:
      - ./site1:/var/www/html
    networks:
      - wp-network1

  wordpress2:
    image: wordpress:latest
    container_name: wp-site2
    restart: always
    ports:
      - "8081:80"
    environment:
      WORDPRESS_DB_HOST: db2
      WORDPRESS_DB_USER: site2_user
      WORDPRESS_DB_PASSWORD: password2
      WORDPRESS_DB_NAME: site2_db
    volumes:
      - ./site2:/var/www/html
    networks:
      - wp-network2

最佳实践组合

  1. 基础隔离

    • 独立的虚拟主机配置
    • 独立的数据库和用户
    • 独立的文件目录
  2. 增强安全

    • 独立的PHP-FPM进程池
    • 独立的系统用户和文件权限
    • 配置open_basedir限制
  3. 高级隔离

    • 使用Docker容器
    • 或使用虚拟机(KVM/VirtualBox)
    • 或使用云服务器实例

快速部署脚本示例

#!/bin/bash
# 自动部署两个隔离的WordPress站点

SITE1="site1.com"
SITE2="site2.com"

# 创建目录结构
for site in $SITE1 $SITE2; do
    sudo mkdir -p /var/www/$site
    sudo chown -R www-data:www-data /var/www/$site
done

# 下载WordPress
cd /tmp
wget https://wordpress.org/latest.tar.gz
tar -xzf latest.tar.gz
sudo mv wordpress/* /var/www/$SITE1/
sudo cp -r /var/www/$SITE1 /var/www/$SITE2

# 设置权限
sudo find /var/www/$SITE1 -type d -exec chmod 755 {} ;
sudo find /var/www/$SITE2 -type d -exec chmod 755 {} ;
sudo find /var/www/$SITE1 -type f -exec chmod 644 {} ;
sudo find /var/www/$SITE2 -type f -exec chmod 644 {} ;

监控和维护

  1. 日志分离

    # 每个站点独立的日志
    /var/log/nginx/site1.access.log
    /var/log/nginx/site2.access.log
    /var/log/nginx/site1.error.log
    /var/log/nginx/site2.error.log
  2. 备份策略

    # 分别备份每个站点
    tar -czf site1_backup.tar.gz /var/www/site1
    mysqldump -u site1_user -p site1_db > site1_db.sql

选择哪种方案取决于你的安全需求、性能要求和运维复杂度。对于大多数场景,方案一+方案四(独立虚拟主机+独立数据库)的组合已经足够。

云服务器