不知道因為什么原因,當系統的訪問量達到了8000IP的時候,tomcat的內存總是會莫名其妙的增加到上限,而且到最后垃圾回收也會非常費力,最后導致系統停止響應,我調試過各種參數,包括垃圾回收策略,并行回收,修改各內存配置的參數,結果都一樣,沒辦法,絕對對這一訪問量最大的部分進行全部靜態化。
一、靜態化要考慮三個方面的事情,
1 對SEO
能夠讓搜索引擎更方便的進行信息采集和分類,提升其速度和準確性
2 對用戶
不能影響版面的展示,不能為了速度影響了美觀和可用性
3 對維護
一些內容可以方便的更換,比如菜單調整,連接調整,廣告位的調整等
二、最終采用了如下的方案進行
1 使用freemarker進行靜態化
2 將菜單,廣告位等以后可能變化的地方,使用JS進行操作。 一些地方采用多個連續的JS,方便以后進行整體調整。
3 通過urlrewrite 將訪問轉到靜態化后的頁面
4 通過404的錯誤處理,對尚未靜態化的頁面進行處理
5 靜態化時,考慮到帖子量在百萬級別,為了防止一個文件夾下面有太多文件,決定根據帖子編號的末尾2位數字進行文件夾分組,比如12345 則分配到 45這個子文件夾里面,67890 則分配到90這個文件夾里面。這樣就將帖子近似均分到100個文件夾,每個文件夾的帖子在1萬個,還可以接受。如果以后帖子再多,我就再考慮分成1000個文件夾了。這個設置要為以后的擴容留有余地。
三、具體操作
1 根據現有帖子頁面制作ftl的模板,里面要考慮js的腳本位置。
2 制作批量生成的程序,為減輕服務器的壓力,以某個數據庫備份為藍本,在本地完成這部分帖子的初始化,生成htm文件,然后將靜態化好的目錄整個打包上傳到服務器。
3 啟動404的處理,比較新的帖子如果沒有被靜態化,則由這個程序進行處理
4 帖子管理程序改造,在帖子保存時自動進行靜態化
5 啟動urlRewrite 其中比較關鍵的部分是
RewriteRule ^/view-([0-9]*?)([0-9]{2}).htm /laozizhu/$2/$1$2.htm [PT]
里面將帖子編號的最后2位單獨分組出來,作為目錄名,如果以后帖子多了,可以用最后三位來分組了。只需要再次生成帖子,然后簡單的修改這個規則即可,前臺訪問不受任何影響。
四、效果:
目前網站訪問量已經達到每天7w的獨立IP,tomcat占用內存不超過300M,系統線程數一直在最低的線上。
五、總結
靜態化,還是針對大訪問量的最佳方案,不是偽靜態化,而是真正的靜態化。