在一台服务器上跑两个 WordPress 站点,核心思路就一个:复用资源,隔离环境。
别去搞什么复杂的虚拟机嵌套或者 Docker 容器化(除非你是重度运维玩家),对于大多数中小站长来说,最稳妥、性价比最高、维护成本最低的方案是:LNMP/LAMP 架构 + Nginx/Apache 虚拟主机配置 + 独立数据库用户。
下面我以目前主流且稳定的 Nginx + PHP-FPM + MySQL/MariaDB 环境为例,手把手梳理步骤。这套方案在阿里云、腾讯云等国内主流云厂商上都能完美运行。
第一步:基础环境搭建(如果服务器还是空的)
假设你有一台刚初始化的 CentOS 7/8 或 Ubuntu 20.04+ 云服务器。
- 安装 Nginx:负责接收 HTTP 请求,转发给 PHP。
- 安装 PHP-FPM:处理 PHP 代码。建议安装
php-fpm以及必要的扩展(如php-mysql,php-curl,php-gd,php-xml等,WordPress 依赖这些)。 - 安装 MySQL/MariaDB:存储数据。
提示:你可以使用宝塔面板(BT Panel)一键安装 LNMP 环境,这是国内最省心的方式。如果你追求极致控制和了解原理,建议使用命令行手动编译或 YUM/APT 安装。以下流程基于“手动/半自动”逻辑,因为这才是技术博客该讲的东西。
第二步:创建独立的目录结构
不要把所有网站文件都扔在一个目录下。我们需要为每个站点建立独立的 Web 根目录。
# 创建第一个站点的目录
sudo mkdir -p /var/www/html/site1.com/public_html
# 创建第二个站点的目录
sudo mkdir -p /var/www/html/site2.com/public_html
# 赋予权限(以 www-data 为例,CentOS 通常是 nginx)
sudo chown -R nginx:nginx /var/www/html/site1.com
sudo chown -R nginx:nginx /var/www/html/site2.com
第三步:数据库与用户隔离(关键安全步骤)
绝对不要让两个站点共用同一个数据库管理员账号,甚至最好不要用同一个数据库名。
-
登录 MySQL:
mysql -u root -p -
为站点 1 创建数据库和用户:
CREATE DATABASE site1_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'site1_user'@'localhost' IDENTIFIED BY 'strong_password_1'; 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 'strong_password_2'; GRANT ALL PRIVILEGES ON site2_db.* TO 'site2_user'@'localhost'; FLUSH PRIVILEGES;
为什么这么做? 如果其中一个站点被挂马(SQL 注入或 XSS 导致写入 shell),攻击者只能访问 site1_db,无法直接操作 site2_db,实现了逻辑隔离。
第四步:上传 WordPress 程序并解压
将下载好的 WordPress 压缩包分别放入对应的目录。
# 进入站点1目录
cd /var/www/html/site1.com/public_html
unzip wordpress.zip
rm wordpress.zip
# 进入站点2目录
cd /var/www/html/site2.com/public_html
unzip wordpress.zip
rm wordpress.zip
记得修改配置文件权限:
sudo cp wp-config-sample.php wp-config.php
sudo chown nginx:nginx * -R
第五步:配置 Nginx 虚拟主机(核心难点)
这是最关键的一步。你需要为每个域名编写独立的 Nginx 配置文件。
- 进入 Nginx 配置目录(通常是
/etc/nginx/conf.d/或/etc/nginx/sites-available/)。 - 创建
site1.conf:
server {
listen 80;
server_name www.site1.com site1.com; # 替换为你的域名
root /var/www/html/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;
}
location ~ .php$ {
fastcgi_pass unix:/run/php/php7.4-fpm.sock; # 路径根据实际 PHP 版本调整
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 禁止访问隐藏文件
location ~ /. {
deny all;
}
}
-
创建
site2.conf,结构与上面类似,但需修改:server_name: 改为www.site2.com site2.comroot: 改为/var/www/html/site2.com/public_htmlaccess_log和error_log文件名区分开fastcgi_pass端口/Socket 保持一致(如果是同一 PHP-FPM 池)
-
测试配置并重载 Nginx:
sudo nginx -t sudo systemctl reload nginx
第六步:前端部署与初始化
- 确保你的域名 DNS 解析已经指向了这台服务器的 IP 地址。
- 浏览器访问
site1.com,按照 WordPress 安装向导操作。- 数据库名称:
site1_db - 用户名:
site1_user - 密码:你设置的强密码
- 数据库名称:
- 同样地,访问
site2.com进行安装,使用site2_db和site2_user。
第七步:性能优化与安全加固(进阶必做)
两台站跑在一起,资源竞争是必然的。如果不做限制,一个站流量暴增会把另一个站拖垮。
-
PHP-FPM 进程管理:
编辑php-fpm.d/www.conf,设置合理的pm.max_children。例如,如果内存有限,不要设太大,避免 OOM(内存溢出)。 -
静态资源缓存:
强烈建议安装 Redis 或 Memcached,并在 WordPress 中安装对应插件(如 Redis Object Cache)。这能极大减轻数据库压力,两个站点共享这个缓存层,效率更高。 -
HTTPS 证书:
现在没有 SSL 的网站会被浏览器标记为“不安全”。推荐使用 Certbot 免费申请 Let’s Encrypt 证书,并为两个站点分别配置 HTTPS。 -
定期备份:
写一个简单的 Shell 脚本,利用mysqldump备份两个数据库,并用tar打包 Web 目录,定时推送到 OSS/S3 或另一台机器。切记:备份是最后一道防线。
常见坑点提醒
- 时区问题:检查
php.ini中的date.timezone,设置为Asia/Shanghai,否则 WP 的时间显示会乱。 - 文件权限:很多新手遇到“无法更新主题/插件”的问题,90% 是因为 Nginx 用户(nginx/www-data)对
wp-content/uploads目录没有写入权限。确保所有文件属主是 Web 服务用户。 - 内存不足:如果服务器只有 1G 或 2G 内存,跑两个 WP 会很吃力。务必开启 Swap 分区,或者考虑升级配置。监控
free -m和top命令。
总结
在一台服务器上跑多站,本质上是多租户隔离。只要做到:
- Web 根目录隔离
- 数据库账号隔离
- Nginx 配置隔离
- 日志分离
就能实现稳定运行。这种方案成本低、灵活性高,非常适合个人开发者、小型工作室或初创项目。等到单站流量稳定过万 PV 以上,再考虑拆分到多台服务器也不迟。
云技术博客