努力
加油

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

在同一台服务器上部署多个 WordPress 站点,是运维和开发者非常经典的需求。这通常被称为“多站点”或“虚拟主机”模式。

要实现这个目标,核心逻辑其实就两步:Web 服务器配置(Nginx/Apache) + 数据库隔离。

下面我以目前最主流、性能最好的 Nginx + PHP-FPM + MySQL/MariaDB 架构为例,手把手拆解这个过程。我会尽量避开那些教科书式的废话,直接讲实操中的坑和最佳实践。

核心思路

  1. 代码隔离:每个 WordPress 站点有独立的目录,互不干扰。
  2. 域名解析:通过 Nginx 的 server_name 区分不同域名,指向不同的网站目录。
  3. 数据库隔离:为每个站点创建独立的数据库和用户,权限最小化。
  4. PHP-FPM 池(可选但推荐):如果资源允许,可以为高流量站点单独开一个 PHP-FPM 进程池,防止互相占用 CPU/内存。

第一步:准备环境

假设你的服务器已经安装了 LNMP 环境(Linux, Nginx, MySQL, PHP)。如果没有,建议直接用云厂商的一键安装包或者使用 Docker,这里主要讲原生部署逻辑,因为理解原理后,Docker 只是容器化的封装。

  • OS: CentOS 7/8, Ubuntu 20.04/22.04 等
  • Web Server: Nginx
  • Database: MySQL 5.7+ 或 MariaDB 10.3+
  • PHP: 7.4 或 8.0+ (WordPress 对 PHP 版本要求较高)

第二步:创建网站目录结构

不要把所有文件都扔在 /var/www/html 下,那样会乱套。建议采用清晰的层级结构。

# 创建根目录
sudo mkdir -p /var/www/sites

# 创建第一个站点 site1.com
sudo mkdir -p /var/www/sites/site1.com/public_html
sudo chown -R www-data:www-data /var/www/sites/site1.com # www-data 是你的 web 用户,Ubuntu 通常是这个,CentOS 可能是 nginx 或 apache

# 创建第二个站点 site2.com
sudo mkdir -p /var/www/sites/site2.com/public_html
sudo chown -R www-data:www-data /var/www/sites/site2.com

注意:public_html 是为了将来方便做软链接或配合某些工具管理,也可以直接放在 /var/www/sites/site1.com 下,看个人习惯。

第三步:配置数据库

登录 MySQL:

mysql -u root -p

为每个站点创建独立的数据库和用户。切记:不要共用数据库! 这样即使一个站点被黑,另一个站点的数据库也不会直接暴露。

-- 为 site1 创建数据库
CREATE DATABASE wp_site1 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wp_user1'@'localhost' IDENTIFIED BY 'StrongPassword1!';
GRANT ALL PRIVILEGES ON wp_site1.* TO 'wp_user1'@'localhost';
FLUSH PRIVILEGES;

-- 为 site2 创建数据库
CREATE DATABASE wp_site2 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wp_user2'@'localhost' IDENTIFIED BY 'StrongPassword2!';
GRANT ALL PRIVILEGES ON wp_site2.* TO 'wp_user2'@'localhost';
FLUSH PRIVILEGES;

EXIT;

第四步:下载并安装 WordPress

你可以去 wordpress.org 下载最新包,或者用命令行快速拉取。

以 site1.com 为例:

