WordPress網站出現Error establishing a database connection(建立數據庫連接時出錯),查看發現Apache狀態正常,而MySQL/MariaDB服務已經停止運行,重啟服務器或者用service mysqld restart命令(MySQL數據庫)或者systemctl restart mariadb.service命令(MariaDB數據庫)可以暫時解決問題,過一段時間還會出現。
查看/etc/my.cnf,找到MySQL/MariaDB錯誤日誌的位置(比如log-error=/var/log/mariadb/mariadb.log),查看日誌,發現了很多處[ERROR] mysqld: Out of memory。
分析原因應該是Apache2在網站訪問高峰時佔用內存過高,MySQL/MariaDB因運行內存不足,會自動退出所致。
解決方法:
1、將Apache2換成Nginx或其他輕量級Web服務器。
2、不想更換Apache2的可以增大服務器物理內存或添加Swap交換文件。
3、不想更換Apache2也不想增加服務器物理內存,且網站訪問量不大,可以嘗試修改Apache2配置文件(文件路徑/etc/httpd/conf/httpd.conf)。Apache2目前有三種穩定的MPM(Multi-Processing Module,多進程處理模塊)模式,分別是prefork,worker和event。(查看Apache2的MPM模式,可以使用httpd -V命令。)
編輯/etc/httpd/conf/httpd.conf文件,添加下面內容:
<IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 ServerLimit 100 MaxRequestWorkers 100 MaxConnectionsPerChild 2000 </IfModule>
說明:
<IfModule mpm_prefork_module> StartServers 5 #推薦設置:小=默認 中=20~50 大=50~100 MinSpareServers 5 #推薦設置:與StartServers保持一致 MaxSpareServers 10 #推薦設置:小=20 中=30~80 大=80~120 ServerLimit 150 #推薦設置:小=500 中=500~1500 大型=1500~3000 MaxRequestWorkers 150 #推薦設置:小=500 中=500~1500 大型=1500~3000 MaxRequestsPerChild 0 #推薦設置:小=10000 中或大=10000~500000 </IfModule>
備註:在Apache2.3.13以前的版本MaxRequestWorkers被稱為MaxClients。此外,設置ServerLimit參數最好與MaxRequestWorkers的值保持一致。
其實nginx也會出現這種情況,結果發現是數據庫掛了