没有不值得去解决的问题,也没有不值得去学习的技术!

WordPress 7.0 + PHP 8.5 服务器配置全面审计:PHP-FPM、OPcache、Redis、RDS 与 WordPress 调优实战

WordPress 撰写设置中已开启可能影响网站性能的 Gutenberg 实时协作功能

作者:

,

WordPress 性能优化手记

如 如图1 所示,站点健康直接提示这是一个可能对性能或安全性产生重大影响的问题,需要优先解决。

(1) 从站点健康警告到全绿通关

PHP Fatal error: Uncaught RedisException: OOM command not allowed when used memory > 'maxmemory'. in /data/wwwroot/.../wp-content/plugins/w3-total-cache/Cache_Redis.php:150

(2) 解决 WordPress + Polylang 批量处理标签时遇到的 Redis OOM 错误

采用 ondemand 模式,适合 1 核小内存机器,空闲时释放进程。最终配置如下:如图4

(3) 一次WordPress站点504错误的排查与优化实录

优化前最终基准数据:历史累计504错误129条(6月3日峰值126条,为爬虫批量爬标签导致)。

(4) 从单日126次504超时到彻底稳定:WordPress 1核2G服务器极限优化全记录(附全部实操命令)

WebPageTest 核心指标

(5) WordPress性能基准测试与CDN选型实录:从国内拨测到海外WebPageTest,1核2G服务器如何面向全球

页面底部提示“此响应不是合法的 JSON 响应”。

(6) WordPress 标签保存失败?Nginx 限流规则惹的祸 —— 一次完整的 429 问题排查与解决

表示页面仍然是动态生成,没有缓存命中。

(7) WordPress + Nginx + W3 Total Cache 缓存未生效排查全过程(OneinStack 实战)

图7:带 Query String 后,W3TC 显示 Requested URI contains query

(8) WordPress CPU 再次满载:动态参数如何穿透 CDN 与 W3TC 页面缓存

图1:阿里云 ECS 在 14:33~14:42 期间 CPU 使用率持续接近 100%,而内存使用率整体较为稳定

(9) WordPress 服务器 CPU 再次满载:从 Nginx 499、PHP-FPM、Redis 到 W3TC 冷缓存的完整排查

图4:W3TC 最终使用 300 秒 × 7 页,并切换到中英文联合 Sitemap

(10) 从 CPU 告警到双域名预缓存:W3 Total Cache、EdgeOne 与 Cloudflare 96 小时缓存优化实战

WordPress 所有归档模板中使用 Language Visibility 和 WPCode Shortcode 添加中英文 Adsterra 广告

(11) WordPress 三域名架构再次踩坑:Adsterra 归档广告不生效,最终定位到 W3TC Object Cache

WordPress 多语言多域名缓存排查:修复 Polylang + W3 Total Cache 跨 Host 缓存失效问题

(12) WordPress 多语言多域名缓存排查:修复 Polylang + W3 Total Cache 跨 Host 缓存失效问题

WordPress 多域名环境下中文文章详情页未显示 Polylang 语言切换器

(13) WordPress 多域名下 Polylang 语言切换器延迟:W3TC Redis 跨 Host 缓存排查记录

图8:选择 2 核 4 GiB 后显示的实际补差价、2 Mbps 带宽和重启选项

(14) 从 CPU 再次告警到 ECS 升配:WordPress 服务器从 1 核 2G 升级到 2 核 4G 实录

**Alt:** WordPress 生产环境完成 PHP 8.5.9 升级,终端显示 OPcache、Imagick、Redis、Nginx、WordPress 版本及中英文站和后台域名均正常返回 HTTP 200

(15) OneinStack 生产环境将 PHP 8.1.19 升级到 PHP 8.5.9:Imagick 编译失败与 WordPress 多域名缓存验收

阿里云 OneinStack 服务器升级完成,终端显示 Nginx 1.30.4、OpenSSL 3.5.7、PCRE 8.45 和 PHP 8.5.9,Nginx 配置检查成功

(16) 阿里云 OneinStack 实战:将 Nginx 1.24.0 升级到 1.30.4,并同步升级 OpenSSL 3.5.7

阿里云 OneinStack 服务器 Redis 从 7.0.11 升级到 8.10.0 后的版本与运行状态对比截图

(17) 阿里云 OneinStack 实战:将 Redis 7.0.11 升级到 8.10.0,并完成内核优化与回滚保护

GitHub 上为 PublishPress Series 提交 PHP 8.5 SplObjectStorage 弃用警告 Issue 的页面

(18) WordPress 升级 PHP 8.5 后的插件兼容性排查:该修的修,该停的停,该等上游的等

WordPress Post Views Counter 热门文章排行榜区块及浏览量设置界面,用于排查首页查询性能问题

(19) WordPress 动态首页从 19 秒降到 1 秒以内:Post Views Counter 热门文章查询性能问题排查与 MU Plugin 优化实战

WordPress 撰写设置中已开启可能影响网站性能的 Gutenberg 实时协作功能

(20) WordPress 7.0 + PHP 8.5 服务器配置全面审计:PHP-FPM、OPcache、Redis、RDS 与 WordPress 调优实战

最近一直在整理 WordPress 服务器环境。

此前网站首页曾经出现过明显的动态响应性能问题,相关排查和优化过程已经单独记录:

问题解决以后,我继续把当前服务器的主要性能配置从头到尾检查了一遍,希望确认哪些参数确实需要调整,哪些已经足够合理,以及哪些问题应该暂时保留观察。

目前网站的主要运行环境包括:

  • WordPress 7.0.3
  • Twenty Twenty-Five 1.5
  • Nginx 1.30.4
  • PHP 8.5.9
  • Redis 8.10.0
  • MySQL 5.7.32-log
  • 阿里云 RDS
  • 阿里云 ECS
  • 2 核 CPU
  • 约 3.6 GiB 内存
  • 2 GiB Swap
  • 中文站使用 EdgeOne
  • 英文站使用 Cloudflare

这次主要检查了 Nginx、PHP-FPM、OPcache、Redis、W3 Total Cache、RDS / MySQL 和 WordPress 应用层。

最终真正修改的参数其实不多。

很多配置虽然乍一看似乎还有调整空间,但进一步结合日志、内存、缓存命中率和实际负载以后,最后反而决定保持原状。


一、Nginx:当前配置整体健康

当前 Nginx 主要参数包括:

Plaintext
worker_processes auto
worker_connections 51200
worker_rlimit_nofile 51200

sendfile on
tcp_nopush on
tcp_nodelay on

keepalive_timeout 120

从当前服务器负载、连接情况和文件描述符限制来看,没有发现明显瓶颈。

因此这些参数继续保持。

源站暂时不启用额外限流

Nginx 全局配置中已经定义了请求限流相关区域,例如:

Plaintext
limit_req_zone
limit_conn_zone

但前台站点目前没有真正启用对应限流规则。

中文站前面已经有 EdgeOne,英文站前面有 Cloudflare,而源站当前又没有完整恢复 CDN 后面的真实访客 IP。

如果直接根据 Nginx 当前看到的来源 IP 限流,有可能限制到的是 CDN 节点,而不是真正的最终访客。

因此目前继续采用:

  • 中文站由 EdgeOne 做前台防护和限流;
  • 英文站由 Cloudflare 做前台防护和限流;
  • 源站 Nginx 不重复增加一套基于当前来源 IP 的限流规则。

二、PHP-FPM:pm.max_children=10 已经出现实际瓶颈

原来的 PHP-FPM 配置为:

INI
pm = dynamic

pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 4

pm.max_requests = 500

PHP-FPM 日志中已经多次出现:

Plaintext
server reached pm.max_children setting (10)

这说明在部分时间段,10 个 PHP-FPM 工作进程确实会全部被占用。

进一步检查当时的访问情况,还能看到不少搜索引擎和 SEO 爬虫请求,包括:

  • Sogou
  • Bingbot
  • Googlebot
  • AhrefsBot
  • MJ12bot

与此同时,我目前还在通过 SlyTranslate 批量处理历史文章。

部分 AI 翻译请求会持续几十秒甚至几分钟,在执行期间会长时间占用 PHP-FPM 工作进程。

最终将配置调整为:

INI
pm = dynamic

pm.max_children = 14
pm.start_servers = 3
pm.min_spare_servers = 3
pm.max_spare_servers = 6

pm.max_requests = 500

为什么只提高到 14?

这台 ECS 总内存只有约 3.6 GiB。

Redis 本身已经长期使用约 800 MiB 左右内存,而 PHP-FPM 单个工作进程实际内存占用大约在 100 MiB 上下。

因此没有直接把:

Plaintext
pm.max_children

提高到 20 或 30,而是先从:

Plaintext
10

增加到:

Plaintext
14

修改完成以后,服务器内存状态为:

Plaintext
总内存:约 3.6 GiB
已使用:约 1.2 GiB
可用:约 2.1 GiB

Swap:
总计约 2.0 GiB
已使用约 54 MiB

当前没有出现明显的内存压力。

因此:

INI
pm.max_children = 14

暂时作为新的运行基准。

以后如果再次频繁出现:

Plaintext
server reached pm.max_children setting (14)

并且当时仍然有足够可用内存,再考虑继续增加。


三、PHP-FPM 慢日志继续保持 3 秒

PHP-FPM 当前还配置:

Plaintext
request_slowlog_timeout = 3s

历史文章 AI 翻译本身可能运行一两分钟,因此慢日志中经常会看到:

  • SlyTranslate
  • WordPress AI Client
  • curl_exec()
  • 外部 AI API 请求

这些长时间运行的请求并不一定代表 WordPress 页面本身存在性能异常。

但我最终没有为了减少这类记录,就把慢日志阈值调整到 60 秒甚至 120 秒。

原因是:

慢日志更重要的作用,是及时发现本来不应该很慢的普通网页请求。

如果把阈值提高到 120 秒,那么一个突然需要 5 秒、10 秒甚至 20 秒才能完成的普通 WordPress 请求,也不会被记录。

因此继续保持:

Plaintext
request_slowlog_timeout = 3s

以后遇到明确属于 AI 翻译的慢日志,可以结合调用栈直接判断为预期行为。


四、OPcache:运行状态很好,但重新分配了一下内存

检查 PHP-FPM 实际使用的 OPcache 后发现:

Plaintext
OPcache 命中率:约 99.997%
已缓存 PHP 脚本:约 2982 个
重启次数:0

说明 OPcache 本身并不存在明显的容量不足或者频繁失效问题。

原来的主要配置为:

INI
opcache.memory_consumption=128
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=100000
opcache.jit=0

运行状态显示:

  • 普通 OPcache 已经使用约 93 MiB;
  • Interned Strings 使用率接近 89%;
  • JIT 实际处于关闭状态。

但在 PHP 8.5 当前运行状态下,即使:

INI
opcache.jit=0

JIT Buffer 仍然存在约 64 MiB 的默认空间。

对于当前这个 WordPress 网站来说,主要开销更多来自:

  • 数据库;
  • Redis;
  • WordPress 插件;
  • 网络 I/O;
  • 外部 API。

并没有明显的 CPU 密集型 PHP 计算场景,因此目前没有启用 JIT 的实际需求。

最终修改为:

INI
opcache.memory_consumption=192
opcache.interned_strings_buffer=32

opcache.jit=0
opcache.jit_buffer_size=0

同时继续保持:

INI
opcache.max_accelerated_files=100000
opcache.validate_timestamps=1
opcache.revalidate_freq=60

修改完成以后,PHP-FPM 实际加载值也确认已经变为:

Plaintext
opcache.interned_strings_buffer => 32
opcache.jit => 0
opcache.jit_buffer_size => 0
opcache.memory_consumption => 192

这次调整的重点并不是期望 WordPress 因此获得明显的单次请求性能提升,而是:

关闭当前没有实际价值的 JIT Buffer,同时给普通 OPcache 和 Interned Strings 留出更加充足的长期空间。


五、Redis:当前指标很好,因此保持不动

Redis 当前主要承担 WordPress 对象缓存。

当时实际内存大致为:

Plaintext
已使用:约 810 MiB
RSS:约 826 MiB
峰值:约 884 MiB

主要配置:

Plaintext
maxmemory = 1G
maxmemory-policy = allkeys-lru

持久化关闭:

Plaintext
AOF:关闭
RDB 自动保存:关闭

因为当前 Redis 主要用作缓存,而不是保存必须长期持久化的业务数据。

长期指标大约为:

