今天收到好友在微信上給我的留言,提醒部落格無法打開了。果真,打開後直接就顯示了“您的站點遇到了致命錯誤。” 仔細回想一下,最近博客除了遭受到了攻擊外,就是安裝了 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分詞器

一、開啟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): W3TCCache_Redis->set('0optionsallopti…', Array, 180) # 2 /xxx/wzfou.com/wp-content/plugins/w3-total-cache/ObjectCache_WpObjectCache_Regular.php(388): W3TCObjectCache_WpObjectCache_Regular->set('alloptions', Array, 'options', 0) #3 /xxxwzfouf .com/wp-content/plugins/w3-total-cache/ObjectCache_WpObjectCache.php(77): W3TCObjectCache_WpObjectCache_Regular->add('alloptions', Array, 'options', 0) #4 /xxxx/wzfou.com/wp-wzfou.com/-wp content/object-cache.php(95): W3TCObjectCache_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.57000120000015:0005:238.570000050 human:261.89 M
used_memory_peak:254227888
used_memory_peak_human:242.45M
used_memory_peak_perc:98.40%
used_memory_memory_peak_perc:98.40%
used_memory_overhead:771830083000m00m> emory_dataset:242448330
used_memory_dataset_perc:97.23%
allocator_allocated :250366144
allocator_active:260894720
allocator_resident:268197888
total_system_memory:2111430656
total_system_memory:2111430656
total_system_mem_huwemory* >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:noeviction<3_f86>allocator_frag_ratio:noeviction<3f36>allocator_frag_ratbyio1.5026> 8>allocator_rss_ratio:1.03
allocator_rss_bytes: 7303168
rss_overhead_ratio:1.02
rss_overhead_bytes:6410240
mem_fragmentation_ratio:1.10
mem_fcationformentation_bytes:24487920m<ph0 _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優化加速是一個老生常談的話題,為了達到最好的效果,我們經常要根據自己的伺服器實際配置來合理調整優化策略。

關於挖站否部落格的最佳化加速,我已經寫了一個總結專題:部落格主要應用技術及支援特性-挖站否網站與伺服器優化方法總結。

發表評論