全書完整目錄請見:Odoo 12開發(fā)者指南(Cookbook)第三版
本章中,我們將講解如下部分
- 安裝Odoo來供生產(chǎn)使用
- 為生產(chǎn)環(huán)境調(diào)整配置文件
- 設(shè)置Odoo來作為系統(tǒng)服務(wù)
- 使用nginx和Let's Encrypt配置反向代理及SSL
- 使用Docker來運行Odoo
- 通過docker-compose運行Odoo
- 管理網(wǎng)站的內(nèi)容分發(fā)網(wǎng)絡(luò)(CDN)
引言
在第一章 安裝Odoo開發(fā)環(huán)境(從源碼輕松安裝Odoo一節(jié)),以及第二章 管理Odoo服務(wù)器實例(標(biāo)準(zhǔn)化你的實例目錄布局一節(jié))中,我們探討了開發(fā)環(huán)境的設(shè)置。生產(chǎn)環(huán)境的要求與其會稍有不同。本章講解Odoo部署的具體內(nèi)容。
安裝Odoo來供生產(chǎn)使用
在生產(chǎn)階段安裝Odoo與為開發(fā)安裝Odoo并沒有很大的區(qū)別。但有些可用的方法,這部分中將提供一個類似于開發(fā)環(huán)境的安裝。
準(zhǔn)備工作
我們預(yù)設(shè)你已有準(zhǔn)備好了一個開發(fā)實例。這部分中我們假設(shè):
-
你實例的這個項目以與第二章 管理Odoo服務(wù)器實例中標(biāo)準(zhǔn)化你的實例目錄布局所建議的方式進(jìn)行管理。我們將使用https://github.com/你的登錄名/project.git。這個倉庫應(yīng)包含該實例在開發(fā)時所使用的配置文件,該實例的具體插件以及在該項目上下文你所創(chuàng)建的幫助腳本。
??注意:
如果你項目的配置文件包含安全信息,如密碼,則不應(yīng)將該項目推送到GitHub這樣的公共服務(wù)上。而應(yīng)使用內(nèi)部Git倉庫或私有GitHub項目。 部署服務(wù)器運行著Debian Stretch(但使用做過一些修改的衍生發(fā)行版應(yīng)該也可以運行,如Ubuntu,更多信息請參見第一章 安裝Odoo開發(fā)環(huán)境)。
你通過使用ssh或sudo擁有最終服務(wù)器的root權(quán)限。如果沒有該權(quán)限,則應(yīng)找到系統(tǒng)管理員來協(xié)助你對部署服務(wù)器做相關(guān)配置。
你知道最終的完全限定域名(FQDN)并可通過它來訪問該服務(wù)器。
如何操作...
你需要執(zhí)行如下步驟來為生產(chǎn)環(huán)境安裝Odoo(譯者注:GitHub 腳本):
- 以root權(quán)限安裝并構(gòu)建如下依賴:
# apt-get update
# apt-get install git python3.5 postgresql nano virtualenv \
gcc python3.5-dev libxml2-dev libxslt1-dev \
libevent-dev libsasl2-dev libldap2-dev libpq-dev \
libpng-dev libjpeg-dev \
xfonts-75dpi xfonts-base wget xz-utils
# wget -O wkhtmltox.tar.xz \
https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.4/wkhtmltox-0.12.4_linux-generic-amd64.tar.xz
# tar xvf wkhtmltox.tar.xz
# mv wkhtmltox/lib/* /usr/local/lib/
# mv wkhtmltox/bin/* /usr/local/bin/
# mv wkhtmltox/share/man/man1 /usr/local/share/man/
- 以root用戶創(chuàng)建一個名為odoo的用戶:
# adduser odoo
- 配置PostgreSQL數(shù)據(jù)庫:
# sudo -u postgres createuser odoo
# sudo -u postgres createdb -O odoo odoo_project
- 以odoo用戶克隆項目倉庫:
# su odoo
$ mkdir ~/odoo-prod
$ cd ~/odoo-prod
$ git clone https://github.com/yourlogin/project.git project
$ mkdir -p project/src
- 以odoo用戶,克隆Odoo源代碼:
$ cd project/src
$ git clone -b 12.0 --single-branch https://github.com/odoo/odoo.git odoo
- 創(chuàng)建virtualenv并安裝依賴:
$ virtualenv -p python3 ~/env-odoo-12.0
$ source ~/env-odoo-12.0/bin/activate
$ pip3 install -r odoo/requirements.txt
- 在project/src子目錄中克隆所有第三方插件倉庫:
$ git clone -b 12.0 https://github.com/OCA/partner-contact.git
- 創(chuàng)建~/odoo-prod/project/bin目錄:
$ mkdir ~/odoo-prod/project/bin
- 創(chuàng)建一個腳本~/odoo-prod/project/bin/start-odoo來在生產(chǎn)環(huán)境輕松啟動Odoo:
#! /bin/sh
PYTHON=~env-odoo-12.0/bin/python3
ODOO=~odoo/odoo-prod/project/src/odoo/odoo-bin
CONF=~odoo/odoo-prod/project/production.conf
${PYTHON} ${ODOO} -c ${CONF} "$@"
- 讓該腳本可執(zhí)行:
$ chmod +x ~/odoo-prod/project/bin/start-odoo
- 以root用戶卸載gcc:
# apt-get remove gcc
運行原理...
大部分的內(nèi)容和第一章 安裝Odoo開發(fā)環(huán)境中所描述的是一樣的,但也有一些關(guān)鍵的區(qū)別。
我們在使用一個獨立的系統(tǒng)用戶來作為Odoo的登錄用戶。這讓我們可以控制誰對賬戶擁有權(quán)限,例如通過配置sudo或ssh認(rèn)證密鑰的方式。它還允許我們給用戶授予盡量少的權(quán)限,以防實例受到威脅和攻擊。
連接這一賬戶的數(shù)據(jù)庫沒有任何特權(quán) - 甚至沒有數(shù)據(jù)庫創(chuàng)建的權(quán)限。我們只需在外部創(chuàng)建數(shù)據(jù)庫一次。如果實例受到攻擊,黑客將不能在服務(wù)器上創(chuàng)建其它數(shù)據(jù)庫。
我們所創(chuàng)建的Odoo腳本將會在本章后面的設(shè)置Odoo來作為系統(tǒng)服務(wù)中使用到。它使用production.conf 配置文件,這在下一部分為生產(chǎn)環(huán)境調(diào)整配置文件中將進(jìn)行講解。
我們在操作的最后卸載了gcc,這樣在黑客獲取到權(quán)限時,他們將不能使用它來編譯本地的可執(zhí)行文件。
在這一部分的最后,你的服務(wù)尚未準(zhǔn)備就緒,你需要參照本章中的為生產(chǎn)環(huán)境調(diào)整配置文件、設(shè)置Odoo來作為系統(tǒng)服務(wù)和配置反向代理及 SSL 的部分。
擴展內(nèi)容...
以下為準(zhǔn)備部署你的實例時需要考慮的幾個更重要的點。
服務(wù)器選型
你應(yīng)該使用什么樣的服務(wù)器?基本上當(dāng)今所有的物理服務(wù)器都足以處理包含20個并發(fā)用戶的平均大小的Odoo實例。因為虛擬機通常分配了更少的資源,如果你計劃使用虛擬機,你會需要稍稍更多的關(guān)注一下。以下是幫助你上手的幾個重要的點。顯然,需要對它們進(jìn)行優(yōu)化來匹配你對Odoo的使用。
一個小型Odoo實例至少需要1 GB的內(nèi)存。對于內(nèi)存分配要適當(dāng)寬松點,最后為服務(wù)添加2-4 GB的swap內(nèi)存也是不錯的起點。最少給你的服務(wù)2 個/核CPU。如果你在同一臺主機上運行PostgreSQL服務(wù),至少為數(shù)據(jù)庫分配4個/核 CPU 以及1 GB內(nèi)存。額外的CPU/核數(shù)將由Odoo的worker使用,這會在下一部分為生產(chǎn)環(huán)境調(diào)整配置文件中講解。
如果你保留Git歷史記錄的話(這部分我們推薦保留),實例的源代碼將占用1-2GB的磁盤空間。文件存儲(配置文件中的data_dir)會隨著實例的使用不斷增長,這一增長嚴(yán)重地依賴于你的實例用來做什么。一開始分配5GB,在磁盤爆滿前你應(yīng)該會有足夠的時間來進(jìn)行磁盤使用的監(jiān)控。如果你在同一臺主機上運行數(shù)據(jù)庫,給包含數(shù)據(jù)庫運行文件的分區(qū)分配足夠的磁盤空間,50GB起。
你還將為主機上數(shù)據(jù)庫和文件存儲的備份預(yù)留空間。這很大程度取決于你的備份計劃,200GB是一個不錯的初始配置。
PostgreSQL調(diào)優(yōu)
討論PostgreSQL的調(diào)優(yōu)不在本書的范疇內(nèi)。你可能會需要閱讀Packt出版社的PostgreSQL 10管理員指南或PostgreSQL 10.0高性能等書來獲得這一個課題更深入的知識。
PostgreSQL的默認(rèn)配置通常很保守,以防止數(shù)據(jù)庫服務(wù)獨占所有的系統(tǒng)資源。在生產(chǎn)服務(wù)器上,你可以無憂地提升postgresql.conf 文件中的一些參數(shù)來獲取更好的性能。以下是你可以用于入手PostgreSQL 9.6 的一些設(shè)置:
max_connections = 80
shared_buffers = 256MB
effective_cache_size = 768MB
work_mem = 3276kB
maintenance_work_mem = 64MB
min_wal_size = 2GB
max_wal_size = 4GB
checkpoint_completion_target = 0.9
wal_buffers = 7864kB
default_statistics_target = 100
在修改了這些設(shè)置之后你需要重啟PostgreSQL(sudo /etc/init.d/postgresql restart)。
pgtune工具可以幫助你找到更多的合適的配置。在線版本地址為http://pgtune.leopard.in.ua/:

