在使用知名建站CMS系統(tǒng)wordpress建設(shè)的網(wǎng)站,在網(wǎng)站運(yùn)營過程中站長們經(jīng)常出現(xiàn)一個(gè)主要問題:wordpress內(nèi)存占用大和網(wǎng)站負(fù)載堵塞,出現(xiàn)這種情況,會導(dǎo)致 網(wǎng)站運(yùn)行速度 緩慢,將會嚴(yán)重影響到網(wǎng)站優(yōu)化、網(wǎng)站運(yùn)營等各種問題。
下面知云網(wǎng)就wordpress內(nèi)存占用大和網(wǎng)站負(fù)載堵塞提出以下幾個(gè)解決辦法。
經(jīng)研究和測試表明,wordpress系統(tǒng)排除google字體等代碼問題,后仍然出現(xiàn)負(fù)載堵塞達(dá)到100%,或者內(nèi)存占用達(dá)到90%以上。
這時(shí)可以從以下五個(gè)方面解決:
一、 改善wordpress網(wǎng)站所在服務(wù)器的php-fpm性能調(diào)整。
安裝好 WordPress后,在瀏覽器中操作一段時(shí)間后,便無法再使用 WordPress,并出現(xiàn)了錯(cuò)誤提示信息。在服務(wù)器后臺開啟 WordPress 的調(diào)試模式后,刷新瀏覽器,得到了更詳細(xì)的錯(cuò)誤信息,分析后得知是無法連接數(shù)據(jù)庫的問題。在服務(wù)器中一看,MYSQL 數(shù)據(jù)庫不知什么時(shí)候掛掉了。查看系統(tǒng)內(nèi)存使用情況,發(fā)現(xiàn)總共 2G 的內(nèi)存,現(xiàn)在使用了1600M+。在一看系統(tǒng)并沒有交換分區(qū)。原因一下就很清楚了,是系統(tǒng)內(nèi)存不足導(dǎo)致 MYSQL 崩潰。為系統(tǒng)添加了 1G 的交換文件作為虛擬內(nèi)存后,數(shù)據(jù)庫是不崩潰了,但 WordPress 使用一段時(shí)間后反應(yīng)就相當(dāng)慢,并且服務(wù)器的 SSH 連接也幾乎不能使用。綜合前面的情況可知,現(xiàn)在的問題是 WordPress 使用過程中占滿了系統(tǒng)內(nèi)存,系統(tǒng)開始使用交換文件,而交換文件性能不足導(dǎo)致。
在控制臺重啟服務(wù)器后,繼續(xù)在瀏覽器中使用 WordPress,并且在后臺實(shí)時(shí)監(jiān)控系統(tǒng)內(nèi)存的使用情況。發(fā)現(xiàn)進(jìn)行更換主題,安裝插件等一些操作時(shí),系統(tǒng)內(nèi)存使用量會大量增長,并且很快會超出物理內(nèi)存大小,造成訪問緩慢的問題。多方查找資料后,發(fā)現(xiàn)是 php-fpm 的問題。
php-fpm 的 FastCGI 進(jìn)程一旦加載就不會釋放,當(dāng)其工作完成后,并不會釋放給系統(tǒng)內(nèi)存,而是休眠于 FastCGI 系統(tǒng)池中,等待下一次被喚醒。就造成了內(nèi)存不斷上升的問題。我一直用的是 php-fpm 默認(rèn)配置,這個(gè)配置對于我來說可能有點(diǎn)不合適,需要修改配置文件。
php-fpm 的相關(guān)參數(shù)
pm:表示使用那種方式,有兩個(gè)值可以選擇,就是static(靜態(tài))或者dynamic(動(dòng)態(tài)),默認(rèn)為dynamic。
pm.max_children:靜態(tài)方式下開啟的php-fpm進(jìn)程數(shù)量。
pm.start_servers:動(dòng)態(tài)方式下的起始php-fpm進(jìn)程數(shù)量。
pm.min_spare_servers:動(dòng)態(tài)方式下的最小php-fpm進(jìn)程數(shù)量。
pm.max_spare_servers:動(dòng)態(tài)方式下的最大php-fpm進(jìn)程數(shù)量。
區(qū)別:
如果pm設(shè)置為 static,那么其實(shí)只有 pm.max_children 這個(gè)參數(shù)生效。系統(tǒng)會開啟設(shè)置數(shù)量的 php-fpm 進(jìn)程。
如果pm設(shè)置為 dynamic,那么 pm.max_children 參數(shù)失效,后面 3 個(gè)參數(shù)生效。系統(tǒng)會在 php-fpm 運(yùn)行開始的時(shí)候啟動(dòng) pm.start_servers 個(gè) php-fpm 進(jìn)程,然后根據(jù)系統(tǒng)的需求動(dòng)態(tài)在 pm.min_spare_servers 和 pm.max_spare_servers 之間調(diào)整 php-fpm 進(jìn)程數(shù)。
php-fpm 參數(shù)調(diào)整
對于內(nèi)存大的服務(wù)器(8G)以上,指定靜態(tài)的max_children實(shí)際上更為妥當(dāng),因?yàn)檫@樣不需要進(jìn)行額外的進(jìn)程數(shù)目控制,會提高效率。對于小內(nèi)存的服務(wù)器,動(dòng)態(tài)方式會結(jié)束掉多余的進(jìn)程,可以回收釋放一些內(nèi)存。
這時(shí)選擇動(dòng)態(tài)模式,調(diào)整后的配置如下:
運(yùn)行模式:pm = dynamic
允許創(chuàng)建的最大子進(jìn)程數(shù):pm.max_children = 20
起始進(jìn)程數(shù)(服務(wù)啟動(dòng)后初始進(jìn)程數(shù)量):pm.start_servers = 5
最小空閑進(jìn)程數(shù)(清理空閑進(jìn)程后的保留數(shù)量):pm.min_spare_servers = 2
最大空閑進(jìn)程數(shù)(當(dāng)空閑進(jìn)程達(dá)到此值時(shí)清理):pm.max_spare_servers = 10
每個(gè)子進(jìn)程在處理了多少個(gè)請求數(shù)量后重啟pm.max_requests = 300
比如寶塔服務(wù)器控制面板,有PHP性能調(diào)整界面,可以直接調(diào)整。
然后重啟 php-fpm,系統(tǒng)內(nèi)存使用在二百多兆。操作 WordPress 一段時(shí)間后,系統(tǒng)內(nèi)存使用量不斷增長,最終穩(wěn)定在1100M+。負(fù)載堵塞沒有出現(xiàn),問題得以解決。
二、修改WP的內(nèi)存配置大小。
如果你的空間支持.ini,可以通過修改php.ini實(shí)現(xiàn),以下三種方法任選其一,把memory_limit修改為128M或更高。
1. 首先在public_html 目錄創(chuàng)建文件 php.ini,添加以下代碼:
memory_limit = 128M
然后在根目錄下修改.htaccess文件,添加下面代碼:
suPHP_ConfigPath /home/username/public_html/
2. 同樣是修改php.ini先在網(wǎng)站根目錄下,建立一個(gè)php.ini文件,寫入下面這句:memory_limit = 128M
接著再到網(wǎng)站根目錄下修改.htaccess這個(gè)文件,寫入下面這句:
SetEnv PHPRC /home/host1/public_html/usr1/
(unix path to the directory where php.ini is)
(keep the slashes)
注:以上代碼中的”128M”可根據(jù)需要適當(dāng)調(diào)整。
3. 通過服務(wù)器后控制面板臺直接修改
三、 WordPress中的插件和主題過多。
WordPress程序自身占用的內(nèi)存,加上插件,主題會導(dǎo)致更多的內(nèi)存占用。
1. 刪除沒有啟用的插件,并減少不必要插件的使用。
2. 如果服務(wù)器內(nèi)存本身就很小,就不要使用占用大量資源的插件,比如All in OneSEO,Broken Link Checker,Yet Another Related Posts Plugin,NextGen Gallery這些大容量插件。
3. 另外,沒有使用的主題也應(yīng)該刪除。這樣做不僅能夠減少內(nèi)存占用過高的問題,也是增加網(wǎng)站安全性的一種基本措施。
四、限制wordpress定時(shí)功能
wordpress的定時(shí)發(fā)布功能真的很好,但是也非常耗費(fèi)資源的,如果不需要,建議還是限制一下,我們需要在wp-config.php文件中限制。
define(‘DISABLE_WP_CRON’, true);
五、限制自動(dòng)保存和副本數(shù)據(jù)
wordpress的自動(dòng)保存是一個(gè)很好的功能,但是也很占用資源,目前部分wordpress模板已經(jīng)限制了自動(dòng)保存的次數(shù)等等,默認(rèn)時(shí)候的WP會自動(dòng)給我們保存草稿以及副本添加入數(shù)據(jù)庫中,不信的話你到POST數(shù)據(jù)表看看是不是有很多記錄,而我們的文章并沒有這么多。這就是自動(dòng)添加的,我們需要限制自動(dòng)版本和限制自動(dòng)保存草稿。
define (‘WP_POST_REVISIONS’, 0); define(‘AUTOSAVE_INTERVAL’, 600);
這樣可以限制一下自動(dòng)保存的時(shí)間。
或者直接關(guān)閉自動(dòng)保存:
remove_action(‘pre_post_update’, ‘wp_save_post_revision’);
add_action(‘wp_print_scripts’, ‘disable_autosave’);
function disable_autosave() {
wp_deregister_script(‘autosave’);
}
參考資料:
CSDN博主「Peigenzi」的原創(chuàng)文章:https://blog.csdn.net/Peigenzi/article/details/73506298