同时运行两个WordPress站点,2核2G服务器需要优化哪些配置?

在 2 核 2G(2 vCPU, 2GB RAM)的服务器上同时运行两个 WordPress 站点属于高负载场景。默认配置下,PHP-FPM、MySQL/MariaDB 和 Web 服务器(Nginx/Apache)很容易争抢内存,导致 Swap 频繁交换,进而引发网站卡顿甚至服务崩溃。

要稳定运行,必须从操作系统内核、数据库、Web 服务器、PHP 运行时以及缓存策略五个维度进行深度优化。以下是具体的优化方案:

1. 核心瓶颈突破:Swap 分区与内存管理

2GB 内存对于双站 + 数据库来说非常紧张,Swap(交换空间)是必须的,但需要合理设置以防止性能骤降。

  • 创建 Swap 文件
    建议创建一个 2GB – 4GB 的 Swap 文件作为内存溢出时的缓冲。

    # 示例:创建 2GB swap
    fallocate -l 2G /swapfile
    chmod 600 /swapfile
    mkswap /swapfile
    swapon /swapfile
    # 写入 fstab 开机自动挂载
    echo '/swapfile none swap sw 0 0' >> /etc/fstab
  • 调整 Swappiness 参数
    默认值为 60,意味着系统会较早使用 Swap。对于数据库这种对延迟敏感的服务,应降低该值,让物理内存优先被使用,仅在物理内存耗尽时才动用 Swap。

    # 临时生效
    sysctl vm.swappiness=10
    # 永久生效 (修改 /etc/sysctl.conf)
    echo "vm.swappiness=10" >> /etc/sysctl.conf

2. 数据库优化 (MySQL/MariaDB)

这是内存消耗的大户。默认配置通常是为大内存服务器设计的,必须大幅削减。

  • 限制 Buffer Pool 大小
    不要让 MySQL 占用超过总内存的 50%(约 900MB-1GB),否则留给 PHP 的空间不足。
    编辑 /etc/mysql/my.cnf/etc/my.cnf.d/server.cnf

    [mysqld]
    # 根据实际可用内存调整,2G 机器建议设置在 768M - 900M
    innodb_buffer_pool_size = 768M
    
    # 关键:关闭不必要的日志和检查点,减少 I/O
    innodb_log_file_size = 32M
    innodb_flush_log_at_trx_commit = 2 
    sync_binlog = 0
    
    # 连接数控制
    max_connections = 50
    thread_cache_size = 10
  • 禁用慢查询日志:除非正在调试,否则生产环境建议关闭 slow_query_log,因为频繁写磁盘会拖慢 CPU。

3. Web 服务器优化 (推荐 Nginx)

Apache 的 Prefork MPM 模式每个进程都占用大量内存,强烈建议使用 Nginx 搭配 PHP-FPM。

  • Nginx 配置优化
    • 开启 gzip 压缩以减少带宽和传输时间。
    • 配置静态资源缓存(图片、CSS、JS)。
    • 调整 worker 进程数:worker_processes auto; 或固定为 2
    • 增加 open_file_cache 以缓存文件句柄,减少系统调用。

4. PHP-FPM 进程池调优 (最关键步骤)

PHP-FPM 是每个请求启动一个进程(或复用),如果不限制,两个站点很容易把 2G 内存吃光。

  • 计算最大进程数
    假设每个 PHP 进程平均占用 40MB-60MB(含 WP 插件开销),2G 内存扣除 OS(200M)+DB(800M)+Nginx(50M) 后,剩余约 950MB。
    建议分配给 PHP 的内存约为 600MB-700MB。
    因此,总 pm.max_children 不应超过 10-12

  • 配置策略
    如果两个站点流量差异大,可以分设两个 pool;如果流量相似,共用一个 pool 并限制总数。
    编辑 /etc/php/8.x/fpm/pool.d/www.conf (路径视版本而定):

    ; 启动模式设为动态 (ondemand),节省空闲资源
    pm = dynamic
    
    ; 核心参数:总子进程数不超过 10-12
    pm.max_children = 10
    
    ; 初始启动进程数
    pm.start_servers = 2
    
    ; 最小空闲进程数
    pm.min_spare_servers = 1
    
    ; 最大空闲进程数
    pm.max_spare_servers = 3
    
    ; 单个请求超时时间,防止卡死
    request_terminate_timeout = 30s

    注意:如果某个站点有特别耗资源的插件(如 WooCommerce),可能需要单独划分一个 pool 并限制其 max_children

5. 应用层缓存 (WordPress 侧)

没有缓存,每次访问都要执行 PHP 脚本和查询数据库,CPU 会瞬间满载。

  • 对象缓存 (Object Cache)
    引入 RedisMemcached。这能极大减少 MySQL 查询压力。

    • 安装 Redis:apt install redis-server
    • 配置 WP 插件(如 WP Super Cache 或 W3 Total Cache)使用 Redis 作为对象缓存后端。
    • 注意:Redis 本身也需要内存(约 50-100MB),需确保上述数据库和 PHP 配置已预留空间。
  • 页面缓存
    使用 WP RocketLiteSpeed Cache (若用 LSWS) 或 W3 Total Cache 开启“页面缓存”,将动态生成的 HTML 保存为静态文件,直接由 Nginx 返回,跳过 PHP 执行。

6. 其他辅助优化

  • 禁用后台自动更新:WordPress 默认的自动更新功能会在后台运行脚本,消耗资源。建议在 wp-config.php 中禁用:
    define('DISABLE_WP_CRON', true);
    // 然后通过 Linux Crontab 每 15 分钟运行一次 wp-cron.php
    */15 * * * * /usr/bin/php /var/www/html/wp-cron.php > /dev/null 2>&1
  • 监控与告警
    安装 htopglances 实时观察内存和 CPU 使用情况。配置简单的脚本监控,当内存使用率超过 85% 时发送通知。

总结配置清单

组件 关键调整项 目标值/策略
OS Swap 大小 2GB – 4GB
OS Swappiness 10 (降低 Swap 频率)
MySQL innodb_buffer_pool_size 768M – 900M (严禁 >1GB)
MySQL max_connections 50 (避免并发过高)
Nginx Worker 进程 2 (匹配 CPU 核心数)
PHP-FPM pm.max_children 10 (严格控制,防止 OOM)
PHP-FPM pm 模式 dynamic (按需启动)
Cache Redis/Memcached 启用,减少 DB 压力
Cache 页面缓存 开启全页面静态化

风险提示
如果在上述配置下,遇到突发流量(如秒杀活动),服务器仍可能因内存不足而崩溃。此时唯一的办法是升级硬件(加到 4G 内存)或迁移其中一个站点到另一台服务器。2G 内存仅适合低流量的双站运营。