本文中将学习将 Odoo 服务器做为生产环境的基本准备。安装和维护服务器是一个复杂的话题,应该由专业人员完成。本文中所学习的不足以保证普通用户建立应对包含敏感数据和服务的健壮、安全环境。javascript
本文旨在介绍 Odoo 部署的重要配置和最佳实践,这样系统管理员能够更好地准备 Odoo 服务器主机。经过本文的学习,咱们将能建立一个相对安全的 Odoo 服务器,足够应对普通的生产环境使用。本文所述并不是部署 Odoo 的惟一方法,其它的方法也会一样适用。css
本文主要内容有:html
本章无需使用前面开发的代码,相关代码和脚本请见 GitHub 仓库。java
Odoo 有 Debian 或 Ubuntu的安装包,使用它能够实现工做服务进程以及在系统启动时自动开启服务。安装过程按步骤便可,在https://nightly.odoo.com/上能够找到相关信息。上面还有CentOS的rpm文件以及 Windows 的.exe 安装包。node
虽然这样安装 Odoo 很容易也很方便,大多数人倾向于部署和运行版本控制的源码来进行集成。这样能更好地控制部署内容,而且在生产环境中也更易于管理代码的变动和修复。python
使用Debian发行版时,默认登陆用户为带有管理员权限的 root,这时命令行显示的为#。在Ubuntu系统中,禁用了 root 帐号,在安装时配置的初始用户可经过 sudo 来运行 root 权限的命令。首先咱们应更新包索引,而后执行升级来确保全部安装的程序是最新的,命令以下:nginx
1
2
|
sudo apt update
sudo apt upgrade -y
|
下一步,咱们将安装PostgreSQL数据库,并让当前用户成为数据库超级用户,命令以下:git
1
2
|
sudo apt install postgresql -y
sudo su -c "createuser -s $USER" postgres
|
咱们将经过源码运行 Odoo,但在那以前,咱们须要安装所需依赖。如下是所需的Debian包:github
1
2
|
sudo apt-get install git python3-dev python3-pip -y
sudo apt install build-essential libxslt-dev libzip-dev libldap2-dev libsasl2-dev libssl-dev -y
|
还应记得安装打印报表所需的wkhtmltox,命令以下:web
1
2
3
|
wget "https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.5/wkhtmltox_0.12.5-1.xenial_amd64.deb" -O /tmp/wkhtml.deb
sudo dpkg -i /tmp/wkhtml.deb
sudo apt-get -fy install # 处理依赖错误
|
注意安装包时可能报依赖错误,像这里最一条命令会强制这些依赖的安装并正确完成安装。
1
2
3
4
5
6
|
# 错误信息
...
dpkg: error processing package wkhtmltox (--install):
dependency problems - leaving unconfigured
Errors were encountered while processing:
wkhtmltox
|
如今咱们就只缺乏 Odoo 所须要的 Python 包了,它们大多数都有Debian或Ubuntu系统包。官方Debian安装包使用到这些,可在Odoo 源码debian/control文件中找到这些包名。可是这些 Python 依赖也能够经过PyPI(Python Package Index)直接安装。所要求的包和一般基于 Python 的项目同样在 Odoo 的requirements.txt文件中。咱们可使用以下命令安装这些包:
1
2
|
wget https://raw.githubusercontent.com/odoo/odoo/12.0/requirements.txt
sudo -H pip3 install -r requirements.txt
|
在Ubuntu 18.04中,最后一条命令可能会打印了红色的警告,内容是PyYAML 和pySerial的卸载,这在系统中经过包安装了老版本时会发生。这种警告能够安全的略过。
既然咱们有了全部的依赖,安装了数据库服务、系统包和 Python 包,咱们就能够安装 Odoo 了。
从安全角度建议使用独立的用户运行 Odoo,这一用户不带有任何系统的特权。为此咱们须要建立系统和数据库用户,使用命令以下:
1
2
3
|
sudo adduser --disabled-password --gecos "Odoo" odoo
sudo su -c "createuser odoo" postgres
createdb --owner=odoo odoo-prod
|
以上odoo 为用户名,odoo-prod用于运行 Odoo 实例的数据库名。odoo用户成为了odoo-prod数据库的全部者。也就说它对该数据库有建立和删除的权限,包括删除整个数据库的权限。若是你运行的是多租户服务器,应为每一个租户建立一个相似 odoo 的指定系统用户。
小贴士:Odoo的设计即便在系统用户不是数据库全部者时也能够正确运行。但这可能会让设置变复杂,而且固化安全的好习惯是有一个主系统用户做为数据库的全部者、为每一个实例建立一个指定的不带有超级用户权限的系统用户来运行服务。
注意这些是没有管理权限的普通用户,新建系统用户时会自动建立一个家目录。好比/home/odoo,用户可经过~快捷符号来表示本身的家目录。咱们在用户 Odoo 对应的配置和文件中会使用到它。咱们可使用以下命令来以该用户打开一个会话:
1
2
|
sudo su odoo
exit
|
exit命令终止会话并回到原用户。
要不了多久,你的服务就会须要升级、打补丁。这时版本控制仓库会颇有帮助。咱们使用 git来从仓库中获取代码,就像咱们在安装开发环境时的操做同样。下面我将使用 odoo 用户并将代码下载家目录中:
1
2
|
sudo su odoo
git clone https://github.com/odoo/odoo.git /home/odoo/odoo-12 -b 12.0 --depth=1
|
-b 选项确保获取的是正确的分支,–depth=1选项会忽略修改历史并仅获取最新修订的代码,这样下载内容更精简,速度也更快。
小贴士:git在管理 Odoo 部署版本时是一个很是有价值的工具。注意本系列文章中仅仅涉及到代码版本管理的冰山一角。想要更加熟悉 git,值得花时间进一步学习,可从http://git-scm.com/doc开始。
到此为止,咱们应该已经拥有源码安装 Odoo 的全部内容。可经过以下命令以指定用户会话检查是否正确启动并退出:
1
2
3
|
$ /home/odoo/odoo-12/odoo-bin --version
Odoo Server 12.0
$ exit
|
下面咱们将设置一些在系统中使用的系统级别的文件和目录。
在启动 Odoo 服务时添加–save参数会将配置保存到~/.odoorc文件中。咱们将以这个文件做为服务配置的初始文件,将其保存到/etc/odoo下,使用命令以下:
1
|
sudo su -c "~/odoo-12/odoo-bin -d odoo-prod --db-filter='^odoo-prod$' --without-demo=all -i base --save --stop-after-init" odoo
|
这行命令中也会包含服务实例所使用的配置参数。
小贴士:老版本中的.openerp_serverrc配置文件还被支持,找到后会进行使用。若是安装 Odoo 10或以后版本的服务器上同时还安装了老版本的 Odoo,可能会引发混淆。这时你会发现–save选项没有更新.odoorc,而是更新了.openerp_serverrc文件。
下一步咱们须要将配置文件放到系统的配置文件目录/etc 下,命令以下:
1
2
3
4
|
sudo mkdir /etc/odoo
sudo cp /home/odoo/.odoorc /etc/odoo/odoo.conf
sudo chown -R odoo /etc/odoo
sudo chmod u=r,g=rw,o=r /etc/odoo/odoo.conf # 安全加固使用
|
以上命令最后一行是可选的,但它提高了系统的安全性。它确保运行 Odoo 进程的用户能够读取但没法修改配置文件。这时你将没法修改数据库主密码,但在生产服务下这不是什么问题,由于应使用list_db=False服务配置来禁用网页数据库管理员。咱们还需为 Odoo 服务建立一个存储日志文件的目录。这一般放在/var/log目录下,命令以下:
1
2
|
sudo mkdir /var/log/odoo
sudo chown odoo /var/log/odoo
|
如今让咱们经过以下命令编辑配置文件并确保已配置了一些重要参数:
1
|
sudo nano /etc/odoo/odoo.conf
|
如下是大部分重要参数的推荐值:
1
2
3
4
5
6
7
8
9
10
11
|
[options]
addons_path = /home/odoo/odoo-12/odoo/addons,/home/odoo/odoo-12/addons
admin_passwd = False
db_name = odoo-prod
dbfilter = ^odoo-prod$
http_port = 8069
list_db = False
logfile = /var/log/odoo/odoo-server.log
proxy_mode = True
without_demo = all
workers = 6
|
下面逐一讲解:
ℹ️Odoo 10中引入http_port参数来替代老版本中使用但如今已淘汰了的xmlrpc_port参数。
从安全角度看,admin_passwd=False和list_db=False选项尤其重要。它们屏蔽掉对数据库管理功能的网页端访问,在生产环境和面向外网的 Odoo 服务中都应进行设置。
如下也是会用到的参数:
咱们可经过-c或–config选项来检查运行服务的设置:
1
|
sudo su -c "~/odoo-12/odoo-bin -c /etc/odoo/odoo.conf" odoo
|
经过上述设置运行 Odoo 不会在终端中有任何输出,由于修改都写到了配置文件中定义的日志文件中了。要追踪服务的操做,咱们须要在终端中运行以下命令:
1
|
sudo tail -f /var/log/odoo/odoo-server.log
|
有时可能会须要将日志输出到标准输出中,最好的方法是复制一份不带logfile选项的配置文件。
小贴士:要在同一个终端窗口中运行多个终端会话,可使用tmux这样的应用或者GNU Screen。可使用Byobu,它基于GNU Screen或Tmux提供了好看的用户界面。
生产实例可能会处理大量的工做负载。默认服务运行单进程并只能使用CPU 的一个核心来处理请求,这是由于Python语言的全局解释器锁(GIL)。可是可以使用多进程模式来处理并发请求,来充分利用多核的优点。workers=N选项设置使用的工做进程数,做为一个参照,可设置为1+2*P,其中 P为处理器的核数。最佳设置须要根据具体状况进行调优,由于这取决于服务器的负载以及多少其它像PostgreSQL这样大负载服务在运行。
为负载将workers设置高比低好,最低值应为6,由于这是大多数浏览器的并行链接数,最大值一般受服务器的 RAM 所限。普通使用模式的经验是,Odoo服务应能处理(1+2*P)*6个并发用户。
还有一些limit-配置参数可用于调优工做进程。在达到这些值时工做进程会被回收,相应的进程会中止并启动一个新进程。这能够防止服务器内存溢出以及防止某一进程过分使用服务器资源。
官方文档中对工做进程参数调优也给出了一些很好的建议,欲知详情,请参照官方文档Odoo 部署。
如今咱们须要将 Odoo 设为系统服务,并在系统启动时自动开启。
在Ubuntu或Debian中,init程序负责服务的启动。Debian或其分支操做系统曾使用过sysvinit,Ubuntu曾使用过兼容的名为Upstart的启动程序。但最近都进行了修改,最新的Debian和Ubuntu发行版的init程序都使用了systemd。这表示如今有两种方式来安装系统服务,你须要根据操做系统的版原本选择正确的方法。Ubuntu 16.04或以后的版本中应使用systemd,可是不少云服务商还在使用更早的版本,因此颇有可能你也会使用到这些老版本。要检查系统中是否使用systemd,可以使用以下命令:
1
|
man init
|
这条命令会打印当前使用的 init 程序的文档,而后就能够查看所使用的启动服务。
ℹ️Window的子系统(WSL) 中的 Ubuntu环境仅适用于开发,它有可能发生些异常问题,彻底不适合用于运行生产环境。在写本文时,man init显示启动服务为systemd,但并不能安装systemd服务,反而安装sysvinit服务时是正常的。
补充:如出现-bash: man: command not found,则经过sudo apt install man -y来执行安装
若是你使用的是较近的操做系统,如Debian 8或Ubuntu 16.04,你的启动服务就应该是systemd。要在系统中添加服务,只需建立一个描述服务的文件。咱们建立/lib/systemd/system/odoo.service文件并加入以下内容:
1
2
3
4
5
6
7
8
9
10
11
12
|
[Unit]
Description=Odoo
After=postgresql.service
[Service]
Type=simple
User=odoo
Group=odoo
ExecStart=/home/odoo/odoo-12/odoo-bin -c /etc/odoo/odoo.conf
[Install]
WantedBy=multi-user.target
|
小贴士:Odoo源码中在debian/下包含一个odoo.service文件示例。你能够不用新建方件,直接把拷贝该文件而后进行所需修改。至少须要根据设置来修改ExecStart选项。
下一步咱们须要使用以下命令来注册这个新服务:
1
|
sudo systemctl enable odoo.service
|
使用以下命令启动该服务:
1
|
sudo systemctl start odoo
|
使用以下命令检查该服务状态:
1
|
sudo systemctl status odoo
|
最后,如需中止服务,请使用以下命令:
1
|
sudo systemctl stop odoo
|
若是你使用更老的操做系统,如Debian 7或Ubuntu 15.04,那么颇有可能须要使用sysvinit或Upstart启动服务。就建立系统服务而言,二者的做用一致。一些虚拟专用服务器(VPS)服务还在使用老的Ubuntu镜像,因此在碰到这种状况时能够经过如下方式部署Odoo服务。
Odoo源码中有一个init脚本用于Debian发行包,咱们仅需作一些小修改来使用它建立启动服务:
1
2
|
sudo cp /home/odoo/odoo-12/debian/init /etc/init.d/odoo
sudo chmod +x /etc/init.d/odoo
|
如今你可能须要查看一下init脚本的内容,主要的参数都在文件上方定义的变量中,以下例所示:
1
2
3
4
5
6
7
8
|
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
DAEMON=/usr/bin/odoo
NAME=odoo
DESC=odoo
CONFIG=/etc/odoo/odoo.conf
LOGFILE=/var/log/odoo/odoo-server.log
PIDFILE=/var/run/${NAME}.pid
USER=odoo
|
这些变量应该足够使用了,接下来咱们将使用它们的默认值进行设置,但你能够根据本身的须要进行修改。变量USER是运行服务的系统用户,咱们前面已经建立了一个odoo用户。变量DAEMON是可执行服务的路径,咱们启动 Odoo 的文件在不一样的路径下,但可建立如下软连接:
1
2
|
sudo ln -s /home/odoo/odoo-12/odoo-bin /usr/bin/odoo
sudo chown -h odoo /usr/bin/odoo
|
变量CONFIG是咱们须要使用的配置文件。在前面一节中,咱们在默认配置的路径/etc/odoo/odoo.conf下建立了配置文件。最后变量LOGFILE是存储日志文件的路径。配置的路径/var/log/odoo咱们在定义配置文件时进行了建立。
如今咱们应该能够像下面这样来启动和关闭 Odoo 服务了:
1
2
|
$ sudo /etc/init.d/odoo start
Starting odoo: ok
|
关闭服务方法类似,命令以下:
1
2
|
$ sudo /etc/init.d/odoo stop
Stopping odoo: ok
|
Ubuntu中可以使用 service 命令:
1
2
3
|
sudo service odoo start
sudo service odoo status
sudo service odoo stop
|
如今咱们须要在系统启动时自动开启服务,经过以下命令实现:
1
|
sudo update-rc.d odoo defaults
|
这时,重启服务器 Odoo 服务就会正常地自动启动了。是时候测试下一切是否都如预期同样了。
如今咱们能够肯定Odoo实例是否运行以及是否能正常对请求进行响应。若是Odoo正常运行,咱们应该能够获得响应而且日志文件中不会报错。在服务器上经过以下命令可检测 Odoo 是否对HTTP请求进行响应:
1
2
|
curl http://localhost:8069
<html><head><script>window.location = '/web' + location.hash;</script></head></html>
|
此外经过以下命令可查看日志文件的内容:
1
|
sudo less /var/log/odoo/odoo-server.log
|
你还可使用tail -f 来实时查看日志文件中新增的内容:
1
|
sudo tail -f /var/log/odoo/odoo-server.log
|
虽然 Odoo 自身能够输出网页,但强烈建议在其上加一层反向代理。反向代理做为一个中间层来管理客户端所发送请求以及 Odoo 服务做出响应之间的数据流。使用反向代理有诸多好处。
从安全角度考虑,有如下几点:
而后从性能角度考虑,反向代理可提供以下显著的改进:
Apache是在考虑反向代理时的一个经常使用选择,Nginx 是近期在技术圈被热议的对其的替代。此处咱们使用Nginx做为反向代理,并展现如何使用它来实现上述讨论的安全和性能方面的功能。
首先,咱们应当安装Nginx,咱们须要它监听默认的HTTP端口,因此须要确保没有被其它服务所占用。执行以下命令应该会报错:
1
2
|
$ curl http://localhost
curl: (7) Failed to connect to localhost port 80: Connection refused
|
若是没有收到错误,应当禁用相应服务来让Nginx使用该端口。例如,关闭已有的Apache服务,使用sudo service apache2 stop。更好的选择是从服务器上删除该服务或从新配置让其监听其它端口,这样Nginx就能够正常使用HTTP和HTTPS端口(80 and 443) 了。
一旦完成上述操做,就能够安装Nginx了:
1
2
|
sudo apt-get install nginx -y
sudo service nginx start # 如还没有启动,启动Nginx服务
|
要肯定Nginx是否正确运行,经过浏览器访问或在服务上执行curl http://localhost应该能够获得一个Welcome to nginx页面。
Nginx配置文件和Apache的方式基本相同,存储在/etc/nginx/available-sites/中,并可经过在/etc/nginx/enabled-sites/中添加软连接来激活。注意应同时关闭Nginx安装时默认带有的配置:
1
2
3
|
sudo rm /etc/nginx/sites-enabled/default
sudo touch /etc/nginx/sites-available/odoo
sudo ln -s /etc/nginx/sites-available/odoo /etc/nginx/sites-enabled/odoo
|
使用nano或vi等编辑器来编辑 Nginx配置文件:
1
|
sudo nano /etc/nginx/sites-available/odoo
|
一个基本的针对Odoo服务的Nginx配置文件以下例所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
upstream odoo {
server 127.0.0.1:8069;
}
upstream odoochat {
server 127.0.0.1:8072;
}
server {
listen 80;
# 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;
# log
access_log /var/log/nginx/odoo.access.log;
error_log /var/log/nginx/odoo.error.log;
# Redirect longpoll requests to odoo longpolling port
location /longpolling {
proxy_pass http://odoochat;
}
# Redirect requests to odoo backend server
location / {
proxy_redirect off;
proxy_pass http://odoo;
}
# common gzip
gzip_types text/css text/scss text/plain text/xml application/xml application/json application/javascript;
gzip on;
}
|
补充:添加域名请在server 配置区内添加对 server_name 的配置
首先为Odoo服务添加了upstream配置,监听了默认端口8069和8072。8069用于网页客户端和RPC请求,8072用于多进程时 Odoo 实时消息所需的长轮询(long polling)请求。
Nginx应在默认HTTP端口80上接收访问流量,而后重定向到upstream odoo服务中。这在server配置区中进行了定义。/longpolling 地址的访问流量会传递到upstream odoochat,剩余的流量则传递到upstream odoo。这里咱们还添加了一些请求头的信息,这样 Odoo 后台服务就会知道这些是通过代理的流量。
出于安全考虑,应确保proxy_mode参数设为True。这是由于在Nginx做为代理时,全部的请求都会认为是来自本地而不是远程 IP 地址。在代理中设置X-ForwardedFor头以及启动–proxy-mode可解决这一问题。可是,若是不在代理级别强制header就启用–proxy-mode 会让其余人能够假装远程地址。
在配置文件的最后,能够看到两条gzip相关的命令,它们用于对一些文件进行压缩,提高性能。可经过以下命令测试配置是否正确:
1
2
3
|
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
|
若是出现错误,请检查配置文件中输入是否正确。常见的问题是默认的HTTP被其它服务所占用,如Apache或默认的Nginx网站,因此在重启Nginx服务前先经过本文中的命令确保并无这种问题。在完成处理后,可以使用以下命令从新加载新的配置:
1
|
sudo /etc/init.d/nginx reload
|
若是操做系统使用的是systemd,上述命令正确的版本应该是:
1
|
sudo systemctl reload nginx
|
经过以下命令可确认 Nginx 是否将访问流量重定向到了后台Odoo服务中:
1
2
|
$ curl http://localhost
<html><head><script>window.location = '/web' + location.hash;</script></head></html>
|
网站数据不该在因特网中以普通文件进行传输,在将Odoo网页服务暴露在网络中时,咱们应使用HTTPS协议来对数据进行加密。有时可以使用自签署证书。但注意自签署证书可能会带来安全风险,好比中间人攻击(Man-in-the-Middle Attack),所以有些浏览器会不接受该证书。
更健壮的解决方案是使用认证的证书机构所签署的证书,在运行商业或电商网站时这就尤其重要了。
小贴士:Let’s Encrypt服务提供免费的证书。Odoo 有现存插件模块处理对Odoo服务SSL证书的自动请求,但在写本文时,还未移植到Odoo 12中,可访问 GitHub 进一步了解。
下一步,咱们应安装证书来启用SSL。建立一个自签署证书,可以使用以下命令:
1
2
3
4
|
$ sudo mkdir /etc/ssl/nginx && cd /etc/ssl/nginx
$ sudo openssl req -x509 -newkey rsa:2048 -keyout server.key -out server.crt -days 365 -nodes
$ sudo chmod a-wx * # make files read only
$ sudo chown www-data:root * # access only to www-data group
|
上述命令建立一个/etc/ssl/nginx目录以及不带密码的自签署SSL证书。在运行openssl命令时,会要求用户输入其它信息,而后会生成一个证书和密钥文件。最后,将这些文件的全部权赋予用于运行网页服务的www-data用户。
既然咱们已经有了SSL证书,就能够配置 Nginx 来使用它了。要强制使用HTTPS,须要将全部的 HTTP 访问重定向到HTTPS。将前面的server区中替换为以下内容:
1
2
3
4
|
server {
listen 80;
rewrite ^(.*) https://$host$1 permanent;
}
|
如今,若是从新加载Nginx配置并在浏览器中访问服务的话,将会看到http://地址被转换成了https:// 地址。但该地址不会返回任何内容,咱们须要正确地配置HTTPS服务,可经过添加以下服务器配置来实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
server {
listen 443;
# 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-GCMSHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSAAES128-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:DHEDSS-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 longpoll requests to odoo longpolling port
location /longpolling {
proxy_pass http://odoochat;
}
# Redirect requests to odoo backend server
location / {
proxy_redirect off;
proxy_pass http://odoo;
}
# common gzip
gzip_types text/css text/scss text/plain text/xml application/xml application/json application/javascript;
gzip on;
}
|
以上配置代码会监听HTTPS端口并使用/etc/ssl/nginx/ 证书文件来对数据进行加密。这与咱们在设置 Nginx 反向代理中看到的server 配置区类似。若是从新加载配置,咱们的 Odoo 服务将经过HTTPS进行运做,如如下命令所示:
1
2
3
4
5
6
7
8
|
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$ sudo service nginx reload # or: sudo systemctl reload nginx
* Reloading nginx configuration nginx
...done.
$ curl -k https://localhost
<html><head><script>window.location = '/web' + location.hash;</script></head></html>
|
最后部分的输入可用于确认Odoo客户端正经过HTTPS进行访问。
小贴士:在更早的Odoo镜像中,PosBox仅在HTTP模式下生效,这就须要在 Nginx 中添加对/pos/ 连接的例外处理。Odoo 10及以后的镜像中包含了自签署证书来让PosBOx和IoT Box可经过HTTPS进行通信,这一修改在 GitHub 中引入。
咱们能够配置 Nginx 来缓存服务端静态文件,这样再次请求时就能够访问Nginx 中的缓存,而无需将请求传递到upstream odoo服务中。启用静态内容缓存可带来更快的响应时间并减小 Odoo 服务的工做负载。要启用这一设置,在location /longpolling区以前加入以下代码:
1
2
3
4
5
6
7
|
# cache static data
location ~* /web/static/ {
proxy_cache_valid 200 60m;
proxy_buffering on;
expires 864000;
proxy_pass http://odoo;
}
|
经过这一些命令,静态数据就能够缓存60分钟了。在这个期间的其它请求Nginx 会直接使用缓存进行响应。
一旦 Odoo 服务运行了一段时间,就会须要对其进行升级。这包括两个步骤:获取服务或模块的新版本、执行安装。
若是你按照经过源码安装 Odoo一节正确地进行了安装,应该就能够在暂存区仓库中获取并测试新版本源码。强烈建议建立一个生产环境数据库的拷贝,并使用它进行升级测试。若是odoo-prod是咱们的生产环境数据库,可经过以下命令建立一个拷贝odoo-stage:
1
2
3
4
5
6
7
|
dropdb odoo-stage
createdb --owner=odoo odoo-stage
pg_dump odoo-prod | psql -d odoo-stage
sudo su odoo
cd ~/.local/share/Odoo/filestore/
cp -al odoo-prod odoo-stage # create filestore hardlinks
exit
|
在使用以上数据库拷贝以前,应进行清理,好比中止计划动做、关闭 email 服务(包含发送和接收消息)。根据你的设置来执行这些指定步骤,但一般可以使用自动化脚原本执行。记住psql可用于在命令行直接执行SQL命令,如psql -d odoo-stage -c “<SQL命令>”。
小贴士:可经过createdb命令来更快地建立拷贝:createdb –owner=odoo –template=odoo-prod odoo-stage。但须要说明的是要运行该命令,不能有任何对odoo-prod数据库的链接,所以须要中止Odoo生产环境的服务。
咱们使用git pull 命令来从GitHub仓库获取最新的Odoo源码。在那以前,咱们可使用git tag命令来为当前使用的提交建立一个标签,这样能够可容易的对更新进行撤销,命令以下:
1
2
3
4
|
sudo su odoo
cd ~/odoo-12
git tag --force 12-last-prod
git pull
|
要让代码修改生效,咱们须要重启Odoo服务。而要使用数据文件的修改生效,须要对模块进行升级。一般对Odoo稳定版本的修改都是代码的修复,所以无需冒险执行模块升级。若是须要对模块升级,可以使用-u <module>附加参数,或者是-u base,它将升级全部模块。
如今能够启动Odoo的分阶服务了,它将使用在分阶数据库上使用升级代码:
1
2
|
~/odoo-12/odoo-bin -d odoo-stage --http-port=8080 -c /etc/odoo/odoo.conf # optionally add: -u base
exit
|
Odoo 分阶服务经过在8080端口上进行配置。可经过浏览器访问http://xxx:8080来检查升级代码是否正确运做。若是出现了错误,可经过以下命令来返回上一个版本:
1
2
3
4
|
sudo su odoo
cd ~/odoo-12
git checkout 12-last-prod
exit
|
若是一切运行都如预期,则可安全地执行生产环境服务的升级,一般是经过重启来实现。若是想要执行实际的模块升级,建议的方法是中止服务、运行升级、再重启服务,命令以下:
1
2
3
|
sudo service odoo stop
sudo su -c "~/odoo-12/odoo-bin -c /etc/odoo/odoo.conf -u base --stop-after-init" odoo
sudo service odoo start
|
记住对在用Git 版本进行记录,可经过 git checkout回到修改前,这让咱们能够在须要的时候进行回滚。强烈推荐在执行数据库升级前保存备份。在完成以后,可以使用 Git 拉取新的版本到生产仓库并完成升级:
1
2
3
4
5
6
|
sudo su odoo
cd ~/odoo-12
git tag --force 12-last-prod
git pull
exit
sudo service odoo restart # or: sudo systemctl restart odoo
|
无需频繁进行升级,但也不建议等上一年再进行升级。每几个月进行一次升级。还要记得重启服务来启用代码升级,但对模块升级则并不是如此。但若是须要进行指定的漏洞修复,能够更早的进行升级。还应关注公开渠道对 Odoo 安全漏洞的披露,发 GitHub 上 Odoo 的Issues,具体可查看Security标签,或者是官方的邮件列表,可经过https://www.odoo.com/groups进行订阅。
做为一项服务,企业版用户会更早地收到邮件通知来警报这一类问题。
在本文中,咱们学习了在Debian系生产服务器中设置和运行 Odoo 所需的其它步骤。咱们一块儿了解了配置文件中最重要的设置项,并学习了如何擅用多进程模式。为提高安全性和扩展性,咱们还学习了如何使用 Nginx 来做为 Odoo 服务处理之上的反向代理。
本文涵盖了运行 Odoo 服务并向用户提供稳定、安全服务的基础知识。要更多地了解 Odoo,可参考官方文档。其中更深刻的讲解了一些课题,并包含了一些本系列文章未涉及的课题。
还有一些有关 Odoo 的出版图书还助于你的学习。Packt Publishing中有一些相关书籍,具体来讲Odoo Development Cookbook包含了本系列文章未讨论到的高级课题。
最后,Odoo是一个拥有活跃社区的开源产品。参与、提问并回馈社区不只有助于学习,还有助于创建人脉。说到这,就不能不提 Odoo 社区联盟(OCA),它倡导协做并提供高质量的开源代码,可访问https://odoo-community.org/作更进一步了解。
如下Odoo官方文档的内容可做为本文讨论课程的补充材料,来帮助获取额外的参考: