在一台服务器上运行两个独立的 WordPress 网站,是运维中非常经典且高频的场景。这通常被称为“多站点部署”或“虚拟主机配置”。
要实现这一目标,核心思路是利用 Web 服务器(如 Nginx 或 Apache)的虚拟主机(Virtual Host / Server Block)功能,将不同的域名解析到同一个 IP 地址,但根据域名不同,将请求路由到不同的目录、数据库和 PHP-FPM 进程池中。
以下是基于当前主流技术栈(Nginx + PHP-FPM + MySQL/MariaDB)的详细实操方案。假设你使用的是 CentOS 7/8 或 Ubuntu 20.04+ 系统。
核心架构设计
- Web 服务器:Nginx(性能更好,配置更灵活)。
- PHP 处理:PHP-FPM(FastCGI Process Manager),为每个站点配置独立的进程池,实现资源隔离。
- 数据库:MySQL 或 MariaDB,创建两个独立的数据库和用户。
- 文件结构:在
/var/www下建立两个独立的目录,例如/var/www/site1.com和/var/www/site2.com。
第一步:准备环境和安装基础软件
确保你的服务器已经安装了 Nginx、MySQL 和 PHP 及相关扩展。以 Ubuntu 为例:
sudo apt update
sudo apt install nginx mysql-server php-fpm php-mysql php-curl php-gd php-mbstring php-xml php-zip unzip
注意:国内云服务器建议使用阿里云、腾讯云等提供的镜像源,速度更快。
第二步:创建目录结构和权限设置
为两个网站分别创建根目录,并设置正确的所有者(通常是 www-data 或 nginx,取决于你的 Linux 发行版)。
# 创建目录
sudo mkdir -p /var/www/site1.com/public_html
sudo mkdir -p /var/www/site2.com/public_html
# 下载 WordPress 包并解压(以 site1 为例)
cd /tmp
wget https://cn.wordpress.org/latest-zh_CN.tar.gz
tar xzvf latest-zh_CN.tar.gz
# 将内容复制到对应目录
sudo cp -r wordpress/* /var/www/site1.com/public_html/
# 同样方法处理 site2(可以再次下载或复制)
sudo cp -r wordpress/* /var/www/site2.com/public_html/
# 设置权限
# 关键:让 Web 服务器用户拥有写入权限(特别是 wp-content/uploads 和 wp-config.php)
sudo chown -R www-data:www-data /var/www/site1.com
sudo chown -R www-data:www-data /var/www/site2.com
# 设置目录权限为 755,文件为 644
find /var/www/site1.com -type d -exec chmod 755 {} ;
find /var/www/site1.com -type f -exec chmod 644 {} ;
第三步:配置数据库
登录 MySQL,为两个网站分别创建数据库和用户。
mysql -u root -p
-- 创建 site1 的数据库和用户
CREATE DATABASE site1_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'site1_user'@'localhost' IDENTIFIED BY 'StrongPassword1';
GRANT ALL PRIVILEGES ON site1_db.* TO 'site1_user'@'localhost';
-- 创建 site2 的数据库和用户
CREATE DATABASE site2_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'site2_user'@'localhost' IDENTIFIED BY 'StrongPassword2';
GRANT ALL PRIVILEGES ON site2_db.* TO 'site2_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
安全建议:务必使用强密码,并避免使用
root账户连接 WordPress。
第四步:配置 Nginx 虚拟主机
这是最关键的一步。我们需要为每个域名创建一个独立的 server block。
1. 创建 site1.com 的配置
sudo nano /etc/nginx/sites-available/site1.com
粘贴以下内容:
server {
listen 80;
server_name site1.com www.site1.com;
root /var/www/site1.com/public_html;
index index.php index.html index.htm;
# 日志路径
access_log /var/log/nginx/site1.com.access.log;
error_log /var/log/nginx/site1.com.error.log;
# 基本重写规则
location / {
try_files $uri $uri/ /index.php?$args;
}
# PHP 处理
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock; # 请根据你的 PHP 版本调整 socket 路径
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 禁止访问隐藏文件和配置文件
location ~ /. {
deny all;
}
location ~* .(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires max;
log_not_found off;
}
}
2. 创建 site2.com 的配置
sudo nano /etc/nginx/sites-available/site2.com
内容与上面类似,但需修改以下部分:
server_name: 改为site2.com www.site2.comroot: 改为/var/www/site2.com/public_htmlaccess_log和error_log: 指向新的日志文件fastcgi_pass: 如果希望完全隔离,可以为 site2 配置独立的 PHP-FPM pool(见下文进阶优化),否则共享同一 socket 也可行。
3. 启用配置并重启 Nginx
# 创建符号链接启用配置
sudo ln -s /etc/nginx/sites-available/site1.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/site2.com /etc/nginx/sites-enabled/
# 测试配置语法
sudo nginx -t
# 如果测试通过,重启 Nginx
sudo systemctl restart nginx
第五步:初始化 WordPress
现在,打开浏览器,依次访问 http://site1.com 和 http://site2.com。
- 选择语言。
- 输入对应的数据库名称、用户名和密码(来自第三步)。
- 完成安装。
此时,两个网站应该都能正常访问,且数据完全隔离。
进阶优化:资源隔离与安全加固
上述基础方案可以满足基本需求,但在生产环境中,建议进行以下优化:
1. 独立的 PHP-FPM Pool(推荐)
默认情况下,所有站点可能共用一个 PHP-FPM 进程池。如果一个站点被攻击导致 PHP 内存溢出,会影响另一个站点。
为每个站点创建独立的 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
编辑 site1.conf:
[site1]
user = www-data
group = www-data
listen = /run/php/php8.1-site1-fpm.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
同理配置 site2.conf,注意修改 listen 路径为 php8.1-site2-fpm.sock。
然后更新 Nginx 配置中的 fastcgi_pass:
# site1.com 配置中
fastcgi_pass unix:/run/php/php8.1-site1-fpm.sock;
# site2.com 配置中
fastcgi_pass unix:/run/php/php8.1-site2-fpm.sock;
最后重启 PHP-FPM 和 Nginx:
sudo systemctl restart php8.1-fpm
sudo systemctl restart nginx
2. HTTPS 证书配置(Let’s Encrypt)
使用 Certbot 自动获取免费 SSL 证书,提升安全性和 SEO。
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d site1.com -d www.site1.com
sudo certbot --nginx -d site2.com -d www.site2.com
Certbot 会自动修改 Nginx 配置,添加 SSL 监听和重定向 HTTP 到 HTTPS。
3. 备份策略
- 定期备份:使用脚本或工具(如 UpdraftPlus 插件)备份数据库和文件。
- 异地存储:将备份上传到对象存储(如阿里云 OSS、腾讯云 COS),避免服务器宕机时丢失数据。
4. 防火墙与入侵检测
- 只开放必要端口(80, 443, SSH)。
- 安装 Fail2ban 防止暴力破解 SSH 和 WP 登录页面。
- 限制
wp-admin的 IP 访问(可选)。
常见问题排查
-
502 Bad Gateway:
- 检查 PHP-FPM 是否运行:
systemctl status php8.1-fpm - 检查 Nginx 错误日志:
tail -f /var/log/nginx/error.log - 确认
fastcgi_pass的 socket 路径是否正确。
- 检查 PHP-FPM 是否运行:
-
403 Forbidden:
- 检查文件权限:确保
www-data用户对网站目录有读取和执行权限。 - 检查 SELinux(如果使用 CentOS/RHEL):可能需要关闭或调整上下文。
- 检查文件权限:确保
-
WordPress 无法上传图片:
- 检查
wp-content/uploads目录权限是否为 755。 - 检查 PHP 配置中的
upload_max_filesize和post_max_size。
- 检查
总结
在一台服务器上运行多个 WordPress 网站是完全可行的,关键在于配置隔离。通过 Nginx 虚拟主机分离域名请求,通过独立数据库分离数据,通过独立 PHP-FPM Pool 分离进程资源,可以实现稳定、安全的共存环境。
对于初学者,建议先从共享 PHP-FPM Pool 开始,熟悉流程后再逐步引入独立 Pool 和 SSL 证书。同时,务必重视备份和安全加固,因为单点故障风险会随着站点数量增加而上升。
CLOUD云枢