在云服务器上跑多个 WordPress 站点,核心矛盾在于“资源隔离”与“运维便利”之间的平衡。如果配置不当,一个站点的漏洞(比如被挂马、SQL 注入)很容易导致整个服务器沦陷,甚至牵连其他无辜站点。
要实现“相对安全”的多站点共存,不能只靠单一手段,必须从用户权限隔离、Web 服务配置、数据库隔离和防御层加固四个维度入手。以下是经过实战验证的配置方案:
1. 核心原则:Nginx + PHP-FPM 的进程池隔离
这是最关键的一步。很多新手教程推荐所有站点共用一个 php-fpm 进程池,这是大忌。一旦某个站点发生致命错误或被恶意利用,可能影响整个 PHP 解释器状态。
正确做法:
为每个 WordPress 站点创建独立的 php-fpm 进程池,并绑定不同的 Unix Socket 或端口。
- 用户隔离:为每个站点创建独立的系统用户(如
wp-site1,wp-site2)。 - PHP-FPM 配置示例:
; /etc/php/8.1/fpm/pool.d/site1.conf [site1] user = wp-site1 group = wp-site1 listen = /run/php/php8.1-fpm-site1.sock pm = dynamic pm.max_children = 50 ; 关键:限制该池的资源使用 php_admin_value[open_basedir] = /var/www/site1:/tmp php_admin_value[disable_functions] = exec,passthru,shell_exec,system注意:
open_basedir是防止跨目录访问的神器,它严格限制了 PHP 只能访问指定目录及其子目录。
2. Web 服务器(Nginx)配置细节
Nginx 作为反向XX,需要确保请求不会误发到错误的后端。
- 独立 Server Block:每个站点必须有独立的
server {}块。 - 禁止目录遍历:
location ~ ^/(wp-content|wp-includes)/.*.php$ { deny all; access_log off; log_not_found off; } # 更严格的策略:直接拦截对 wp-config.php 的请求 location ~* wp-config.php { deny all; return 404; } - 隐藏版本信息:
server_tokens off; fastcgi_hide_header X-Powered-By; proxy_hide_header X-Powered-By;
3. 数据库隔离:最小权限原则
不要所有站点共用同一个 MySQL 用户!
- 独立数据库:每个 WP 站点拥有独立的 Database。
- 独立 MySQL 用户:
- 创建用户
user_site1,密码复杂度高。 - 授权:
GRANT ALL PRIVILEGES ON site1_db.* TO 'user_site1'@'localhost'; - 关键点:确保
host部分是localhost而不是%,防止远程直连数据库。
- 创建用户
- 物理隔离(可选但推荐):如果服务器内存允许,考虑使用 Docker 容器化部署每个站点。Docker 天然提供了命名空间隔离,比传统 LAMP/LNMP 架构更安全,且便于快照备份。
4. 文件系统权限:755/644 铁律
这是国内云主机最常见的安全隐患来源——文件权限过大。
- 目录权限:
755(所有者可读写执行,组和其他人可读执行)。 - 文件权限:
644(所有者可读写,其他人只读)。 - 特殊文件:
wp-config.php必须是600或400,仅所有者可读。uploads/目录下的.php文件应禁止执行。
- 所有权归属:
chown -R wp-site1:wp-site1 /var/www/site1 chmod -R 755 /var/www/site1/wp-content/uploads find /var/www/site1 -type f -exec chmod 644 {} ; find /var/www/site1 -type d -exec chmod 755 {} ;
5. 应用层防护:WAF 与插件策略
-
启用 WAF(Web Application Firewall):
- 如果使用阿里云、腾讯云等国内大厂,务必开启其自带的云盾 WAF 或安全组规则。
- 配置基础规则:拦截 SQL 注入、XSS、常见扫描器 User-Agent。
- 重要:将 CDN 回源 IP 加入白名单,否则 WAF 会误拦正常流量。
-
WordPress 插件精简:
- 删除所有未使用的主题和插件。
- 避免使用“一键优化”、“全能 SEO”类臃肿插件。
- 优先选择维护活跃、代码规范的主流插件。
-
登录保护:
- 修改默认登录地址
/wp-login.php(可通过 Nginx 重写或插件实现)。 - 启用双因素认证(2FA),推荐使用 Google Authenticator 插件。
- 限制登录尝试次数(防暴力破解)。
- 修改默认登录地址
6. 备份与监控:最后的防线
-
自动备份:
- 每日全量备份数据库 + 增量备份上传目录。
- 异地存储:备份文件必须同步到 OSS/COS/S3 或其他对象存储,绝不能只存在本机磁盘。
- 测试恢复流程:每季度手动还原一次,验证备份有效性。
-
日志监控:
- 启用 Nginx 访问日志和错误日志。
- 设置告警:当某站点出现大量 4xx/5xx 错误或异常流量时,通过钉钉/企业微信/邮件告警。
- 使用
fail2ban自动封禁频繁失败的 IP(针对 SSH 和 Nginx 登录)。
7. 操作系统层面加固
- 关闭不必要的端口:只开放 80/443(HTTP/HTTPS)、22(SSH,建议改端口)、以及可能的 9000+(PHP-FPM 内部通信,不对外暴露)。
- SSH 安全:
- 禁用密码登录,仅允许密钥认证。
- 禁用 root 远程登录。
- 定期更新:
apt update && apt upgrade(Debian/Ubuntu)或yum update(CentOS/Rocky)。- 及时更新内核、OpenSSL、Nginx、PHP 版本。
总结:最佳实践架构图
[客户端]
|
[VPC 安全组] -> 仅放行 80/443/自定义SSH端口
|
[CDN/WAF (云厂商)] -> 过滤 CC 攻击、SQL 注入
|
[Nginx] -> 独立 Server Block, 静态资源缓存
|
[PHP-FPM Pool] -> 独立进程池, open_basedir 限制
|
[MySQL/MariaDB] -> 独立 DB & User, localhost 连接
|
[File System] -> 755/644 权限, wp-config.php 400
最后提醒:没有绝对安全的系统,只有持续的安全管理。多站点共存的本质风险是“横向移动”,因此隔离是唯一解法。如果你发现某个站点频繁被黑,优先考虑是否因为与其他站点共享了同一套 PHP 环境或数据库权限过宽。对于高价值业务,强烈建议拆分到不同 VPC 或使用 Kubernetes 编排,彻底实现网络级隔离。
云技术博客