在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
最佳实践组合
-
基础隔离:
- 独立的虚拟主机配置
- 独立的数据库和用户
- 独立的文件目录
-
增强安全:
- 独立的PHP-FPM进程池
- 独立的系统用户和文件权限
- 配置open_basedir限制
-
高级隔离:
- 使用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 {} ;
监控和维护
-
日志分离:
# 每个站点独立的日志 /var/log/nginx/site1.access.log /var/log/nginx/site2.access.log /var/log/nginx/site1.error.log /var/log/nginx/site2.error.log -
备份策略:
# 分别备份每个站点 tar -czf site1_backup.tar.gz /var/www/site1 mysqldump -u site1_user -p site1_db > site1_db.sql
选择哪种方案取决于你的安全需求、性能要求和运维复杂度。对于大多数场景,方案一+方案四(独立虚拟主机+独立数据库)的组合已经足够。
CLOUD技术笔记