在同一台服务器上部署多个 WordPress 站点,是运维和开发者非常经典的需求。这通常被称为“多站点”或“虚拟主机”模式。
要实现这个目标,核心逻辑其实就两步:Web 服务器配置(Nginx/Apache) + 数据库隔离。
下面我以目前最主流、性能最好的 Nginx + PHP-FPM + MySQL/MariaDB 架构为例,手把手拆解这个过程。我会尽量避开那些教科书式的废话,直接讲实操中的坑和最佳实践。
核心思路
- 代码隔离:每个 WordPress 站点有独立的目录,互不干扰。
- 域名解析:通过 Nginx 的
server_name区分不同域名,指向不同的网站目录。 - 数据库隔离:为每个站点创建独立的数据库和用户,权限最小化。
- 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 等可视化工具来管理这些配置,它们底层做的也是同样的事情,但能避免很多路径和权限的错误。但对于想深入理解原理的人,手动敲一遍上述流程是非常有价值的学习过程。
云技术博客