Wordpress建站

WordPress排查解决您的站点遇到了致命错误的过程-Redis内存缓存不足

今天收到好友在微信上给我的留言,提醒说博客无法打开了。果真,打开后直接就显示了“您的站点遇到了致命错误。 ”仔细回想一下,最近博客除了遭受到了攻击外,就是安装了W3 Total Cache插件了,根据推测基本上可以断定是插件惹的祸了。

经过排查发现,PHP报错为:“Uncaught RedisException: OOM command not allowed when used memory ”,提示Redis无法往内存中写入数据,即使重启服务器也是如此。最终的解决办法就是调整Redis的配置,将默认的内存大小增大。

这篇文章就来分享一下如何排查Wordpress您的站点遇到了致命错误的过程,更多的关于WordPress建站的文章这里还有:

  1. WordPress全能型和超强兼容性代码高亮插件Enlighter-WP必备插件
  2. WordPress主题和插件汉化必备工具Poedit – 自动生成.Po和.Mo文件
  3. 将Elasticsearch作为WordPress站内搜索-docker安装elasticSearch,kibana和ik分词器

PS:更新记录.

1、Wordpress优化加速是一个系统工程,需要全方位地对WP的速度进行优化才可以达到秒开的效果:WordPress优化专题汇总-实用的WordPress性能和速度优化教程总结。2021.3.28

一、开启WP Debug模式

当你的Wordpress遇到错误时,不要惊慌,选择打开Wordpress的Debug模式,调用PHP错误,方法参考:WordPress错误诊断模式-专治WP页面空白,服务器500错误,插件冲突

二、找到WP致命的错误

打开了Wordpress的Debug模式后,此时网页就会显示PHP错误了,如下:

Fatal error: Uncaught RedisException: OOM command not allowed when used memory > ‘maxmemory’. in /xxx/wzfou.com/wp-content/plugins/w3-total-cache/Cache_Redis.php:68 Stack trace: #0 /xxxxx/wzfou.com/wp-content/plugins/w3-total-cache/Cache_Redis.php(68): Redis->setex(‘w3tc_1987146988…’, 180, ‘a:2:{s:7:”conte…’) #1 /xxxx/wzfou.com/wp-content/plugins/w3-total-cache/ObjectCache_WpObjectCache_Regular.php(293): W3TC\Cache_Redis->set(‘0optionsallopti…’, Array, 180) #2 /xxx/wzfou.com/wp-content/plugins/w3-total-cache/ObjectCache_WpObjectCache_Regular.php(388): W3TC\ObjectCache_WpObjectCache_Regular->set(‘alloptions’, Array, ‘options’, 0) #3 /xxx/wzfou.com/wp-content/plugins/w3-total-cache/ObjectCache_WpObjectCache.php(77): W3TC\ObjectCache_WpObjectCache_Regular->add(‘alloptions’, Array, ‘options’, 0) #4 /xxxx/wzfou.com/wp-content/object-cache.php(95): W3TC\ObjectCache_WpObjectCache->add(‘alloptions’, Array, ‘options’, 0) #5 /xxxx/wzfou.com/wp-includes/option.php(258): in /xxxx/wzfou.com/wp-content/plugins/w3-total-cache/Cache_Redis.php on line 68

错误提示:“Uncaught RedisException: OOM command not allowed when used memory > ‘maxmemory’. in /xxx/wzfou.com/wp-content/plugins/w3-total-cache/Cache_Redis.php”,显然是因为开启了Redis对象缓存而导致了错误。查看了Redis配置:

root@localhost:~# redis-cli
127.0.0.1:6379> info memory
# Memory
used_memory:250161160
used_memory_human:238.57M
used_memory_rss:274608128
used_memory_rss_human:261.89M
used_memory_peak:254227888
used_memory_peak_human:242.45M
used_memory_peak_perc:98.40%
used_memory_overhead:7712830
used_memory_startup:803088
used_memory_dataset:242448330
used_memory_dataset_perc:97.23%
allocator_allocated:250366144
allocator_active:260894720
allocator_resident:268197888
total_system_memory:2111430656
total_system_memory_human:1.97G
used_memory_lua:37888
used_memory_lua_human:37.00K
used_memory_scripts:0
used_memory_scripts_human:0B
number_of_cached_scripts:0
maxmemory:251000000
maxmemory_human:239.37M
maxmemory_policy:noeviction
allocator_frag_ratio:1.04
allocator_frag_bytes:10528576
allocator_rss_ratio:1.03
allocator_rss_bytes:7303168
rss_overhead_ratio:1.02
rss_overhead_bytes:6410240
mem_fragmentation_ratio:1.10
mem_fragmentation_bytes:24487992
mem_not_counted_for_evict:0
mem_replication_backlog:0
mem_clients_slaves:0
mem_clients_normal:390678
mem_aof_buffer:0
mem_allocator:jemalloc-5.1.0
active_defrag_running:0
lazyfree_pending_objects:0
127.0.0.1:6379>

从配置中可以看出:已经占用的内存used_memory_human:238.57M,系统允许Redis最大使用的内存为:maxmemory_human:239.37M,确实是占用完毕,空间已经没有了。

三、解决Redis内存不足

如果你用的是Oneinstack,可以参考以下方法来修改Redis的配置,顺便你也可以修改一下Memcached配置,将默认的内存加大:

#Redis默认端口:6379
#Memcached默认端口:11211
#默认监听地址:127.0.0.1

#调整Redis最大内存大小?

vi /usr/local/redis/etc/redis.conf

maxmemory 1024000000#单位字节,默认1G,可调整

service redis-server restart#重启生效

#增加Memcached最大内存大小?

vi/etc/init.d/memcached

CACHESIZE=256 #单位M,默认256M,可调整

service memcached restart#重启生效

设置淘汰策略:maxmemory-policy volatile-lru

其它几种淘汰策略说明如下:

noeviction

默认策略

不驱逐

当没有足够的内存给Redis使用时,执行写命令时会报一个异常:redis.exceptions.ResponseError,OOM command not allowed when used memory > ‘maxmemory’

volatile-lru

对存在expire的key,执行lru淘汰策略(驱逐最近最少使用的数据)

如果没有存在expire的key,则在内存不够时执行写命令时也会报一个异常:redis.exceptions.ResponseError,OOM command not allowed when used memory > ‘maxmemory’,同noeviction policy

allkeys-lru

针对所有key执行lru

没办法限制些算法针对某些key去删除

如果你的应用需要持久化一些数据,请不要使用allkeys-lru策略

volatile-random

对存在expire的key,随机选择驱逐某个key

allkeys-random

针对所有key,随机选择驱逐某个key

volatile-ttl

对存在expire的key中,优先驱逐ttl值最小的

四、总结

WordPress优化加速是一个老生常谈的话题,为了达到最好的效果,我们经常要根据自己的服务器实际配置来合理调整优化策略。

关于挖站否博客的优化加速,我已经写了一个汇总专题:博客主要应用技术及支持特性-挖站否网站与服务器优化方法总结

文章出自:挖站否 https://wzfou.com/wordpress-cuowu/,版权所有。本站文章除注明出处外,皆为作者原创文章,可自由引用,但请注明来源。

文章更新于: 2021年8月23日 下午2:11

Qi

关于站长(Qi),2008年开始混迹于免费资源圈中,有幸结识了不少的草根站长。之后自己摸爬滚打潜心学习Web服务器、VPS、域名等,兴趣广泛,杂而不精,但愿将自己经验与心得分享出来与大家共勉。

查看评论