cd /tmp
wget https://wordpress.org/latest.tar.gz
tar -xzvf latest.tar.gz
sudo cp -r wordpress/* /var/www/sites/site1.com/public_html/
sudo chown -R www-data:www-data /var/www/sites/site1.com/public_html

对 site2.com 重复此步骤,解压到对应的目录。

第五步:配置 Nginx 虚拟主机(关键步骤)

这是让多个域名指向不同目录的核心。你需要为每个站点创建一个 Nginx 配置文件。

1. 创建 site1.com 的配置

sudo nano /etc/nginx/conf.d/site1.com.conf

内容如下(请根据实际情况修改域名和路径):

server {
    listen 80;
    server_name site1.com www.site1.com;

    root /var/www/sites/site1.com/public_html;
    index index.php index.html index.htm;

    # 日志记录,方便排查问题
    access_log /var/log/nginx/site1_access.log;
    error_log /var/log/nginx/site1_error.log;

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

    # 处理 PHP 文件
    location ~ .php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.4-fpm.sock; # 根据你的 PHP 版本调整 socket 路径
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # 禁止访问隐藏文件(如 .git, .env)
    location ~ /. {
        deny all;
    }

    # 静态文件缓存(可选,提升性能)
    location ~* .(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
}

2. 创建 site2.com 的配置

复制上面的文件,修改域名、root 路径和日志文件名:

sudo cp /etc/nginx/conf.d/site1.com.conf /etc/nginx/conf.d/site2.com.conf
sudo nano /etc/nginx/conf.d/site2.com.conf

将 site1 相关内容替换为 site2。

3. 测试并重载 Nginx

# 测试配置语法是否正确
sudo nginx -t

# 如果显示 syntax is ok,则重载
sudo systemctl reload nginx

第六步:浏览器安装

现在,打开浏览器访问 http://site1.com 和 http://site2.com。

你会看到熟悉的 WordPress 五步安装界面。

  • 输入站点名称
  • 创建管理员账号
  • 重要:在填写数据库信息时,分别填入之前创建的 wp_site1 和 wp_user1 等信息。

安装完成后,两个站点就完全独立了。


进阶优化与避坑指南

作为老鸟,光能跑起来是不够的,还要考虑性能和安全性。

1. SSL 证书(HTTPS)

现在没有 HTTPS 的网站几乎没法混。推荐使用 Let’s Encrypt 的 certbot 自动申请和管理证书。

sudo apt install certbot python3-certbot-nginx  # Ubuntu
sudo yum install certbot python3-certbot-nginx  # CentOS

然后运行:

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 的规则。

2. PHP-FPM 池分离(高级)

如果你的 site1.com 流量很大,而 site2.com 没人看,共用同一个 PHP-FPM 主进程可能会导致大站抢走所有 CPU,小站变慢。

你可以为不同站点配置不同的 PHP-FPM 池。
在 /etc/php/7.4/fpm/pool.d/ 下,默认有一个 www.conf。你可以复制它,命名为 site1.conf,修改其中的 listen 地址(比如改成 127.0.0.1:9001),然后在 Nginx 配置里把 fastcgi_pass 指向这个新端口。

但这会增加管理复杂度,对于大多数中小站长,共用一个 PHP-FPM 池,并通过 php-fpm.conf 限制全局的 pm.max_children 数量即可。

3. 安全加固

  • 文件权限:确保 Web 用户(www-data)只有写权限在 wp-content/uploads 和 wp-config.php(如果需要),其他文件最好设为只读。
  • 禁用 XML-RPC:如果不需要 JetPack 或移动发布功能,在 .htaccess 或 Nginx 中禁用 xmlrpc.php,防止暴力破解。
  • 定期备份:这是最重要的!使用插件如 UpdraftPlus 或手动脚本,将数据库和 wp-content 目录备份到 OSS/S3 或另一台服务器。不要只依赖服务器本地备份。

4. 性能提速

  • 对象缓存:安装 Redis 或 Memcached,并在 WordPress 中启用对象缓存插件。这对多站点、高并发场景提升巨大。
  • CDN:如果预算允许,给图片、CSS、JS 加上 CDN,减轻源站压力。

总结

在一台服务器上搭建多个 WordPress 站点,本质上是 Nginx 的反向XX分发 + MySQL 的多库隔离。

只要遵循 “一域一目录一库” 的原则,就能做到既节省成本又保证相对的安全性和独立性。对于初学者,强烈建议使用宝塔面板、1Panel 等可视化工具来管理这些配置,它们底层做的也是同样的事情,但能避免很多路径和权限的错误。但对于想深入理解原理的人,手动敲一遍上述流程是非常有价值的学习过程。