努力
加油

多个WordPress站点共用一台服务器怎么配置更安全?

在云服务器上跑多个 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 编排,彻底实现网络级隔离。