在 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):
引入 Redis 或 Memcached。这能极大减少 MySQL 查询压力。- 安装 Redis:
apt install redis-server - 配置 WP 插件(如 WP Super Cache 或 W3 Total Cache)使用 Redis 作为对象缓存后端。
- 注意:Redis 本身也需要内存(约 50-100MB),需确保上述数据库和 PHP 配置已预留空间。
- 安装 Redis:
- 页面缓存:
使用 WP Rocket、LiteSpeed 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 - 监控与告警:
安装htop或glances实时观察内存和 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 内存仅适合低流量的双站运营。
PHPWP博客