多个 WordPress 站点共用一台服务器,核心思路就是“一个 Nginx/Apache + 多个独立目录 + 多域名解析”。
在国内云厂商(阿里云、腾讯云等)环境下,最稳妥、性能最好且维护成本最低的方案是:LNMP 环境(Linux + Nginx + MySQL/MariaDB + PHP-FPM)。
以下是基于生产环境标准的配置流程,不整虚的,直接上干货。
一、 前置准备
- 服务器系统:推荐 CentOS 7/8 或 Ubuntu 20.04/22.04 LTS。
- 域名解析:确保所有要绑定的域名都已 A 记录指向该服务器 IP。
- SSL 证书:强烈建议每个站点都配置 HTTPS。可以使用 Let’s Encrypt (certbot) 免费获取,或者在云厂商控制台申请免费证书。
二、 目录结构设计
不要把所有网站文件扔在一个文件夹里,要按站点隔离。
/var/www/
├── site1.com/ # 第一个站点根目录
│ ├── wp-content/
│ ├── index.php
│ └── ...
├── site2.net/ # 第二个站点根目录
│ ├── wp-content/
│ ├── index.php
│ └── ...
└── logs/ # 可选,存放访问日志
├── site1.access.log
└── site2.access.log
权限设置关键一步:
Nginx 运行用户通常是 www-data (Ubuntu) 或 nginx (CentOS)。WordPress 需要写入 wp-content/uploads 和缓存文件。
# 以 Ubuntu 为例
sudo chown -R www-data:www-data /var/www/site1.com
sudo chmod -R 755 /var/www/site1.com
三、 Nginx 虚拟主机配置(核心)
这是实现“多站共存”的关键。每个站点需要一个独立的 .conf 配置文件。
1. 创建站点配置文件
在 /etc/nginx/sites-available/ 下为每个站点创建文件,例如 site1.com.conf:
server {
listen 80;
listen [::]:80;
server_name site1.com www.site1.com;
root /var/www/site1.com;
index index.php index.html index.htm;
# 错误日志
error_log /var/log/nginx/site1.error.log;
access_log /var/log/nginx/site1.access.log;
# WordPress 伪静态规则(必须)
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 版本调整 sock 路径
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 禁止访问敏感文件
location ~ /.ht {
deny all;
}
# 静态资源缓存优化
location ~* .(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
}
2. 启用站点并测试
# 软链接到 sites-enabled
sudo ln -s /etc/nginx/sites-available/site1.com.conf /etc/nginx/sites-enabled/site1.com.conf
# 测试配置语法
sudo nginx -t
# 重启 Nginx
sudo systemctl restart nginx
对 site2.net 重复上述步骤,只需修改 server_name、root 路径和日志文件名即可。Nginx 的性能优势在于它可以通过一个进程处理成千上万个并发连接,多站点共享一个 Nginx 实例毫无压力。
四、 数据库配置(MySQL/MariaDB)
原则:每个站点使用独立的数据库用户,严禁共用同一个数据库账号。
-
登录 MySQL:
mysql -u root -p -
为每个站点创建数据库和用户:
-- 为 site1 创建库和用户 CREATE DATABASE site1_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'site1_user'@'localhost' IDENTIFIED BY 'StrongPassword123!'; GRANT ALL PRIVILEGES ON site1_db.* TO 'site1_user'@'localhost'; FLUSH PRIVILEGES; -- 为 site2 创建库和用户 CREATE DATABASE site2_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'site2_user'@'localhost' IDENTIFIED BY 'AnotherStrongPass!'; GRANT ALL PRIVILEGES ON site2_db.* TO 'site2_user'@'localhost'; FLUSH PRIVILEGES; -
安装 WordPress 时填写对应信息:
- Site1 填
site1_db,site1_user,StrongPassword123! - Site2 填
site2_db,site2_user,AnotherStrongPass!
- Site1 填
这样即使一个站点被黑,也不会直接影响其他站点的数据库数据。
五、 PHP-FPM 配置优化
多个站点共用 PHP-FPM 时,需要注意内存管理。
-
检查 PHP-FPM 池配置:
默认情况下,所有站点共用一个 PHP-FPM 池(通常位于/etc/php/8.1/fpm/pool.d/www.conf)。 -
是否要拆分池?
- 小流量站点:共用一个池没问题,节省资源。
- 大流量/高负载站点:建议为高流量站点单独创建一个 PHP-FPM 池,防止某个站点突发流量拖垮整个服务器的 PHP 处理能力。
示例:为 site1 单独建池
复制www.conf为site1.conf,修改[pool]名称为site1,监听 socket 改为/run/php/php8.1-site1.sock,并在 Nginx 配置中指向新的 socket。 -
关键参数调优:
在www.conf中关注以下参数,根据服务器内存调整:pm.max_children: 最大子进程数。公式参考:总内存 / (每个 PHP 进程占用内存)。一般 1G 内存服务器设 20-30 个足够。pm.start_servers: 启动时初始进程数。memory_limit: 单个 PHP 脚本最大内存(默认 128M 或 256M),WordPress 插件多的话建议调到 256M。
六、 安全与性能加固(国内环境必看)
-
防火墙策略:
只开放必要端口:80,443,22(SSH)。如果不用 FTP,关闭21。# Ubuntu UFW 示例 sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw allow 22/tcp sudo ufw enable -
防暴力破解:
安装fail2ban,监控 SSH 和 Nginx 登录失败记录,自动封禁 IP。 -
WAF(Web 应用防火墙):
- 低成本方案:使用云厂商提供的轻量级 WAF 或 CDN 提速服务(如阿里云 WAF、腾讯云 CDN+WAF)。将域名接入 CDN,源站只允许 CDN IP 访问,能过滤掉 90% 以上的恶意扫描和 CC 攻击。
- 自建方案:安装 ModSecurity + OWASP Core Rule Set,但配置复杂,容易误杀,新手慎用。
-
定期备份:
- 代码:Git 仓库管理,或定时打包
/var/www目录。 - 数据库:使用
mysqldump定时备份,上传到 OSS/S3/又拍云等对象存储。 - 工具推荐:宝塔面板(如果追求运维效率)、Duplicator 插件(手动备份迁移)。
- 代码:Git 仓库管理,或定时打包
-
禁用 XML-RPC:
在 Nginx 配置中添加:location = /xmlrpc.php { deny all; access_log off; log_not_found off; }这是防止 DDoS 攻击的常见手段。
七、 常见问题排查
-
502 Bad Gateway:
- 检查 PHP-FPM 是否运行:
systemctl status php8.1-fpm - 检查 Nginx 配置的 PHP socket 路径是否正确。
- 检查磁盘空间是否已满。
- 检查 PHP-FPM 是否运行:
-
403 Forbidden:
- 最常见原因:文件权限不对。确保 Web 用户(www-data/nginx)有读取权限,目录可执行权限。
- SELinux 开启导致:尝试临时关闭 SELinux 测试,或正确设置上下文。
-
页面样式错乱:
- 检查数据库中
siteurl和home字段是否与当前域名一致。 - 检查 Nginx 是否开启了 Gzip 压缩,有时压缩算法冲突会导致 CSS/JS 损坏。
- 检查数据库中
总结
多站同服的核心是:Nginx 做反向XX区分域名,MySQL 做数据库隔离,PHP-FPM 合理分配资源。
对于国内用户,强烈建议在服务器前加一层 CDN(如 Cloudflare、阿里云 CDN)。这不仅提升访问速度,还能隐藏源站 IP,大幅降低直接攻击风险,同时节省服务器带宽成本。
如果你的站点数量超过 5-10 个,或者单个站点流量较大,建议考虑容器化部署(Docker),用 Docker Compose 管理每个 WordPress 实例,隔离性更好,迁移更方便。
云技术博客