轉(zhuǎn)自:http://www.oejia.net/blog/2016/12/16/odoo_static.html
現(xiàn)狀
對于odoo9、odoo10 部署過的人可能都知道其依賴于less環(huán)境诱建,這是因為從 odoo9 開始 odoo 采用 less 模式來管理樣式文件匹涮,這帶來的改變的是前端的靜態(tài)請求不再是對應(yīng)一個實際的文件供嚎,odoo 會根據(jù).less 文件的是否改變來動態(tài)編譯出 css 文件孤页。另外 odoo 在非開發(fā)模式下的靜態(tài)資源都做了打包合并處理,這同樣導(dǎo)致客戶端對幾個重點js css壓縮文件的請求沒有對應(yīng)到文件系統(tǒng)的實際文件蒜胖。對于以上的客戶端請求 odoo 默認(rèn)是要去查詢 db 得到實際物理路徑(名稱做了 hash 處理今缚,無法通過 url 直接找到) 這樣導(dǎo)致 odoo 的靜態(tài)請求依賴于db算柳,消耗了數(shù)據(jù)庫的性能,而且不方便做靜態(tài)分離姓言,降低了整個站點承受并發(fā)的能力
本文將要描述的方案便是用來解決以上問題瞬项,使我們的 db 查詢大量減少蔗蹋,并利用外部靜態(tài)化極大提升處理客戶端并發(fā)的能力,經(jīng)測試性能在 odoo10 的基礎(chǔ)上再提升60%以上
基本思路:
將odoo動態(tài)產(chǎn)生的壓縮js囱淋、壓縮 css 以及實時編譯出的 css 集中保存到 data_dir 指定目錄下猪杭。然后借助 wsgi 的靜態(tài)服務(wù)或者 Nginx 的靜態(tài)location 直接處理客戶端的靜態(tài)請求,避免數(shù)據(jù)庫查詢
具體做法如下:
odoo/addons/base/ir/ir_qweb/assetsbundle.py中妥衣,增加如下處理
def write_file(self, url, content):
? ? m_root = tools.config.filestore('')
? ? full_path = os.path.join(m_root, url[1:])
? ? dirname = os.path.dirname(full_path)
? ? if not os.path.isdir(dirname):
? ? ? ? os.makedirs(dirname)
? ? with open(full_path, 'wb') as fp:
? ? ? ? print '>>> [ file ] save:',full_path
? ? ? ? fp.write(content)
在打包合并資源的代碼處添加如下代碼
def save_attachment(self, type, content, inc=None):
? ? # ...
? ? self.write_file(url,content)
? ? return attachment
在編譯出css后的地方添加如下處理
def preprocess_css(self, debug=False):
? ? # ...
? ? try:
? ? ? ? # ...
? ? ? ? self.write_file(url,asset.content)
? ? except psycopg2.Error:
? ? ? ? pass
以上處理即可將一些動態(tài)生產(chǎn)的js皂吮、css集中到 odoo 工作目錄 的 data_dir/filestore/static 目錄下
在load_addons中加載每個app模塊時將模塊的 static 的目錄軟鏈到我們上面的“靜態(tài)集中目錄”下
def load_addons(self):
? ? # ...
? ? statics['/%s/static' % module] = path_static
? ? m_dir = os.path.join(odoo.tools.config['data_dir'],'filestore','common',module)
? ? if not os.path.isdir(m_dir):
? ? ? ? os.makedirs(m_dir)
? ? ? ? os.symlink(path_static,os.path.join(m_dir,'static'))
加載完后將“靜態(tài)集中目錄”路徑加入到 wsgi 靜態(tài)服務(wù)列表
statics['/static'] = os.path.join(odoo.tools.config['data_dir'],'filestore','static')
經(jīng)過以上處理后基本上css、js的請求都不會走db查詢了
為了使用更好的外部靜態(tài)服務(wù)税手、減少odoo服務(wù)進程的請求開銷我們可以也強烈建議使用 Nginx 高性能的靜態(tài)承載能力
Nginx的配置實例如下:
? ? location /static {
? ? ? ? expires 15d;
? ? ? ? root /home/jone/workspace/odoo10/data/filestore;
? ? }
? ? location ~ ^/[^/]+/static/{
? ? ? ? expires 15d;
? ? ? ? root /home/jone/workspace/odoo10/data/filestore/common;
? ? }
以上方案我們主要優(yōu)化了 odoo 的 css蜂筹、js 等類型靜態(tài)資源的請求,事實上 odoo 的其他(如圖片芦倒、附件)等靜態(tài)資源也是采用db檢索模式去查表以響應(yīng)客戶端請求的艺挪,對于這部分的優(yōu)化,讀者不妨先自行測試下他們在用戶量大的情況下對odoo服務(wù)性能的影響兵扬,筆者將在后續(xù)共享出對應(yīng)的優(yōu)化方案
Odoo 的性能優(yōu)化是隨著業(yè)務(wù)進展麻裳、數(shù)據(jù)及用戶量提升后不得不做的事情,筆者也是致力于此器钟,不斷研究提供一些有價值的參考方案