Odoo部署

dbfilter

Odoo是一個多租戶的系統:一個單Odoo系統可以跑多個數據庫實例,並且它是高度可定製化的,不同的database可以安裝不同的modules。
對於那些需要登錄web後臺的用戶來說,dbfilter的配置不存在任何問題,因爲他們在登錄的時候,需要選擇對應的database。
但是對於那些不要登錄的用戶來說(如:module中的 portal, website),Odoo就需要知道使用哪個database的數據來顯示website page。如果沒有使用Odoo的多租戶系統,那就沒問題,因爲只存在一個數據庫實例。但是如果有多個數據庫實例,就需要一些東西來幫助Odoo理解使用哪個數據庫了。
這也就是--db-filter參數存在的意義了。通過配置這個參數,Odoo可以針對hostname來決定使用哪一個數據庫裏面的數據。參數的值爲一個正則表達式,可以使用%h%d來代替hostname和domain。
生產環境中,如果有多個數據庫實例,尤其是website模塊安裝了的,一定要配置dbfilter,否則有很多特性都不能使用。

配置樣例

  • 只顯示名字以'mycompany' 開頭的數據庫

/etc/odoo.conf中,

[options]
dbfilter = ^mycompany.*$
  • 只顯示名字與www之後子域名匹配的數據庫,比如在域名爲www.mycompany.commycompany.co.uk中,mycompany數據庫會被顯示,而在域名www2.mycompany.comhelpdesk.mycompany.com中不會顯示

/etc/odoo.conf中:

[options]
dbfilter = ^%d$

提示:
配置一個合適的 --db-filter 對與系統安全是有一定幫助的。如果你的配置正確,並且這個dbfilter只有一個數據庫名字能滿足,那麼強烈推薦你使用--no-database-list參數,來隱藏所有數據庫的顯示和選擇。

PostgreSQL

默認情況下,PostgreSQL僅接受來自UNIX sockets和本地環路(也就是localhost)的連接。
如果你的Odoo和PostgreSQL泡在同一臺服務器上,那麼UNIX socket也是可以的,並且如果你沒指定pg host的情況下,默認使用的也就是unix socket。如果你的Odoo和PostgreSQL不再同一臺機器上,那麼就需要配置pg,使其接受網絡連接,方法如下:

  • 一種是,pg還是隻接受本地環路,但是在兩臺機器上使用 SSH tunnel,然後配置Odoo連接tunnel
  • 另一種,pg接受來自odoo機器的網路連接,然後配置odoo

配置樣例

  • 接受localhost上的tcp連接
  • 接受192.168.1.x網段的tcp連接

/etc/postgresql/9.5/main/pg_hba.conf中:

host all all 127.0.0.1/32 md5
host all all 192.168.1.0/24 md5

/etc/postgreql/9.5/main/postgresql.conf中:

listen_address = 'localhost,192.168.1.2'
port = 5432
max_connections = 80

配置Odoo

默認的,Odoo通過5432端口連接本地的PostgreSQL,可以通過配置db參數來覆蓋默認的配置。
如果使用deb或rpm包安裝的odoo,默認會創建一個odoo用戶來連接pg。

  • 數據庫的管理密碼爲admin_passwd配置項的值,在對數據庫進行修改操作時,會校驗此密碼,此密碼建議隨機生成一個。
  • 所有的數據庫操作,都會使用這些配置,在也需要連接postgresql的user有createdb的權限。
  • users可以刪除他們自己的db。如果想要在/web/database/manager界面中,使那些創建db的按鈕沒有效果,那麼連接pg的user就要no-createdb權限,並且沒有所有數據庫都要歸屬於不同的用戶。

警告: pg user不能爲superuser

配置樣例

  • 連接在192.168.1.2上的pg
  • 端口爲 5432
  • 使用odoo用戶連接數據庫
  • 密碼爲pwd
  • 只要數據庫名稱以‘mycompany’開頭的數據庫

/etc/odoo.conf中:

[options]
admin_passwd = mysupersecretpassword
db_host = 192.168.1.2
db_port = 5432
db_user = odoo
db_password = pwd
dbfilter = ^mycompany.*$

內建server

Odoo提供了內建的 HTTP servers,多進程和多線程的都有。
真實生產環境,建議使用多進程模式。

  • 開啓多進程服務,只需要配置一個非零的進程數即可,具體的進程數應當基於CPU的核數
  • 也可以對worker進行一定的限制,避免資源枯竭

警告:windows中多進程模式無法啓用