Plaintext
缓存命中率:约 99.05%
缓存驱逐:0
拒绝连接:0

内存碎片率约:

Plaintext
1.02

从这些数据来看,当前 Redis 状态非常健康。

因此没有调整:

Plaintext
maxmemory = 1G

既没有因为已经使用 800 多 MiB 就增加到 1.5 GiB,也没有为了节省 ECS 内存而降低到 512 MiB。

当前 1 GiB:

  • 没有发生缓存驱逐;
  • 还有一定增长空间;
  • 对当前服务器总内存也还能接受。

所以继续保持。


六、W3 Total Cache:暂时保持当前参数

继续检查 W3 Total Cache 后,磁盘缓存目录总大小一度达到大约:

Plaintext
1.5 GiB

其中:

Plaintext
page_enhanced    约 1.4 GiB
object           约 104 MiB
db               约 20 KiB

历史磁盘对象缓存

cache/object/ 大约还有:

Plaintext
104 MiB

但是最新文件时间已经停留在 2026 年 5 月。

当前真正使用的对象缓存已经是 Redis,因此这部分基本可以判断为历史磁盘缓存残留。

历史数据库缓存

cache/db/ 当前没有实际有效缓存文件。

W3TC 数据库缓存也已经关闭。

这部分同样没有必要现在处理。

大量 _old 页面缓存

真正比较值得注意的是:

Plaintext
cache/page_enhanced/

进一步统计后,大约为:

Plaintext
当前有效页面缓存:约 133 MiB
_old 旧缓存:约 1.25 GiB

当前页面缓存大致配置为:

Plaintext
页面缓存寿命:4 天
垃圾回收周期:3600 秒
缓存预热:开启
每 300 秒预热 7 个 URL

目前网站正在持续批量修改大量历史文章。

文章更新过程中,本身就可能不断导致:

  • 首页缓存失效;
  • 分类页缓存失效;
  • 标签页缓存失效;
  • 文章页缓存失效;
  • 相关页面缓存重新生成。

因此当前大量 _old 文件,暂时还不能判断究竟属于:

  • 正常的历史文章批量更新结果;
  • 页面缓存清除机制产生的临时状态;
  • 还是 W3TC 垃圾回收确实存在长期异常。

目前没有修改:

  • 页面缓存寿命;
  • 缓存预热;
  • 页面缓存清除规则;
  • 垃圾回收参数。

等历史文章全部处理完成以后,让网站正常运行 24~48 小时,再重新观察页面缓存和 _old 文件变化。


七、阿里云 RDS:MySQL 大部分参数已经比较健康

当前 WordPress 数据库总大小约:

Plaintext
830.80 MiB

其中主要表包括:

Plaintext
wp_posts       约 497.80 MiB
wp_postmeta    约 208.58 MiB
wp_post_views  约 32.33 MiB
wp_options     约 14.48 MiB

InnoDB Buffer Pool

当前配置:

Plaintext
innodb_buffer_pool_size = 768M

实际逻辑缓存命中率约:

Plaintext
99.99987%

说明绝大多数数据读取已经能够直接从 InnoDB 缓冲池完成。

因此 768 MiB 暂时没有继续增加的必要。

最大连接数

当前:

Plaintext
max_connections = 2532

看起来非常大。

但历史实际最大连接数只有:

Plaintext
Max_used_connections = 29

检查时:

Plaintext
Threads_connected = 10
Threads_running = 1

也就是说,数据库连接数完全不是当前瓶颈。

虽然:

Plaintext
2532

明显高于网站当前实际需求,但既然没有产生实际资源问题,也没有为了单纯让参数“更合理”而调整。

Thread Cache

数据库长期累计连接次数超过 1400 万次,但真正创建的新线程只有几十个。

说明:

Plaintext
thread_cache_size

已经工作得很好。

Table Cache

表缓存同样没有出现溢出。

因此以下参数全部继续保持:

  • InnoDB Buffer Pool;
  • max_connections
  • thread_cache_size
  • table_open_cache
  • table_definition_cache
  • innodb_flush_log_at_trx_commit
  • innodb_flush_method
  • 慢查询日志。

八、tmp_table_size=2M 看起来很小,但没有直接调大

数据库检查中,一个很容易引起注意的参数是:

Plaintext
tmp_table_size = 2M

