如何在一台服务器上运行两个独立的WordPress网站?

在一台服务器上运行两个独立的 WordPress 网站,是运维中非常经典且高频的场景。这通常被称为“多站点部署”或“虚拟主机配置”。

要实现这一目标,核心思路是利用 Web 服务器(如 Nginx 或 Apache)的虚拟主机(Virtual Host / Server Block)功能,将不同的域名解析到同一个 IP 地址,但根据域名不同,将请求路由到不同的目录、数据库和 PHP-FPM 进程池中。

以下是基于当前主流技术栈(Nginx + PHP-FPM + MySQL/MariaDB)的详细实操方案。假设你使用的是 CentOS 7/8 或 Ubuntu 20.04+ 系统。

核心架构设计

  1. Web 服务器:Nginx(性能更好,配置更灵活)。
  2. PHP 处理:PHP-FPM(FastCGI Process Manager),为每个站点配置独立的进程池,实现资源隔离。
  3. 数据库:MySQL 或 MariaDB,创建两个独立的数据库和用户。
  4. 文件结构:在 /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-datanginx,取决于你的 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.com
  • root: 改为 /var/www/site2.com/public_html
  • access_logerror_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.comhttp://site2.com

  1. 选择语言。
  2. 输入对应的数据库名称、用户名和密码(来自第三步)。
  3. 完成安装。

此时,两个网站应该都能正常访问,且数据完全隔离。


进阶优化:资源隔离与安全加固

上述基础方案可以满足基本需求,但在生产环境中,建议进行以下优化:

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 访问(可选)。

常见问题排查

  1. 502 Bad Gateway

    • 检查 PHP-FPM 是否运行:systemctl status php8.1-fpm
    • 检查 Nginx 错误日志:tail -f /var/log/nginx/error.log
    • 确认 fastcgi_pass 的 socket 路径是否正确。
  2. 403 Forbidden

    • 检查文件权限:确保 www-data 用户对网站目录有读取和执行权限。
    • 检查 SELinux(如果使用 CentOS/RHEL):可能需要关闭或调整上下文。
  3. WordPress 无法上传图片

    • 检查 wp-content/uploads 目录权限是否为 755。
    • 检查 PHP 配置中的 upload_max_filesizepost_max_size

总结

在一台服务器上运行多个 WordPress 网站是完全可行的,关键在于配置隔离。通过 Nginx 虚拟主机分离域名请求,通过独立数据库分离数据,通过独立 PHP-FPM Pool 分离进程资源,可以实现稳定、安全的共存环境。

对于初学者,建议先从共享 PHP-FPM Pool 开始,熟悉流程后再逐步引入独立 Pool 和 SSL 证书。同时,务必重视备份和安全加固,因为单点故障风险会随着站点数量增加而上升。

未经允许不得转载:CLOUD云枢 » 如何在一台服务器上运行两个独立的WordPress网站?