woker數量的計算

  • (#CPU * 2) + 1
  • Cron worker也需要CPU
  • 1個worker能支持大約6個併發用戶

內存的計算

  • 通常來說20%的請求比較重型,80%的請求比較簡單
  • 一個重型的worker大約 1GB的內存
  • 輕型的workder大約150MB的內存

需要的內存 = #worker * ( (0.8 * 150mb) + (0.2 * 1024mb) )

在線聊天

在多進程模式中,一個專門用於聊天的進程會自動啓動,並且監聽 longpolling port 默認8072端口。
所以,你必須配置一個反向代理,將/longpolling/的請求,轉至longpolling端口中。其他請求則轉移至正常的監聽端口

配置樣例

  • 一個4核8線程的服務器
  • 60個併發用戶
  • 60 / 6 = 10 <-(理論上,需要的worker數)
  • (4 * 2 ) + 1 = 9 <- (理論上,服務器支持的最大worker數)
  • 我們使用8個worker 外加 1個cron進程,也使用監聽系統來統計CPU load,看它是否處在 7 - 7.5之間。
  • RAM = 9 * ((0.8 * 150) + (0.2 * 1024)) ~= 3GB

/etc/odoo.conf 中:

[options]
limit_memory_hard = 1677721600
limit_memory_soft = 629145600
limit_request = 8192
limit_time_cpu = 600
limit_time_real = 1200
max_cron_threads = 1
workers = 8

HTTPS

odoo在提交信息時,使用的都是明文。所以爲了安全,HTTPS是很有必要的:

  • Odoo在反向代理之後,應當開啓Odoo的proxy mode
  • 設置SSL temination proxy (Nginx 樣例)
  • 設置轉移到odoo的代理 (Nginx 樣例)
  • 將http自動redirect到https

配置樣例

/etc/odoo.conf 中:

proxy_mode = True

/etc/nginx/sites-enabled/odoo.conf中:

#odoo server
upstream odoo {
 server 127.0.0.1:8069;
}
upstream odoochat {
 server 127.0.0.1:8072;
}

# http -> https
server {
   listen 80;
   server_name odoo.mycompany.com;
   rewrite ^(.*) https://$host$1 permanent;
}

server {
 listen 443;
 server_name odoo.mycompany.com;
 proxy_read_timeout 720s;
 proxy_connect_timeout 720s;
 proxy_send_timeout 720s;

 # Add Headers for odoo proxy mode
 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;

 # SSL parameters
 ssl on;
 ssl_certificate /etc/ssl/nginx/server.crt;
 ssl_certificate_key /etc/ssl/nginx/server.key;
 ssl_session_timeout 30m;
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
 ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
 ssl_prefer_server_ciphers on;

 # log
 access_log /var/log/nginx/odoo.access.log;
 error_log /var/log/nginx/odoo.error.log;

 # Redirect requests to odoo backend server
 location / {
   proxy_redirect off;
   proxy_pass http://odoo;
 }
 location /longpolling {
     proxy_pass http://odoochat;
 }

 # common gzip
 gzip_types text/css text/less text/plain text/xml application/xml application/json application/javascript;
 gzip on;
}

5. Odoo作爲一個普通的WSGI應用

把Odoo當做一個WSGI應用是可以的,它也提供了一個基本的樣例odoo-wsgi.example.py。如果要進行額外配置,建議複製這個文件,並且在odoo.tools.config進行修改,而不是使用命令行參數或修改配置文件。
如果這樣使用Odoo,那麼啓動的worker實例就是標準的HTTP服務,沒有cron worker和 livechat worker了。

5.1 Cron workers

這種情況,需要如下設置:
- 一個典型的Odoo進程(run via odoo-bin)
- 指定需要cron的db (via odoo-bin -d)
- 這個進程不應當處理來自網絡的請求,需要關閉網絡監聽,odoo-bin --no-xmlrpc 或者配置文件中xmlrpc = False

LiveChat

odoo作爲wsgi應用啓動,導致的第二問題就是,絕大部分HTTP請求都是簡短的,需要快速返回響應,並且處理另外的請求,但是LiveChat需要一個針對每一個人的long-lived connection,用來處理實時消息提醒。
這個與多進程模式的設計的相對立的,這種長連接將會阻塞進程,進而阻止其他用戶的連接。但是,livechat的請求相當簡單,進程大部分時間都只是在等待而已。
所以解決這個問題的方法就是下列之一:
- 部署一個線程模式的Odoo,然後反向代理只把/longpolling/的請求轉發到這個Odoo中,這種方式也順便解決了Cron worker的問題,一舉兩得
- 或者,使用odoo-bin gevent 啓動Odoo, 然後反向代理也只把/longpolling/的請求轉發給它。

靜態文件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章