同时:

Plaintext
max_heap_table_size = 64M

长期统计中,磁盘临时表比例大约为:

Plaintext
27.43%

单看这些数字,很容易直接认为:

tmp_table_size=2M 太小。

然后把它调整到:

Plaintext
16M
32M
64M

但 MySQL 是否创建磁盘临时表,并不完全由这个参数决定。

查询涉及某些字段类型、分组方式和排序结构时,即使提高:

Plaintext
tmp_table_size

也未必能够避免磁盘临时表。

因此没有单纯根据:

Plaintext
27.43%

这个比例去修改参数。

当前继续保持:

Plaintext
tmp_table_size = 2M

以后如果慢查询日志明确显示,大量实际慢查询确实受到内存临时表上限影响,再针对性调整。


九、wp_options 有 14 MiB,但真正自动加载的数据并不大

wp_options 表总大小大约:

Plaintext
14.48 MiB

进一步统计不同 autoload 状态以后发现,大致为:

Plaintext
autoload=off       约 10.88 MiB
autoload=auto-off  约 0.62 MiB

autoload=yes       约 0.26 MiB
autoload=auto      约 0.18 MiB
autoload=on        约 0.07 MiB

也就是说,真正会随 WordPress 请求自动加载的数据只有大约:

Plaintext
0.5 MiB

这个体积并不大。

占空间比较多的 Option 主要属于:

  • Transient;
  • Site Transient;
  • Feed 缓存;
  • 远程数据缓存;
  • 插件临时数据。

因此没有为了缩小:

Plaintext
wp_options

就直接手动大量删除数据。


十、发现 Gutenberg 实时协作一直处于开启状态

数据库检查过程中,还发现了一个比较意外的情况。

wp_postmeta 中存在大量:

Plaintext
_crdt_document

共有约:

Plaintext
1870 条

占用空间约:

Plaintext
148.69 MiB

另外还存在:

Plaintext
wp_sync_storage

相关数据。

后台访问日志中,也能看到大量:

Plaintext
/wp-json/wp-sync/v1/updates

进一步检查 WordPress:

设置 → 撰写

发现 Gutenberg 的:

Plaintext
Collaboration

一直处于开启状态。

这项功能属于 Gutenberg 实时协作编辑相关功能。

但是当前这个 WordPress 实际只有一个用户,并不存在多人同时编辑同一篇文章的需求。

因此它会额外产生:

  • 实时协作 REST API 请求;
  • PHP-FPM 请求;
  • wp_sync_storage 数据;
  • _crdt_document 数据;

却没有给当前使用场景带来实际收益。

最终直接关闭。

关闭以后,通过 WordPress 函数确认:

Plaintext
实时协作:已关闭

已有的大约:

Plaintext
149 MiB

历史协作数据暂时没有删除。

等历史文章处理全部结束以后,再统一考虑清理。


十一、文章修订版本已经占用约 262 MiB

继续拆分 wp_posts 后发现:

Plaintext
revision    5514 条    约 262.45 MiB
post        2791 条    约 160.04 MiB

也就是说,文章修订版本占用的正文空间,已经超过正式发布文章。

不过当前已经配置:

Plaintext
WP_POST_REVISIONS = 3

所以并不存在无限保存修订版本的问题。

而且目前仍然在大量修改历史文章。

这个阶段保留一定数量的修订版本,也能够增加一层误修改后的恢复保障。

因此没有立即清理。

等历史文章处理全部完成以后,再考虑统一删除旧修订数据。


十二、WordPress 定时任务配置正常

当前 WordPress 配置:

Plaintext
DISABLE_WP_CRON = true

服务器同时配置了 Linux Cron:

Plaintext
*/5 * * * * cd /data/wwwroot/www.shuijingwanwq.com && /usr/local/php/bin/php wp-cron.php >/dev/null 2>&1

也就是说:

每 5 分钟由 Linux 主动执行一次 WordPress 定时任务。

这样不需要再依靠访客访问随机触发:

Plaintext
wp-cron.php

进一步检查 WordPress 当前定时任务:

Plaintext
定时任务总数:23
不同 Hook:23

没有发现每分钟或者每 5 分钟执行的大量插件任务。

当前最短正常周期也只是:

Plaintext
每小时一次