訪問該網(wǎng)站并填寫其中的表單:
- DB Version:使用你所安裝的數(shù)據(jù)庫版本(默認(rèn)Debian Stretch為9.6,Ubuntu 18.04為10.5)
- OS Type: Linux。
- DB Type:選擇Online transaction processing system,因為Odoo使用了大量的事務(wù)。
- Total Memory (RAM):填寫你想為PostgreSQL分配的內(nèi)存,如果你使用一臺獨立的服務(wù)機則接近它的所有內(nèi)存(參見下一段中有關(guān)獨立數(shù)據(jù)庫服務(wù)器的內(nèi)容了解更多詳情)。
- Number of CPUs (core):這個參數(shù)的值為你想要為PostgreSQL分配的CPU數(shù)量/核數(shù)。
- Number of Connections:你的數(shù)據(jù)庫服務(wù)可以接受的最大并發(fā)數(shù)。
- Data Storage:數(shù)據(jù)存儲設(shè)備的類型。例如,SSD或HDD。
如果你的實例負(fù)載很重,可以通過將數(shù)據(jù)庫服務(wù)和Odoo服務(wù)分離到兩臺不同的主機上來獲得更佳的體驗。不要使用同一臺物理主機上的兩個虛擬機,如果你已經(jīng)碰到這種狀況時使用高速網(wǎng)絡(luò)連接的兩臺物理服務(wù)器。那樣,你會需要確保數(shù)據(jù)庫服務(wù)器主機上pg_hba.conf文件允許來自O(shè)doo服務(wù)器的密碼驗證連接,并且postgresql.conf文件允許PostgreSQL服務(wù)在網(wǎng)卡上監(jiān)聽這兩臺服務(wù)器。
源碼版本
在克隆Odoo和第三方依賴時,你會想要確保使用與開發(fā)環(huán)境中所使用的相同修訂版本。有幾種實現(xiàn)方式:
- 你可以在一個文件中手動記錄本地修訂的SHA1版本,在項目倉庫中進(jìn)行記錄,并確保你在生產(chǎn)服務(wù)器上使用相同的修訂版本。
- 你可以使用自己的GitHub倉庫中對這些倉庫復(fù)制的標(biāo)簽或分支。
- 你可以使用git submodule來綁定你項目倉庫中的這些修訂版本(訪問https://git-scm.com/book/en/v2/Git-Tools-Submodules來獲取這個很順手的工具的文檔)。
??為什么不使用Odoo所提供的Linux發(fā)行包?
如果這么做,你會上手很快,因為很多事情發(fā)行包都會替你處理好。但是,使用打包的資源會帶來一些問題。最重要的是,你不能輕松地為Odoo源代碼打補丁,通過源代碼運行時則更為容易。沒錯,這不是你需要日常做的事,但能夠使用標(biāo)準(zhǔn)開發(fā)工具來完成這一任務(wù),而不是手動地在生產(chǎn)服務(wù)器上應(yīng)用并跟蹤補丁,會有巨大的幫助并節(jié)約寶貴的時間。
備份
這一部分不講解備份。至少你應(yīng)使用服務(wù)器上的cron任務(wù)來進(jìn)行每天的備份。一個簡單且基礎(chǔ)的方案是以root用戶運行crontab -e 來編輯 crontab文件并添加如下代碼:
@daily su postgres -c pg_dumpall | gzip >\
/backups/postgresql-$(date +%u).dump.gz
@daily tar czf /backups/odoo-filestore-$(date +%u).tgz \
/home/odoo/odoo-prod/project/filestore
不要忘記創(chuàng)建這個/backups目錄。備份文件不應(yīng)存儲在相同的硬盤上,理想情況下,這些文件應(yīng)鏡像到在不同物理空間的服務(wù)器上。定期檢查這些備份,保留不能還原的備份文件是沒有意義的。
推薦的方案是保留最近7天的每日備份,這表示如果問題出現(xiàn)的話你會丟失大約一天的運行數(shù)據(jù)。PostgreSQL有更高級的方案可允許基于時間點的故障恢復(fù)(PITR)。你可以在Packt出版社的PostgreSQL 9 Admin Cookbook一書了解到更多信息。類似地,有很多可用于文件備份Linux的工具,如duplicity(http://duplicity.nongnu.org/),會讓管理更容易。
為生產(chǎn)環(huán)境調(diào)整配置文件
在第一章 安裝Odoo開發(fā)環(huán)境中,我們了解了如何將實例配置保存到一個文件中。很多參數(shù)我們都使用了默認(rèn)值,并且如果你照著第二章 管理Odoo服務(wù)器實例中標(biāo)準(zhǔn)化你的實例目錄布局以及本章中安裝Odoo來供生產(chǎn)使用小節(jié)來安裝生產(chǎn)環(huán)境的話,你應(yīng)該會在生產(chǎn)環(huán)境中有著相同的配置文件。這一節(jié)展示如何獲取一個適合于正式環(huán)境的配置文件。
準(zhǔn)備工作
我們假設(shè)你已經(jīng)通過安裝Odoo來供生產(chǎn)使用一節(jié)在生產(chǎn)服務(wù)器上安裝了Odoo。假設(shè)你在與Odoo相同的服務(wù)器上運行PostgreSQL。
你可以安裝pwgen小工具來生成隨機密碼。
我們這里按照在生產(chǎn)服務(wù)器上運行它們來描述這些步驟,但也可以在你的開發(fā)服務(wù)器上進(jìn)行執(zhí)行,因為新的配置文件被添加到了我們用于部署到生產(chǎn)環(huán)境的項目的Git倉庫中。
如何操作...
要為生產(chǎn)環(huán)境調(diào)整配置文件,你需要按照如下步驟:
- 在開發(fā)環(huán)境的基礎(chǔ)上新建一個生產(chǎn)環(huán)境的配置文件:
$ cd ~/odoo-prod/project
$ cp development.conf production.conf
- 編輯生產(chǎn)環(huán)境配置production.conf 文件。
- 修改addons_path來匹配生產(chǎn)環(huán)境的根路徑:
addons_path = /home/odoo/odoo-prod/project/src/odoo/addons, /home/odoo/odoo-prod/project/src/odoo/odoo/addons, /home/odoo/odoo-prod/project/src/partner-contact
- 修改數(shù)據(jù)路徑:
data_dir = /home/odoo/odoo-prod/project/filestore
- 修改服務(wù)服務(wù)日志路徑來匹配生產(chǎn)環(huán)境的根路徑:
logfile = /home/odoo/odoo-prod/project/logs/odoo.log
- 配置日志輪詢:
logrotate = True
- 配置日志處理器:
log_level = warn
log_handler = :WARNING,werkzeug:CRITICAL,odoo.service.server:INFO
- 調(diào)整數(shù)據(jù)庫連接參數(shù):
db_host = False
db_maxconn = 64
db_name = odoo-project
db_password = False
db_port = False
db_template = template1
db_user = False
- 配置數(shù)據(jù)庫過濾器并禁用數(shù)據(jù)庫列出顯示:
dbfilter = odoo-project$
list_db = False
- 使用pwgen生成的隨機密碼來修改master密碼
admin_password = 使用一個隨機密碼
- 配置Odoo來以worker進(jìn)程運行:
workers = 4
# limit_memory_hard: 4GB
limit_memory_hard = 4294967296
# limit_memory_soft: 640MB
limit_memory_soft = 671088640
limit_request = 8192
limit_time_cpu = 120
limit_time_real = 300
- 僅監(jiān)聽本地網(wǎng)卡:
http_interface = 127.0.0.1
- 保存該文件并將其添加至Git倉庫:
$ git add production.conf
$ git commit -m "add production configuration file"
運行原理...
這一節(jié)中的使用的大部分參數(shù)都在第一章 安裝Odoo開發(fā)環(huán)境的在一個文件中存儲實例配置中進(jìn)行了講解。
在第3, 4和5步中,我們修改了插件路徑和日志文件。如果你用于開發(fā)的環(huán)境與生產(chǎn)環(huán)境有著相同的布局,這是要求做的,因為Odoo在配置文件中預(yù)期的是絕對路徑。
第6步啟動了日志輪詢。這會引發(fā)Odoo配置日志模塊來實現(xiàn)服務(wù)日志的按日存檔,并且保存日志30天。對生產(chǎn)服務(wù)器這非常有用,可以避免日志最終消耗掉所有的可用磁盤空間。
第7步配置了日志級別。這里建議的配置非常保守,僅會記錄WARNING級別以上的日志信息,除werkzeug (CRITICAL) 和odoo.service.server (INFO)外。有關(guān)日志過濾的更多信息,參見第八章 調(diào)試,那里你會發(fā)現(xiàn)生成服務(wù)日志幫助調(diào)試方法一節(jié)。可根據(jù)自身情況進(jìn)行自由調(diào)整。
第8步配置數(shù)據(jù)庫設(shè)置。如果你的PostgreSQL數(shù)據(jù)庫服務(wù)在本地運行并且按照前面部分所講解的進(jìn)行設(shè)置這會生效。如果你在其它服務(wù)器上運行PostgreSQL,會需要將False值替換為你的數(shù)據(jù)庫實例對應(yīng)的連接配置。
第9步通過配置數(shù)據(jù)庫過濾器來限制該實例的可用數(shù)據(jù)庫。我們還禁用了列出數(shù)據(jù)庫,這并不是嚴(yán)格必需的,因為我們在dbfilter中設(shè)置的正則表達(dá)式僅會匹配單個數(shù)據(jù)庫。但這樣做仍是一件好事,可以避免向任何人展示數(shù)據(jù)庫列表,來避免有用戶連接到錯誤的數(shù)據(jù)庫上。
第10步為實例設(shè)置了一個足夠復(fù)雜的master密碼。master密碼用于通過用戶界面管理數(shù)據(jù)庫,一些社區(qū)插件也使用它來作為導(dǎo)致數(shù)據(jù)損失的動作執(zhí)行前進(jìn)行安全驗證。你極其需要設(shè)置這一足夠復(fù)雜的值。我們推薦使用pwgen小工具來生成一個隨機密碼,但任意其它方法都有效。
第11步配置Odoo使用worker進(jìn)程進(jìn)行運行。在這種模式下,Odoo會創(chuàng)建一些worker進(jìn)程(本例中為4個)來處理HTTP請求。這與默認(rèn)配置相比有幾個優(yōu)勢,其中請求由單獨的線程進(jìn)行處理,如下:
- 請求可更好地使用服務(wù)器的多個或多核 CPU 來并行進(jìn)行處理(Python多線程由于Python解釋器中的全局鎖(GIL)的存在而受到限制)。
- 可以根據(jù)資源消耗終止其中的一個worker進(jìn)程。下表中給出了可以配置的不同資源限制:
| 參數(shù) | 推薦值 | 描述 |
|---|---|---|
| limit_memory_hard | 4294967296 | 這是一個worker進(jìn)程可以分配的最大內(nèi)存值。我們推薦使用4 GB,因為Odoo所啟動的一些進(jìn)程可以分配大量的內(nèi)存。 |
| limit_memory_soft | 671088640 | 如果一個worker 進(jìn)程最終的消耗超過這一限制(我們的設(shè)置為640 MB),在它結(jié)束處理當(dāng)前請求后會被終止。 |
| limit_request | 8192 | 一個worker進(jìn)程會在處理這么多請求之后被終止 |
| limit_time_cpu | 120 | 這是允許處理一個請求的最長 CPU 時間。 |
| limit_time_real | 300 | 這是允許處理一個請求的最長真實時間。 |
第12步配置內(nèi)部Odoo網(wǎng)頁服務(wù)僅監(jiān)聽本地接口。這表示該實例無法通過其它服務(wù)器訪問。這讓我們可以在相同服務(wù)器上配置反向代理來訪問該服務(wù),并強制加密連接。參見本章后面的配置反向代理及SSL一節(jié)。
小貼士:如果你不確定應(yīng)為服務(wù)設(shè)置多少個worker進(jìn)程,使用以下公式為你的系統(tǒng)計算一個worker進(jìn)程數(shù):
No. of workers = (No. of CPU * 2) + 1
這里,一個worker進(jìn)程可以處理大約6個并發(fā)用戶。
擴展內(nèi)容...
在使用worker進(jìn)程運行時,你可能會碰到如下針對該模式的具體問題:
- 如果你在使用worker進(jìn)程運行時獲得一些wkhtmltopdf未如預(yù)期運行的奇怪報錯(例如,以狀態(tài)碼-11 或 -6過早的退出 ),那么很有可能你所設(shè)置的limit_memory_hard的值過低。試著做一些提升,因為默認(rèn)值是出名的過低。
- 如果你在執(zhí)行長操作時得到超時錯誤(包括CSV導(dǎo)入、導(dǎo)出以及插件模塊安裝),試著提升limit_time_cpu和limit_time_real參數(shù),因為同樣它們的默認(rèn)值也相當(dāng)?shù)?。如果你有反向代?,還應(yīng)檢查其超時限制(反向代理中的過低限制不會阻止事務(wù)的完成,但會在用戶的瀏覽器中展示錯誤消息,這會導(dǎo)致他們嘗試重新導(dǎo)入并為服務(wù)器帶來不必要的負(fù)載)。
- 如果你的實例在打印報表時完全卡住,試著提升worker進(jìn)程數(shù)。這可能是由wkhtmltopdf在打印時占用所有可用worker進(jìn)程所導(dǎo)致的死鎖。
小貼士:不論什么情況下,保持在配置到生產(chǎn)環(huán)境前進(jìn)行設(shè)置的驗證,并記住在啟用worker進(jìn)程時測試打印報表。
設(shè)置Odoo來作為系統(tǒng)服務(wù)
對于一個生產(chǎn)實例,在機器重啟時保持Odoo服務(wù)的啟動非常的重要。在當(dāng)前的Linux系統(tǒng)中,這通過systemd的配置來實現(xiàn)。如果你的操作系統(tǒng)不使用systemd,則需要查看文檔來獲取這一結(jié)果。
準(zhǔn)備工作
我們假定你按著前面部分進(jìn)行安裝和Odoo實例的配置,尤其是Odoo的部署源代碼應(yīng)為/home/odoo/odoo-prod/project/src/odoo/,以及實例的配置文件應(yīng)為/home/odoo/odoo-prod/project/production.conf。該腳本還使用了安裝Odoo來供生產(chǎn)使用一節(jié)第9步中所創(chuàng)建的start-odoo 腳本。
如何操作...
你需要執(zhí)行如下步驟配置systemd來啟動Odoo:
- 使用root權(quán)限(sudo su),創(chuàng)建一個名為/lib/systemd/system/odoo.service的文件并添加如下內(nèi)容:
[Unit]
Description=Odoo 12.0
After=postgresql.service
[Service]
Type=simple
User=odoo
Group=odoo
WorkingDirectory=/home/odoo/odoo-prod/project
ExecStart=/home/odoo/odoo-prod/project/bin/start-odoo
[Install]
WantedBy=multi-user.target
- 使用root權(quán)限,注冊該服務(wù):
# systemctl enable odoo.service
- 使用root權(quán)限,啟動服務(wù):
# service odoo start
- 可運行如下命令來停止服務(wù):
# service odoo stop
運行原理...
systemd 使用一些配置文件或腳本來識別在服務(wù)啟動時必須運行的程序。這一節(jié)中所提供的配置需要做一些微調(diào)來適配你自己實例的路徑。
??別忘記重啟服務(wù)并查看Odoo是否正常啟動!
使用nginx和Let's Encrypt配置反向代理及SSL
在你通過HTTP協(xié)議訪問Odoo服務(wù)時,用戶瀏覽器與Odoo服務(wù)之前的所有信息都暴露在網(wǎng)絡(luò)中,因此使用HTTPS協(xié)議來對傳輸信息進(jìn)行加密非常之有必要。Odoo無法原生地實現(xiàn)這點,有必要配置反向代理來為Odoo處理加密和解密。這節(jié)向您展示使用nginx(http://nginx.net)來進(jìn)行實現(xiàn)。我們還將向你展示在你的組織沒有自己簽署 SSL 證書的方式時使用Let's Encrypt(https:// letsencrypt.org)來管理證書和更新證書。
相關(guān)文章:
準(zhǔn)備工作
你應(yīng)該知道服務(wù)器的對外名稱以及相應(yīng)地配置DNS。這一節(jié)中,我們將使用 odoo.example.com來作為我們的服務(wù)器名。你將需要使用自己的域名替換它。
如果你使用 Let's Encrypt來獲取SSL證書的話確保外界可通過DNS名稱訪問到你服務(wù)器的80和443端口。
如何操作...
你需要按照如下步驟來通過NGINX使用HTTPS訪問你的實例:
譯者注:下例中安裝 ssl 證書需在公網(wǎng)進(jìn)行,因Let's Encrypt會通過 DNS 驗證域名的有效性,相關(guān)文件請見 GitHub 倉庫
- 使用root權(quán)限,安裝Let's Encrypt客戶端certbot:
# apt-get update
# apt-get install software-properties-common -y
# add-apt-repository universe
# add-apt-repository ppa:certbot/certbot
# apt-get update
# apt-get install certbot python-certbot-nginx -y
- 使用root權(quán)限,從Let's Encrypt請求一個證書(不要忘記修改email和服務(wù)器地址):
# certbot certonly --standalone -n --agree-tos\
-m youremail@example.com -d odoo.example.com
**譯者注:**安80端口被占用可能會報Problem binding to port 80: Could not bind to IPv4 or IPv6.,需關(guān)閉相應(yīng)服務(wù)如:service nginx stop
- 使用root權(quán)限,安裝nginx:
# apt-get install nginx -y
- 在/etc/nginx/sites-available/odoo-ssl中創(chuàng)建一個配置文件并添加上游引用如下:
upstream odoo {
server 127.0.0.1:8069;
}
upstream odoochat {
server 127.0.0.1:8072;
}
- 在相同的文件中,添加rewrite規(guī)則來將http重寫向到https網(wǎng)站:
server {
listen 80;
server_name odoo.example.com;
rewrite ^(.*) https://$host$1 permanent;
}
- 在相同的文件中,添加如下nginx配置來通過https提供Odoo實例的服務(wù):
server {
listen 443;
server_name odoo.example.com;
proxy_read_timeout 720s;
proxy_connect_timeout 720s;
proxy_send_timeout 720s;
# 在這里放置第7到12步的配置
}
- 在server版塊中添加SSL配置:
# SSL Configuration
ssl on;
ssl_certificate /etc/letsencrypt/live/odoo.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/odoo.example.com/privkey.pem;
ssl_session_timeout 30m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384";
ssl_prefer_server_ciphers on;
- 在server版塊中添加日志文件配置:
# Add log files
access_log /var/log/nginx/odoo.access.log;
error_log /var/log/nginx/odoo.error.log;
- 通過在server版塊中添加如下配置來啟用gzip:
# enable gzip
gzip on;
gzip_types text/css text/scss text/plain text/xml application/xml application/json application/javascript;
- 在server版塊中添加代理header配置:
# Add Headers
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
- 在server版塊中添加反向代理配置:
# Manage longpolling on 8072 port
location /longpolling {
proxy_pass http://odoochat;
}
# Redirect requests to odoo server on 8069
location / {
proxy_redirect off;
proxy_pass http://odoo;
}
- 通過在server版塊中添加如下配置來啟用靜態(tài)緩存:
# Enable static cache
location ~* /web/static/ {
proxy_cache_valid 200 60m;
proxy_buffering on;
expires 864000;
proxy_pass http://odoo;
}
- 使用root權(quán)限,添加/etc/nginx/sites-enabled/中配置文件的鏈接:
# ln -s /etc/nginx/sites-available/odoo-ssl\
/etc/nginx/sites-enabled/odoo-ssl
- 使用root權(quán)限,刪除/etc/nginx/sites-enabled/default:
# rm /etc/nginx/sites-enabled/default
- 使用Odoo用戶,編輯實例的生產(chǎn)配置文件來啟動proxy_mode:
proxy_mode = True
- 使用root權(quán)限,重啟你的odoo實例和nginx:
# service odoo restart
# service nginx restart
- 使用root權(quán)限,創(chuàng)建一個etc/cron.d/letsencrypt計劃任務(wù)文件來確保證書會被更新,添加如下內(nèi)容(譯者注:crontab -e):
11 5 * * * certbot renew
運行原理...
在第1步和第2步中,我們安裝了certbot并為odoo.example.com網(wǎng)站生成了SSL證書。certbot程序是一個命令行工具,簡化了與letsencrypt.org交互來生成免費SSL證書的操作。完整文檔參見https://certbot.eff.org/docs/。本節(jié)中,我們使用了子命令certbot certonly,它將向Let's Encrypt請求一個-d 選項所傳遞域名的簽名證書。使用-m選項指定你的email地址。--standalone選項要求certbot設(shè)置本地臨時網(wǎng)頁服務(wù),Let's Encrypt將嘗試與其聯(lián)系來檢查你對請求證書的域名的控制權(quán)。因此在托管Odoo的服務(wù)器上運行該命令、DNS指向該服務(wù)器以及沒有防火禁用80和443端口的訪問都很重要。
??這一檢查通過連接http://<yourdomain>:80/.well-known/acme來實現(xiàn)。certbot的--standalone模式創(chuàng)建一個臨時web服務(wù)監(jiān)聽該端口并能響應(yīng)請求,但這僅在沒有其它進(jìn)程監(jiān)聽80端口及外部防火墻允許對該端口的外部訪問通過時生效。
我們使用nginx作為反向HTTP代理。進(jìn)入的HTTP和HTTPS連接都由nginx處理,它將該請求的處理代理至Odoo服務(wù)。Odoo服務(wù)配置為僅監(jiān)聽本地回環(huán)接口(127.0.0.1)的8069端口來接收正常請求(http_port)、監(jiān)聽8072端口來接收長輪詢請求(longpolling_port)。你可能會需要按照自己的配置來調(diào)整這些端口號:

在第4步中,我們添加了/etc/nginx/sites-available/odoo-ssl這一nginx配置文件。在這個文件中,我們添加了一個上游引用 。這是對本地服務(wù)器的引用 ,我們將在下一步中使用到它。
在第5步中,我們添加了服務(wù)器配置來使用HTTP協(xié)議管理80端口進(jìn)入的連接。我們不想要通過HTTP提供網(wǎng)站服務(wù),因為數(shù)據(jù)以純文本進(jìn)行傳輸,這表示可以嗅探出密碼。因此,我們添加了一個URL并重寫了一條規(guī)則來將所有URL永久重定向到使用HTTPS協(xié)議加密的443端口。
第6-13步要更為復(fù)雜些,添加了配置來使用HTTPS協(xié)議處理連接。以下是配置中不同版塊的詳情:
- 第6步中的配置版塊配置服務(wù)器處理對odoo.example.com域名443端口上的請求。
- 第7步中的配置版塊配置了SSL協(xié)議,加密密鑰及證書。
- 第8步中的配置版塊添加了日志文件的位置。在請求通過Nginx進(jìn)行服務(wù)提供時,該文件會用于存儲日志。
- 第9步中添加了gzip版塊,用于壓縮文件。這對減小頁面大小發(fā)揮了重要的作用。
- 第10步中的配置版塊添加了額外的header來對每次請求提供更多的信息。這些額外的header用于向Odoo服務(wù)提供更多的信息。
- 第11步中添加了location /版塊,定義了進(jìn)入的請求的默認(rèn)處理,它們會被代碼到監(jiān)聽8069端口的Odoo服務(wù)。
- 第11步中添加了location /longpolling版塊,用于處理以/longpolling開頭的URL的查詢,它們被通過8072端口轉(zhuǎn)發(fā)到Odoo。這些連接由總線(bus)插件模塊使用來給網(wǎng)頁客戶端發(fā)送通知。
- 第12步中添加了location ~* /web/static/版塊,使用了正則表達(dá)式來匹配Odoo各模塊靜態(tài)文件的URL。這些文件很少進(jìn)行更新,因此我們讓nginx對它們進(jìn)行緩存來減輕Odoo服務(wù)器的負(fù)載。
在最后一步中,我們使用了certbot renew命令,它檢查待更新證書,并自動更新這些證書。默認(rèn)Let's Encrypt證書的有效期是90天,還是很短的。借助于這一每天運行的工具,即將過期的證書將會自動被更新。

擴展內(nèi)容...
這一部分集中于nginx配置。你可能會更熟悉其它工具,如Apache網(wǎng)頁服務(wù)器和mod_proxy。這時,你自然也可以使用它們來實現(xiàn)相似的設(shè)置。
如果不愿意使用Let's Encrypt,而偏好于使用其它證書機構(gòu)(CA),你可以使用如下步驟:
- 安裝openssl:
$ sudo apt-get install openssl
- 為你的服務(wù)器生成密鑰:
$ mkdir ~/sslkey
$ openssl genrsa -out ~/sslkey/server.key 2048
- 生成簽署請求:
$ openssl req -new -key ~/sslkey/server.key\
-out ~/sslkey/server.csr
- 以上的命令會接著一系列的問題詢問你的公司名和Odoo服務(wù)URL等。不要填錯了,否則你的證書將不可用。
- 你將可以發(fā)送~/sslkey/server.csr文件到你所選擇的證書機構(gòu)(CA)。CA會向你發(fā)回一個名為server.crt的文件。
- 你將需要在/etc/nginx/ssl/ 目錄中存儲該文件以及第2步中所生成的server.key文件:
# mkdir -p /etc/nginx/ssl
# chown www-data /etc/nginx/ssl
# mv server.key server.crt /etc/nginx/ssl
# chmod 710 /etc/nginx/ssl
# chown root:www-data /etc/nginx/ssl/*
# chmod 640 /etc/nginx/ssl/*
- 那么,在本節(jié)中所提供的/etc/nginx/sitesavailable/odoo-443這一nginx配置文件中,重寫ssl_certificate和ssl_certificate_key行如下:
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
- 最后,重啟nginx。
譯者注:還有很多其它選擇,如使用阿里云可直接在后臺生成一年免費證書,下載文件配置到 Nginx中即可
其它知識
- 有關(guān)nginx配置選項的更多信息,參見http://nginx.org/en/docs/。
- 有關(guān)Apache2作為反向代理配置的教程及個人證書機構(gòu)的使用,參見http://antiun.github.io/odoo-reverse-proxy-howto/。
使用Docker來運行Odoo
Docker項目通過提供更高級別的工具來讓Linux容器(LXC)更易于管理。這些容器可易于應(yīng)用的發(fā)布以及依賴的管理。Docker周邊有一整套生態(tài)系統(tǒng),用于方便容器化應(yīng)用的部署和管理。討論這些細(xì)節(jié)在本節(jié)的范疇之外,有興趣的讀者可閱讀Packt出版社的Learning Docker來獲取更深入的講解。
相關(guān)文章:【已完結(jié)】精通 Docker 第三版中文版
這一節(jié)中,我們將來了解如何使用官方Odoo Docker鏡像來運行一個開發(fā)或生產(chǎn)服務(wù)。
準(zhǔn)備工作
我們假定在你的開發(fā)機器及生產(chǎn)服務(wù)器上都安裝了Docker。在Debian GNU/Linux上安裝Docker社區(qū)版的指南參見https://docs.docker.com/install/linux/docker-ce/debian/(其它平臺的安裝指南在該頁面上也可以找到)。而在Ubuntu服務(wù)器上你可以使用如下命令來進(jìn)行安裝:
$ sudo apt-get install docker.io -y
如何操作...
按照如下步驟來通過官方Odoo鏡像來運行Docker(譯者注:以下操作使用的是 root 賬號,非 root 用戶可以添加 sudo來執(zhí)行命令):
- 通過如下命令設(shè)置PostgreSQL服務(wù)docker實例:
# docker run -d -e POSTGRES_USER=odoo -e POSTGRES_PASSWORD=odoo -e POSTGRES_DB=postgres --name db postgres:10
- 通過如下命令運行PostgresSQL數(shù)據(jù)庫:
# docker start db
- 通過如下命令設(shè)置Odoo docker實例:
# docker run -p 8069:8069 --name odoo --link db:db -t odoo
- 通過如下命令運行odoo實例:
# docker start odoo
以上命令會在8069端口上啟動Odoo服務(wù)。在你的本地機器上,你可以通過http://localhost:8069來訪問該odoo實例。
如果你想要查看運行中的docker容器的狀態(tài),運行如下命令即可:
# docker ps
docker ps命令會展示類似如下的輸出:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4c1b4e50f632 odoo "/entrypoint.sh odoo" 10 seconds ago Up 9 seconds 0.0.0.0:8069->8069/tcp, 8071/tcp odoo
58854bebe4cb postgres:10 "docker-entrypoint.s…" 9 minutes ago Up 9 minutes 5432/tcp db
運行原理...
Docker允許你創(chuàng)建系統(tǒng)鏡像并將它們分發(fā)到其它服務(wù)器上來運行。Docker鏡像通過編寫Dockerfile來創(chuàng)建,該文件描述如何在已存在的Dockerfile上添加層。Docker鏡像托管在https://hub.docker.com上,在這一節(jié)中,我們使用了PostgreSQL和Odoo的官方鏡像。
在運行Odoo實例容器之前,我們需要為PostgreSQL設(shè)置一個容器。在第1步中,我們運行了PostgreSQL 10的Docker鏡像。該命令會搜索這一PostgreSQL Docker鏡像。如果在你的系統(tǒng)中不存在,Docker會下載它。在命令中,我們傳遞了--name db選項。這里,db是該PostgreSQL容器的名稱。在第2步中,我們啟動了PostgreSQL的Docker容器。
在第3步中,我們運行了Odoo的Docker鏡像。這在8069端口上運行了Odoo實例。如是你想要以不同的配置來運行該命令,可以使用不同的選項。以下是進(jìn)一步地討論如何使用自定義選項來運行Odoo實例的一些示例。
運行帶有配置文件的Odoo鏡像
你可以使用自己的配置文件來運行Odoo實例。這樣做你會需要使用-v volume選項。以下是通過/path/to/config/odoo.conf配置文件運行Odoo容器的命令:
# docker run -v /path/to/config.conf:/etc/odoo -p 8069:8069 --name odoo --link db:db -t odoo
如果你不想載入該配置文件,而是想直接使用配置選項,那么你可以通過在命令行中傳遞帶有 -- 的選項,類似這樣:
# docker run -p 8069:8069 --name odoo --link db:db -t odoo --db-filter=test
運行帶有自定義插件的Odoo鏡像
默認(rèn)Odoo容器運行社區(qū)版插件。如果你想要使用你自己的插件模塊來運行Odoo,你可以你下面這樣在/mnt/extra-addons目錄中掛載自己的插來進(jìn)行實現(xiàn):
$ docker run -v /path/to/my_addons:/mnt/extra-addons -p 8069:8069 --name odoo --link db:db -t odoo
運行多Odoo實例
如果你想在單個服務(wù)器上運行多個Odoo實例,那么你可以通過修改容器名及暴露的端口來進(jìn)行實現(xiàn)。查看如下的命令,通過以odoo1和odoo2的名稱來運行兩個odoo容器。這些Odoo實例將分別運行在8070和8071端口上:
# docker run -p 8070:8069 --name odoo2 --link db:db -t odoo
# docker run -p 8071:8069 --name odoo3 --link db:db -t odoo
擴展內(nèi)容...
如果使用官方Odoo Docker鏡像安裝的服務(wù)無法滿足你的要求,那么你可以通過Dockerfile創(chuàng)建你自己的Docker鏡像。Odoo官方的Dockerfile地址為https://github.com/odoo/docker。你可以修改該Dockerfile,然后使用docker build 命令構(gòu)建Docker鏡像。
通過docker-compose運行Odoo
在上一節(jié)中,我使用兩個Docker容器來運行Odoo實例,PostgreSQL和Odoo容器。這一節(jié)中,我們將來了解docker-compose,docker-compose是用于管理多容器Docker應(yīng)用的工具。
準(zhǔn)備工作
為使用docker-compose工具來設(shè)置Odoo,你將在系統(tǒng)中需要安裝docker-compose。在終端中執(zhí)行如下命令來在系統(tǒng)中安裝docker-compose:
$ sudo apt-get install docker-compose -y
如何操作...
根據(jù)如下命令來通過docker-compose運行Odoo實例:
- 新建docker-compose.yaml文件并添加如下內(nèi)容:
version: '2'
services:
web:
image: odoo:12.0
depends_on:
- db
ports:
- "8069:8069"
db:
image: postgres:10
environment:
- POSTGRES_DB=postgres
- POSTGRES_PASSWORD=odoo
- POSTGRES_USER=odoo
- 在終端中執(zhí)行如下命令來運行Odoo實例(譯者注:root 用戶或 sudo):
# docker-compose up -d
以上命令會在8069端口上啟動Odoo服務(wù)。在你的本地機器上,你可以通過http://localhost: 8069訪問Odoo實例。使用docker ps命令來查看運行中的容器。
運行原理...
docker-compose需要一個YAML文件來設(shè)置服務(wù)。在YAML文件中,你需要添加想要部署的服務(wù)的明細(xì)。在創(chuàng)建YAML文件之后,你可以使用單條命令啟動所有服務(wù)。
在第1步中,我們?yōu)樽约旱姆?wù)創(chuàng)建了YAML文件。要運行Odoo實例,我們需要兩個容器:一個給PostgreSQL數(shù)據(jù)庫,一個給Odoo自身。在services: 版塊中我們添加了兩個服務(wù)。第一個名為web。該服務(wù)用于運行Odoo實例。在該服務(wù)中,你需要指定你想要容器化的鏡像名稱。因此,在web服務(wù)中,我們添加了odoo:12.0來作為鏡像。
Odoo實例不能無數(shù)據(jù)庫運行。因此,我們需要通過depends_on鍵來指定依賴。接著,我們指定了PostgreSQL的服務(wù)。為該服務(wù)指定了名稱db。注意這是這是我們在web服務(wù)的依賴中添加的相同服務(wù)。
第二步中,我們使用了docker-compose命令來運行該Odoo實例。docker-compose命令將運行兩個容器。你可以通過docker ps命令來查看細(xì)節(jié)。在運行了該命令之后,可通過https://localhost:8069來訪問Odoo。
如果你想要使用自定義插件或你自己的配置,可以像如下這樣在docker compose YAML文件中指定數(shù)據(jù)卷:
version: '2'
services:
web:
image: odoo:12.0
depends_on:
- db
ports:
- "8069:8069"
volumes:
- odoo-web-data:/var/lib/odoo
- ./config:/etc/odoo
- ./addons:/mnt/extra-addons
db:
image: postgres:10
environment:
- POSTGRES_DB=postgres
- POSTGRES_PASSWORD=odoo
- POSTGRES_USER=odoo
- PGDATA=/var/lib/postgresql/data/pgdata
volumes:
- odoo-db-data:/var/lib/postgresql/data/pgdata
volumes:
odoo-web-data:
odoo-db-data:
該YAML文件將通過自定義插件和自定義配置來運行Odoo實例。它還使用volumes來作為Odoo和PostgreSQL數(shù)據(jù)目錄。
擴展內(nèi)容...
我們在這一節(jié)中設(shè)置的Docker鏡像僅僅是一個初始框架。你可能需要優(yōu)先大量參數(shù)來方例實例的管理,修改Dockerfile來讓你通過本地源代碼運行Odoo,而不是在每次編輯一個模塊時都要重建,這些都不在本書的討論范疇之內(nèi)。
Docker是一個巨大的世界,提供了大量的選項。你可能會想要在一個Docker鏡像倉庫上發(fā)布你的鏡像,以及使用docker push和docker pull來發(fā)布和獲取你項目的Docker鏡像。你還可能會想要運行一個Docker管理平臺,如Rancher,來在一個有負(fù)載均衡的服務(wù)器集群上運行你的鏡像。同時,你還可以通過持續(xù)集成環(huán)境集成鏡像的構(gòu)建步驟發(fā)布你的開發(fā)快照來進(jìn)行測試。
管理網(wǎng)站的內(nèi)容分發(fā)網(wǎng)絡(luò)(CDN)
內(nèi)容分發(fā)網(wǎng)絡(luò)(CDN)如今非常的流行。CDN通過在地理上非常近的服務(wù)器提供靜態(tài)資源的服務(wù)來降低網(wǎng)站的加載時間。Odoo有一個內(nèi)置的選項來為網(wǎng)站應(yīng)用配置CDN。在下例中,我們將來了解如何在Odoo中設(shè)置CDN。
準(zhǔn)備工作
我們假定你啟動了Odoo實例并且已安裝website應(yīng)用。如果你不知道如何在Odoo中安裝應(yīng)用,請參見第二章 管理Odoo服務(wù)器實例中的安裝并升級本地插件模塊一節(jié)。
市面上有很多可用的CDN服務(wù)提供商,如MaxCDN、KeyCDN和CloudFlare。下例中,我們將使用KeyCDN來作為我們的CDN服務(wù)提供商。如果你使用的是其它的CDN服務(wù)提供商,會發(fā)現(xiàn)相同類型的配置選項,因為大部分CDN服務(wù)提供商以相似的概念運行,因此你可以使用任意基于拉取的CDN服務(wù)提供商。
如何操作...
為Odoo網(wǎng)站設(shè)置CDN,你需要完成兩個配置:
- 配置CDN提供商
- 在Odoo上配置CDN
配置CDN提供商
請按照這些步驟來配置CDN提供商。這里我們將使用KeyCDN賬戶:
- 登錄你的KeyCDN賬戶
- 點擊Zones菜單并添加一個新區(qū)域:
image - 設(shè)置如下選項來激活該CDN區(qū)域:
- Zone Name:任意標(biāo)識區(qū)域的名稱
- Zone Status: active
- Zone Type: Pull
- Origin URL:你的Odoo實例所運行的 URL
- 保存該pull區(qū)域并從該列表中拷貝Zone URL。我們在下面的幾步中將在 Odoo 配置中使用這一 URL
image
在Odoo上配置CDN
使用管理員賬戶登錄你的Odoo實例并按照如下步驟來在Odoo中配置CDN:
激活開發(fā)者模式,因為CDN配置僅在激活了開發(fā)者模式之后才會顯示。參照第一章 安裝Odoo開發(fā)環(huán)境中激活Odoo開發(fā)者工具一節(jié)。
-
打開website應(yīng)用的Configuration菜單并搜索內(nèi)容分發(fā)網(wǎng)絡(luò)(CDN)選項:
image.png -
在網(wǎng)站配置中設(shè)置如下選項并保存設(shè)置:
- CDN Base URL:設(shè)置由CDN供應(yīng)商所提供的URL。在我們的例子中,我們將使用在上一小節(jié)第3步中拷貝的區(qū)域 URL
- CDN Filters:這是網(wǎng)站靜態(tài)資源的URL正則表達(dá)式列表。這些規(guī)則用于標(biāo)識將通過CDN提供服務(wù)的靜態(tài)資源。Odoo會在該字段中填寫默認(rèn)值,但如果你使用其它的 URL 來提供靜態(tài)資源,請手動在單獨的行中添加這些 URL。
按照如下步驟來檢查CDN的集成是否正常:
- 登出Odoo并對網(wǎng)站進(jìn)行公開的訪問。
- 打開瀏覽器開發(fā)者工具并進(jìn)行入網(wǎng)絡(luò)(network)選項卡
-
重載頁面并在網(wǎng)絡(luò)日志中查看靜態(tài)資源的 URL。靜態(tài)資源應(yīng)該像下圖中那樣通過CDN的URL來進(jìn)行加載:
image.png
譯者注:上圖及配置截圖使用的是MaxCDN,當(dāng)前使用 KeyCDN 嘗試多次未能成功注冊,相關(guān)截圖來自原書
你可能會獲取到 Cross-Origin Resource(跨域資源)的報錯,如下圖所示:

要修復(fù)這些錯誤,你需要通過CDN激活CORS。在keyCDN中,你會在高級特性中看到CORS選項,如下圖所示:

運行原理...
在你激活一個pull區(qū)域時,KeyCDN會自動從你的網(wǎng)站上抓取所有的靜態(tài)資源。它會在全球不同的服務(wù)器上緩存這些資源。要在你的Odoo網(wǎng)站上使用這些緩存資源,你需要通過CDN提供商所給出的 URL 來加載靜態(tài)資源。在第5步中,我們?yōu)镺doo網(wǎng)站配置了這一 URL,這樣在這一步后,Odoo將以CDN URL來加載靜態(tài)資源。
??為避免后臺用戶的問題,Odoo僅對公開用戶通過CDN URL來加載靜態(tài)資源。一旦你做了登錄,Odoo會停止使用CDN URL并會從相同的域加載靜態(tài)資源。
擴展內(nèi)容...
CDN服務(wù)商,如Cloudflare,使用基于DNS的技術(shù)來提供網(wǎng)站內(nèi)容的服務(wù)。如果你想要使用Cloudflare配置CDN,需要進(jìn)行更多的配置。要使用Cloudflare,你需要通過與你的網(wǎng)站域名不同的域名/子域名來提供緩存網(wǎng)站的服務(wù)。例如,odoo.com使用odoocdn.com來提供CDN資源的服務(wù)。之后,你需要在Odoo的配置中設(shè)置該域名/子域名為CDN Base URL。
??警告
在通過不同 URL 為相同網(wǎng)站提供服務(wù)時需要格外小心,因為如果你提交該CDN域名給搜索引擎索引的話可能更改掉你的sitemap.xml文件。



