欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Odoo部署

程序员文章站 2022-06-11 09:12:04
...

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/的请求转发给它。

静态文件