其他大多为:

  • 每 12 小时;
  • 每天;
  • 每周;
  • 每月。

因此以下配置继续保持:

Plaintext
DISABLE_WP_CRON = true

WP_POST_REVISIONS = 3
AUTOSAVE_INTERVAL = 60
EMPTY_TRASH_DAYS = 30

WP_MEMORY_LIMIT = 256M
WP_MAX_MEMORY_LIMIT = 512M

十三、SlyTranslate 调试日志已经增长到 864 MiB

目前为了历史文章翻译和异常排查,仍然保留:

Plaintext
WP_DEBUG = true
WP_DEBUG_DISPLAY = false

调试日志写入:

Plaintext
wp-content/slytranslate-debug.log

检查以后发现,这个文件已经增长到:

Plaintext
864 MiB

进一步统计最近 2 万行日志后,绝大多数内容都是重复的 PHP Notice、Deprecated 和命令行提示。

其中包括:

  • Nimble Page Builder;
  • PublishPress Series;
  • SyntaxHighlighter;
  • Yoast SEO;
  • Polylang;
  • WP-CLI。

不过这部分日志包含大量历史记录。

前一天已经针对 PHP 8.5 升级后的插件兼容性问题做过一次集中排查:

当时已经分别处理:

  • Nimble Page Builder:停用;
  • SyntaxHighlighter:完成最小本地修复并验证;
  • Yoast SEO:常见生产页面中无法稳定复现,因此没有修改;
  • PublishPress Series:确认兼容问题,并向上游提交反馈。

因此这个 864 MiB 日志文件中,相当一部分只是此前调试、WP-CLI 操作和插件兼容性排查过程中累计下来的历史记录。

现在真正需要解决的是:

调试日志没有大小控制,可以长期不断增长。


十四、给 SlyTranslate 调试日志增加日志轮转

历史文章处理还没有完成,因此现在仍然需要保留:

Plaintext
WP_DEBUG = true

最终没有直接关闭调试模式,而是给:

Plaintext
slytranslate-debug.log

增加日志轮转。

当前策略:

Plaintext
文件超过约 100 MiB 后轮转
保留 5 份
旧日志自动压缩

另外通过 Linux Cron:

Plaintext
每小时检查一次

最终生成的日志轮转配置已经成功通过检查。

首次执行日志轮转以前:

Plaintext
slytranslate-debug.log
864 MiB

轮转以后:

Plaintext
slytranslate-debug.log
0

slytranslate-debug.log.1.gz
约 6.5 MiB

864 MiB 的纯文本日志压缩以后只有约 6.5 MiB。

这样既能够继续保留调试能力,也不用担心日志无限增长到几 GiB。

等历史文章全部处理完成以后,再考虑关闭:

Plaintext
WP_DEBUG

十五、PublishPress Series 的 PHP 8.5 警告仍然会出现

PHP-FPM 平滑重载以后,新日志中仍然可以看到 PublishPress Series 的 PHP 8.5 弃用警告:

Plaintext
SplObjectStorage::attach() is deprecated
SplObjectStorage::contains() is deprecated

这个问题此前已经确认,并已向插件上游提交反馈。

相关 PHP 8.5 插件兼容性排查记录:

目前继续等待上游版本修复即可。


十六、最终修改改用脚本上传执行

这次真正修改 PHP-FPM 和 OPcache 时,还碰到了一个操作上的问题。

最开始准备把:

  • 备份;
  • 修改;
  • 配置检查;
  • 平滑重载;
  • 日志轮转;
  • 最终验证;

全部写成一大段 Shell 命令,直接粘贴到 SSH 终端执行。

实际操作中却发现,超长脚本直接粘贴到交互式终端并不可靠。

一次执行过程中还因为 Shell 的错误退出行为直接结束了 SSH 会话。

好在当时还处于配置预检查阶段,PHP-FPM 和 OPcache 并没有真正被修改。

后来改成:

  1. 先生成 .sh 脚本文件;
  2. 下载到本地;
  3. 使用 scp 上传服务器;
  4. 再从服务器执行。

例如:

Bash
scp ~/下载/swq-final-tune-20260807-v2.sh aliyun:/root/

上传以后执行:

Bash
chmod 700 /root/swq-final-tune-20260807-v2.sh
bash /root/swq-final-tune-20260807-v2.sh

