在 1GB 内存、1 核 CPU(1G1H)的极限配置下运行多个 WordPress 站点,核心矛盾在于PHP-FPM 进程数与内存占用的博弈。默认配置下,每个 WP 站点启动一个 PHP 进程往往需要 50MB-80MB 内存,加上 MySQL 和 Web 服务器开销,多开必死机。
要实现稳定运行,必须从“资源隔离”、“服务轻量化”和“架构调整”三个维度进行深度优化。以下是基于生产环境实战的优化方案:
一、操作系统与基础环境裁剪
-
更换轻量级 OS
- 拒绝 CentOS/Ubuntu Server 标准版:这些系统后台服务较多,占用常驻内存通常在 200MB+。
- 推荐方案:使用 Alpine Linux(极致轻量,常驻内存<50MB)或 Debian 12 Minimal(无图形界面,仅保留必要组件)。如果必须用 Ubuntu,请安装
ubuntu-minimal并手动卸载snapd,cloud-init(非云环境),unattended-upgrades等冗余服务。
-
Swap 分区是生命线
- 物理内存不足时,Swap 是防止 OOM Killer(内存溢出杀手)直接杀掉进程的最后一道防线。
- 操作:务必创建至少 2GB-4GB 的 Swap 文件。虽然 Swap 会拖慢速度,但在低配环境下,它能避免服务瞬间崩溃。
# 示例:创建 3GB swap fallocate -l 3G /swapfile chmod 600 /swapfile mkswap /swapfile swapon /swapfile # 调整 swappiness 为 10,减少频繁交换 echo "vm.swappiness=10" >> /etc/sysctl.conf
二、Web 服务器与 PHP 架构重构
这是优化的核心。不要使用传统的 Nginx + Apache 组合,也不要使用默认的 PHP 配置。
-
Nginx 替代 Apache
- Nginx 采用事件驱动模型,处理静态资源(图片、CSS、JS)和反向X_X的效率远高于 Apache 的多线程模型,且内存占用极低。
- 配置要点:开启
gzip压缩,设置合理的keepalive_timeout,禁用不必要的模块。
-
PHP-FPM 的极致调优
- 模式选择:放弃
dynamic模式,强制使用static或ondemand。static:固定进程数,启动快但浪费内存。ondemand:强烈推荐。没有请求时不启动进程,请求来了才启动,用完即销毁。
- 参数配置 (
php-fpm.d/www.conf):pm = ondemandpm.max_children = 2(总进程数限制,防止内存爆炸)pm.start_servers = 1pm.min_spare_servers = 1pm.max_requests = 500(防止单个进程内存泄漏导致无法释放)
- 关键策略:对于 1G1H 跑多个站,建议将不同站点配置在不同的
pool中,或者共享同一个 pool 但严格限制总进程数。如果站点数量超过 3 个,必须依赖pm.max_children的硬限制,否则一旦并发稍高,内存瞬间耗尽。
- 模式选择:放弃
-
OPcache 优化
- 确保开启 OPcache 并分配足够内存(如 64M),减少 PHP 脚本每次执行时的编译开销。
- 配置
opcache.memory_consumption和opcache.interned_strings_buffer。
三、数据库层(MySQL/MariaDB)瘦身
MySQL 是内存大户,默认配置通常预留 256MB-512MB 给缓冲池,这在 1G 服务器上是不允许的。
-
修改
my.cnf- innodb_buffer_pool_size:设置为物理内存的 15%-20%(约 150MB-200MB)。切勿超过 300MB,否则必然触发 OOM。
- max_connections:降低到 20-30。低配服务器抗不住高并发连接。
- tmp_table_size & max_heap_table_size:限制临时表大小,防止磁盘 I/O 飙升。
- skip-name-resolve:关闭 DNS 解析,提升连接速度。
-
替代方案:SQLite
- 如果站点主要是博客、展示类,且对并发写入要求不高,强烈建议将数据库迁移至 SQLite。
- SQLite 无需独立进程,直接嵌入 PHP 运行,内存占用几乎为零,性能在低并发下甚至优于 MySQL。
- 配合插件(如 WP Super Cache)可极大减轻数据库压力。
四、WordPress 应用层优化
代码层面的优化能直接减少单次请求的内存消耗。
-
主题与插件克制
- 原则:只保留最核心的功能。每多一个插件,就可能多加载一个 PHP 文件和数据库查询。
- 缓存:必须安装高性能缓存插件(如 WP Rocket 或开源的 LiteSpeed Cache,需配合 LSWS;若用 Nginx 则选 W3 Total Cache 或 Object Cache Pro)。
- 对象缓存:引入 Redis 或 Memcached 作为对象缓存层。这比单纯的文件缓存更能减少 MySQL 的查询次数。
- 注意:Redis 本身也需要内存。在 1G 环境下,建议仅开启 Redis 用于存储 Session 和 Object Cache,并限制其最大内存(
maxmemory 50mb)。如果内存实在吃紧,考虑用 File Cache 代替 Redis。
- 注意:Redis 本身也需要内存。在 1G 环境下,建议仅开启 Redis 用于存储 Session 和 Object Cache,并限制其最大内存(
-
禁用后台自动更新与 REST API
- 很多 WP 站点在后台静默调用 REST API 检查更新,这会无谓消耗资源。
- 通过
.htaccess或 Nginx 配置禁用/wp-json/接口(如果不需要前端调用)。 - 关闭 WP-Cron,改用系统的
crontab定时任务,避免由 Web 请求触发后台任务。
-
静态化输出
- 对于多站点场景,如果内容更新频率不高,建议使用 Static Page Generator 类插件,将页面生成纯 HTML 静态文件。这样 Nginx 直接返回文件,完全跳过 PHP 和 MySQL,内存占用趋近于零。
五、综合架构建议
在 1G1H 上跑多个 WP,本质上是在做“减法”。如果上述优化后仍不稳定,建议考虑以下架构调整:
-
容器化隔离(Docker):
- 使用 Docker Compose 管理,可以为每个站点分配独立的
cgroup内存限制(例如每个容器限制 256MB),防止某个站点内存泄漏拖垮整个服务器。 - 使用
nginx-proxy-manager统一管理域名和 SSL。
- 使用 Docker Compose 管理,可以为每个站点分配独立的
-
读写分离与 CDN:
- 接入国内 CDN(如阿里云 CDN、腾讯云 CDN)。将静态资源(图片、CSS、JS)全部走 CDN,大幅减少源站带宽和 IO 压力。
- 如果可能,将数据库迁移到独立的 RDS 实例(哪怕是最便宜的入门版),让本地服务器只负责 Web 层。
-
最终兜底方案:
- 如果业务允许,将站点拆分部署。1G1H 更适合单点高可用部署,而不是多站点堆叠。可以考虑使用轻量级 VPS 跑核心业务,其他边缘站点迁移至免费的静态托管服务(如 GitHub Pages, Vercel, Cloudflare Pages)或 Serverless 架构。
总结
在 1G1H 环境下运行多 WordPress 站点的公式是:
Alpine/Minimal OS + Nginx + PHP-FPM (ondemand) + MySQL (极度保守配置) + Redis/File Cache + 静态化插件。
风险提示:这种配置属于“走钢丝”,抗突发流量能力极弱。务必配置监控脚本(如 fail2ban 防止暴力破解,monit 或 systemd 监控内存),一旦内存使用率持续超过 90%,立即触发自动重启或报警,避免数据损坏。如果业务增长,最直接有效的方案永远是升级服务器配置,而非无止境地优化代码。
CLOUD云枢