场景与目标


先定原则(少折腾也能稳)

  1. 别为了“先进”上 K8s:现状是 LEMP/LEMP+容器混合,先把并发与缓存做对。
  2. 不要为了省资源去降 PHP 版本:省不出多少,风险更大;真正省资源靠缓存与并发控制。
  3. 避免面板不可见的“野改”:能在面板里做的优先在面板做,减少升级覆盖风险。
  4. 先保命再加速:没有 swap 的 4G 机器,突发内存峰值容易直接 OOM。

一、网络暴露与容器通信(避免“看着安全、实际有坑”)

1) 用 docker ps 判断端口是否暴露到宿主机/公网

BASH
docker ps --format 'table {{.Names}}\t{{.Ports}}'
点击展开查看更多

当时关键结果(示例):

结论:

2) 为什么把 PHP-FPM 改 listen=127.0.0.1 会 502?

因为容器内的 127.0.0.1 只代表容器自身,而 OpenResty 与 PHP 通过宿主机端口映射/容器网络通信;当 PHP 只监听容器内回环地址时,外部自然连不上 → 502。

正确思路:保持容器内 listen=0.0.0.0:9000,并确保宿主机侧只对本地开放(127.0.0.1 映射)即可。


二、PHP-FPM:用“限并发 + 防卡死 + 防膨胀”换稳定

目标

1) 采用 pm = ondemand

适合低中流量、多站点、希望省内存的场景:没有请求就不常驻 worker。

2) 关键参数(最终采用)

注意:ondemandpm.start_servers / min_spare / max_spare 不再有意义,建议移除避免误判。

3) 用 FPM status 验收是否需要继续调参

看这些就够:


三、缓存体系:把 PHP 从请求链路里“尽量拿掉”才省资源

1) 页面缓存(Page Cache):WP Super Cache ✅

所有站点统一使用 WP Super Cache,并采用“简单模式(推荐)”。

建议设置要点:

纯内容站 + 匿名访问为主:Page Cache 的收益最大(直接减少 PHP 调用次数)。

2) 对象缓存(Object Cache):Redis ✅

已确认所有站点 Redis 插件“绿灯”并且各站点 key 前缀不冲突(多站最常见坑)。

对象缓存的价值:

3) OPcache:确认已开启 ✅

在 PHP 容器内确认:

BASH
docker exec -it PHP8 sh -lc 'php -i | egrep -i "Zend OPcache =>|opcache.enable =>|opcache.memory_consumption =>|opcache.jit" | head -n 30'
点击展开查看更多

关键输出(示例):

结论:OPcache 已开,128MB 对 4 个小站一般够用;若后续插件/主题变多再考虑增到 192/256。


四、MariaDB:小库别“浪费内存”,把风险上限收紧

背景

采取的调整(面板内完成)

  1. 降低 key_buffer_size
  1. 提高 innodb_buffer_pool_size
  1. 提高 tmp_table_size(并确保 max_heap_table_size 不成为短板)
  1. 降低 max_connections

经验判断


五、系统层兜底:开启 swap 防止突发 OOM(强烈推荐)

为什么必须要 swap?

4G 机器一旦出现:

在无 swap 情况下容易直接 OOM → 容器被杀 → 站点短暂挂。

最终实施:2GB swap(/swapfile)

关键步骤(已验证可用):

BASH
sudo fallocate -l 2G /swapfile || sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
swapon --show
free -h
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
点击展开查看更多

并设置:

BASH
printf '\nvm.swappiness=10\nvm.vfs_cache_pressure=50\n' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
点击展开查看更多

目标:


六、上线第 4 个站的“最小风险”步骤

  1. 复制现有栈(Redis + WP Super Cache;OPcache 默认已开)
  2. 评论/搜索做回归:
    • 发表评论后文章页能看到新评论(缓存清理正确)
    • 搜索正常且不出现异常缓存结果(搜索页排除正确)
  3. 观察 1–2 天:
    • PHP-FPM status:queue=0、max_children_reached 不增长
    • docker stats:PHP/MariaDB 内存不持续爬升
    • swap 使用量长期接近 0

七、快速巡检命令(只读、随时可跑)

1) 容器资源占用

BASH
docker stats --no-stream
点击展开查看更多

2) 系统内存与 swap

BASH
free -h
swapon --show
点击展开查看更多

3) OPcache 状态

BASH
docker exec -it PHP8 sh -lc 'php -i | egrep -i "Zend OPcache =>|opcache.enable =>|opcache.memory_consumption =>|opcache.jit" | head -n 30'
点击展开查看更多

4) 端口映射(确认不对公网暴露)

BASH
docker ps --format 'table {{.Names}}\t{{.Ports}}'
点击展开查看更多

结论(这套就够用)

在“不升级 VPS、不搞分站 PHP 多容器”的约束下:

后续若真的出现 502/CPU 飙升,优先排查:

  1. 缓存是否失效(Page Cache 未命中)
  2. 爬虫/扫描是否激增(wp-login、xmlrpc)
  3. 某插件是否产生大量慢请求/写入
  4. PHP-FPM queue / max_children reached 是否开始增长

版权声明

作者: 梦随乡兮

链接: https://imsxx.com/1panel-multi-wp-2c4g-openresty-phpfpm-mariadb-redis-optimization/

许可证: CC BY-NC-SA 4.0

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。请注明出处、非商业性使用,并以相同方式共享。

开始搜索

输入关键词搜索文章内容

↑↓
ESC
⌘K 快捷键