脚本会自动完成:

  • 检查 PHP-FPM 配置;
  • 检查 OPcache 配置;
  • 创建修改前备份;
  • 修改 PHP-FPM;
  • 修改 OPcache;
  • 配置日志轮转;
  • 检查 PHP-FPM 配置;
  • 检查日志轮转配置;
  • 平滑重载 PHP-FPM;
  • 验证 OPcache 实际生效参数;
  • 检查服务器内存;
  • 测试中英文动态首页。

最终备份目录:

Plaintext
/root/swq-final-tune-backup-20260807-195609

完整执行日志:

Plaintext
/root/swq-final-tune-20260807-195609.log

对于这种几十行甚至上百行的服务器修改命令,先生成脚本再上传执行,明显比直接粘贴到交互式 SSH 终端更加可靠。


十七、修改后的主要配置

PHP-FPM

INI
pm = dynamic

pm.max_children = 14
pm.start_servers = 3
pm.min_spare_servers = 3
pm.max_spare_servers = 6

pm.max_requests = 500

最终修改值已经写入配置。

OPcache

INI
opcache.memory_consumption=192
opcache.interned_strings_buffer=32

opcache.max_accelerated_files=100000

opcache.jit=0
opcache.jit_buffer_size=0

opcache.validate_timestamps=1
opcache.revalidate_freq=60

其中本次修改的四个参数已经成功生效。

Redis

继续保持:

Plaintext
maxmemory = 1G
maxmemory-policy = allkeys-lru

WordPress

继续保持:

Plaintext
DISABLE_WP_CRON = true

WP_POST_REVISIONS = 3
AUTOSAVE_INTERVAL = 60
EMPTY_TRASH_DAYS = 30

WP_MEMORY_LIMIT = 256M
WP_MAX_MEMORY_LIMIT = 512M

另外:

Plaintext
Gutenberg 实时协作

已经关闭。


十八、修改后的动态页面测试

最终脚本还测试了绕过 CDN 和 W3 Total Cache 页面缓存后的动态首页。

中文站三次测试:

Plaintext
0.909243 秒
1.175537 秒
0.907528 秒

英文站:

Plaintext
1.008783 秒
1.426391 秒
1.155351 秒

全部返回:

Plaintext
HTTP 200

这部分测试是在 PHP-FPM 平滑重载以后立即进行的。

从结果来看,当前 PHP-FPM 和 OPcache 参数调整后,动态请求运行正常,没有出现异常响应或者明显性能倒退。


十九、这次明确没有修改的配置

完成完整检查以后,大量参数最终都没有改变。

Nginx

继续保持当前:

  • worker_processes
  • worker_connections
  • worker_rlimit_nofile
  • keepalive_timeout
  • FastCGI 主要参数。

前台限流继续由 EdgeOne 和 Cloudflare负责。

Redis

继续保持:

Plaintext
1 GiB
allkeys-lru

RDS / MySQL

继续保持:

  • innodb_buffer_pool_size
  • max_connections
  • thread_cache_size
  • table_open_cache
  • table_definition_cache
  • innodb_flush_log_at_trx_commit
  • innodb_flush_method
  • tmp_table_size

其中:

Plaintext
tmp_table_size = 2M

虽然看起来偏小,但目前没有足够证据证明扩大以后能够解决实际性能问题。

WordPress

继续保持:

Plaintext
WP_POST_REVISIONS = 3
AUTOSAVE_INTERVAL = 60
EMPTY_TRASH_DAYS = 30
WP_MEMORY_LIMIT = 256M
WP_MAX_MEMORY_LIMIT = 512M

W3 Total Cache

目前不修改:

  • 页面缓存寿命;
  • 页面缓存预热;
  • 页面缓存清除规则;
  • 垃圾回收参数。

等历史文章处理完成、网站恢复正常运行一段时间以后再重新观察。


二十、还有一些数据准备以后再清理

目前仍然有几类数据暂时保留。

Gutenberg 历史实时协作数据

约:

Plaintext
149 MiB

实时协作已经关闭,但已有 _crdt_document 等数据暂时不删除。

WordPress 历史修订版本

约:

Plaintext
262 MiB

历史文章仍然处于批量处理阶段,因此暂时保留。

W3TC 历史磁盘缓存

包括:

Plaintext
cache/object/
cache/db/

以后和 W3 Total Cache 一起处理。

WP_DEBUG

目前仍需要:

Plaintext
slytranslate-debug.log

帮助排查历史文章翻译异常。

等这部分工作全部结束以后,再考虑:

Plaintext
WP_DEBUG = false

二十一、总结:服务器调优并不是把所有参数都改一遍

经过这次完整检查以后,真正修改的项目主要只有:

  1. PHP-FPM 最大工作进程从 10 增加到 14;
  2. PHP-FPM 启动工作进程从 2 增加到 3;
  3. 最小空闲工作进程从 2 增加到 3;
  4. 最大空闲工作进程从 4 增加到 6;
  5. OPcache 内存从 128 MiB 增加到 192 MiB;
  6. Interned Strings 从 16 MiB 增加到 32 MiB;
  7. 关闭当前没有使用价值的 JIT Buffer;
  8. 关闭 Gutenberg 实时协作;
  9. 给 SlyTranslate 调试日志增加日志轮转。

另一方面,很多一开始看起来“似乎也可以优化”的参数,最后都没有修改。

包括:

  • Nginx 工作进程和连接参数;
  • Redis 1 GiB 内存上限;
  • RDS 768 MiB InnoDB Buffer Pool;
  • MySQL 最大连接数;
  • MySQL 线程缓存;
  • MySQL 表缓存;
  • tmp_table_size=2M
  • WordPress 修订版本数量;
  • WordPress 自动保存周期;
  • W3 Total Cache 页面缓存寿命。

这次检查以后,我越来越觉得:

服务器调优最重要的并不是找到多少可以修改的参数,而是能够判断哪些参数根本没有必要动。

如果一个配置:

  • 当前运行指标正常;
  • 没有对应的错误日志;
  • 没有资源耗尽;
  • 没有明确的慢查询;
  • 没有实际性能瓶颈;

那么保持原状,本身就是合理的结论。

相比不断套用网上各种所谓的“最佳参数”,根据自己服务器的:

  • 实际访问量;
  • 内存使用;
  • PHP-FPM 日志;
  • Redis 命中率;
  • MySQL 状态;
  • WordPress 工作负载;

来决定是否修改,显然更加可靠。

目前这套 PHP-FPM、OPcache、Redis、RDS 和 WordPress 配置,先作为新的运行基线。

以后只有出现类似情况时,再重新评估:

  • PHP-FPM 再次频繁达到 14 个工作进程上限;
  • 内存或者 Swap 长期明显增加;
  • Redis 开始出现缓存驱逐;
  • RDS 慢查询明显增加;
  • WordPress 数据规模继续大幅增长;
  • ECS 升级或者更换服务器规格;
  • 历史文章迁移完成以后重新审计 W3 Total Cache。

在这些条件没有发生明显变化以前,没有必要再为了调整几个参数而反复折腾服务器。

WordPress 升级 PHP 8.5 后的插件兼容性排查:该修的修,该停的停,该等上游的等

WordPress 网站维护、性能优化与博客运营咨询

本站已持续运营超过 10 年,累计发布 1000+ 篇原创技术文章,长期实践 WordPress 网站建设、CDN / Cloudflare 配置、缓存优化、Google SEO、广告变现和多语言网站运营。

如果你的 WordPress 网站遇到访问慢、缓存异常、插件冲突、广告不显示、SEO 基础结构混乱、CDN 配置不确定等问题,可以联系我做一次远程技术排查。

适合以下用户:
✅ 个人博客站长
✅ WordPress 网站运营者
✅ 独立开发者与内容创作者
✅ SaaS 产品官网运营团队
✅ 希望优化网站速度与稳定性的站点

服务内容:
✅ WordPress 速度优化
✅ Cloudflare / CDN / 缓存配置排查
✅ 插件冲突与页面异常排查
✅ AdSense 广告显示问题排查
✅ SEO 基础结构检查
✅ 博客运营与商业化咨询

如需了解方案或交流相关问题,请直接联系我,并注明:WordPress 维护咨询

联系方式:
Telegram:@shuijingwan
微信:13980074657
邮箱:shuijingwanwq@gmail.com

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理