本文中将学习将 Odoo 服务器作为生产环境的基本准备。安装和维护服务器是一个复杂的话题,应该由专业人员完成。本文中所学习的不足以保证普通用户创建应对包含敏感数据和服务的健壮、安全环境。

本文旨在介绍 Odoo 部署的重要配置和最佳实践,这样系统管理员可以更好地准备 Odoo 服务器主机。通过本文的学习,我们将能创建一个相对安全的 Odoo 服务器,足够应对普通的生产环境使用。本文所述并非部署 Odoo 的唯一方法,其它的方法也会同样适用。

本文主要内容有:

  • 通过源码安装 Odoo,主要包含:
    • 安装依赖
    • 准备一个独立的系统用户
    • 通过源码安装
    • 设置配置文件
    • 多进程
  • 设置 Odoo 为系统服务,主要包含:
    • 创建 systemd 服务
    • 创建自启动或 sysvinit 服务
    • 通过命令行查看 Odoo 服务
  • 设置 Nginx 反向代理
  • 配置HTTPS安全服务, 主要包含 :
    • 创建自签名SSL证书
    • 在 Nginx 上配置 HTTPS访问
    • 缓存静态内容
  • 服务器和模块更新,主要包含:
    • 创建模拟环境
    • 更新 Odoo 源码

通过源码安装 Odoo

Odoo 有 Debian 或 Ubuntu的安装包,使用它可以实现工作服务进程以及在系统启动时自动开启服务。安装过程按步骤即可,在https://nightly.odoo.com/上可以找到相关信息。上面还有CentOS的rpm文件以及 Windows 的.exe 安装包。

虽然这样安装 Odoo 很容易也很方便,大多数人倾向于部署和运行版本控制的源码来进行集成。这样能更好地控制部署内容,并且在生产环境中也更易于管理代码的变更和修复。

安装依赖

使用Debian发行版时,默认登录用户为带有管理员权限的 root,这时命令行显示的为#。在Ubuntu系统中,禁用了 root 账号,在安装时配置的初始用户可通过 sudo 来运行 root 权限的命令。首先我们应更新包索引,然后执行升级来确保所有安装的程序是最新的,命令如下:

sudo apt update
sudo apt upgrade -y

下一步,我们将安装PostgreSQL数据库,并让当前用户成为数据库超级用户,命令如下:

sudo apt install postgresql -y
sudo su -c "createuser -s $USER" postgres

我们将通过源码运行 Odoo,但在那之前,我们需要安装所需依赖。以下是所需的Debian包:

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,命令如下:

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 # 处理依赖错误

注意安装包时可能报依赖错误,像这里最一条命令会强制这些依赖的安装并正确完成安装。

# 错误信息
...
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文件中。我们可以使用如下命令安装这些包:

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,这一用户不带有任何系统的特权。为此我们需要创建系统和数据库用户,使用命令如下:

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 对应的配置和文件中会使用到它。我们可以使用如下命令来以该用户打开一个会话:

sudo su odoo
exit

exit命令终止会话并回到原用户。

源码安装

要不了多久,你的服务就会需要升级、打补丁。这时版本控制仓库会很有帮助。我们使用 git来从仓库中获取代码,就像我们在安装开发环境时的操作一样。下面我将使用 odoo 用户并将代码下载家目录中:

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 的所有内容。可通过如下命令以指定用户会话检查是否正确启动并退出:

$ /home/odoo/odoo-12/odoo-bin --version
Odoo Server 12.0
$ exit

下面我们将设置一些在系统中使用的系统级别的文件和目录。

设置配置文件

在启动 Odoo 服务时添加–save参数会将配置保存到~/.odoorc文件中。我们将以这个文件作为服务配置的初始文件,将其保存到/etc/odoo下,使用命令如下:

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 下,命令如下:

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目录下,命令如下:

sudo mkdir /var/log/odoo
sudo chown odoo /var/log/odoo

现在让我们通过如下命令编辑配置文件并确保已配置了一些重要参数:

sudo nano /etc/odoo/odoo.conf

以下是大部分重要参数的推荐值:

[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

下面逐一讲解:

  • addons_path是一组逗号分隔的用于查找插件模块的路径。读取顺序为从左到右,最左边目录的优先级最高。
  • admin_passwd是访问网页客户端数据库管理功能的主密码。一定要设置复杂的密码,或者最好是设为 False来关闭这一功能。
  • db_name是在服务启动时初始化的数据库实例。
  • dbfilter用于过滤可访问的数据库,它是一个 Python 解释的正则表达式。为使用户无需弹出窗口选择数据库,并使未经身份验证的 URL 可正常运作,应设置为^dbnamedbfilter=odooprod,比如dbfilter=^odoo-prod。它支持%h和%d占位符,由 HTTP 请求主机名和子域名进行替换。
  • http_port是服务器监听的端口号,默认使用的是8069
  • list_db = False在 RPC级别和 UI 上屏蔽数据库列表,并屏蔽数据库管理界面以及相应的 RPC 功能。
  • logfile是服务日志写入的位置。对于系统服务,一般位于/var/log文件夹内。如果留空,日志会转而在标准输出中打印。
  • proxy_mode在需要反向代理访问时应设为True,我们需要用到反向代理。
  • without_demo在生产环境中应进行设置,这样新建的数据库中不会带有演示数据。
  • workers的值在大于等于2时启用多进程,一会儿我们会进一步的讨论。

ℹ️Odoo 10中引入http_port参数来替代老版本中使用但现在已淘汰了的xmlrpc_port参数。

从安全角度看,admin_passwd=False和list_db=False选项尤为重要。它们屏蔽掉对数据库管理功能的网页端访问,在生产环境和面向外网的 Odoo 服务中都应进行设置。

以下也是会用到的参数:

  • data_dir是会话数据和附件存储的路径,记住将备份放在这里
  • http_interface设置监听的地址。默认监听0.0.0.0,但在使用反向代理时应设置为127.0.0.1来仅响应本地请求。Odoo 11中引入它来代替淘汰了的xmlrpc_interface参数。

我们可通过-c或–config选项来检查运行服务的设置:

sudo su -c "~/odoo-12/odoo-bin -c /etc/odoo/odoo.conf" odoo

通过上述设置运行 Odoo 不会在终端中有任何输出,因为修改都写到了配置文件中定义的日志文件中了。要追踪服务的操作,我们需要在终端中运行如下命令:

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 为系统服务

现在我们需要将 Odoo 设为系统服务,并在系统启动时自动开启。

在Ubuntu或Debian中,init程序负责服务的启动。Debian或其分支操作系统曾使用过sysvinit,Ubuntu曾使用过兼容的名为Upstart的启动程序。但最近都进行了修改,最新的Debian和Ubuntu发行版的init程序都使用了systemd。这表示现在有两种方式来安装系统服务,你需要根据操作系统的版本来选择正确的方法。Ubuntu 16.04或之后的版本中应使用systemd,但是很多云服务商还在使用更早的版本,所以很有可能你也会使用到这些老版本。要检查系统中是否使用systemd,可使用如下命令:

man init

这条命令会打印当前使用的 init 程序的文档,然后就可以查看所使用的启动服务。

ℹ️Window的子系统(WSL) 中的 Ubuntu环境仅适用于开发,它有可能发生些异常问题,完全不适合用于运行生产环境。在写本文时,man init显示启动服务为systemd,但并不能安装systemd服务,反而安装sysvinit服务时是正常的。

补充:如出现-bash: man: command not found,则通过sudo apt install man -y来执行安装

创建systemd服务

如果你使用的是较近的操作系统,如Debian 8或Ubuntu 16.04,你的启动服务就应该是systemd。要在系统中添加服务,只需创建一个描述服务的文件。我们创建/lib/systemd/system/odoo.service文件并加入如下内容:

[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选项。

下一步我们需要使用如下命令来注册这个新服务:

sudo systemctl enable odoo.service

使用如下命令启动该服务:

sudo systemctl start odoo

使用如下命令检查该服务状态:

sudo systemctl status odoo

在这里插入图片描述

最后,如需停止服务,请使用如下命令:

sudo systemctl stop odoo

创建Upstart或sysvinit 服务

如果你使用更老的操作系统,如Debian 7或Ubuntu 15.04,那么很有可能需要使用sysvinit或Upstart启动服务。就创建系统服务而言,两者的作用一致。一些虚拟专用服务器(VPS)服务还在使用老的Ubuntu镜像,所以在碰到这种情况时可以通过以下方式部署Odoo服务。

Odoo源码中有一个init脚本用于Debian发行包,我们仅需做一些小修改来使用它创建启动服务:

sudo cp /home/odoo/odoo-12/debian/init /etc/init.d/odoo
sudo chmod +x /etc/init.d/odoo

现在你可能需要查看一下init脚本的内容,主要的参数都在文件上方定义的变量中,如下例所示:

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 的文件在不同的路径下,但可创建以下软链接:

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 服务了:

$ sudo /etc/init.d/odoo start
Starting odoo: ok

关闭服务方法相似,命令如下:

$ sudo /etc/init.d/odoo stop
Stopping odoo: ok

Ubuntu中可使用 service 命令:

sudo service odoo start
sudo service odoo status
sudo service odoo stop

现在我们需要在系统启动时自动开启服务,通过如下命令实现:

sudo update-rc.d odoo defaults

这时,重启服务器 Odoo 服务就会正常地自动启动了。是时候测试下一切是否都如预期一样了。

使用命令行检查 Odoo 服务

现在我们可以确定Odoo实例是否运行以及是否能正常对请求进行响应。如果Odoo正常运行,我们应该可以得到响应并且日志文件中不会报错。在服务器上通过如下命令可检测 Odoo 是否对HTTP请求进行响应:

curl http://localhost:8069
<html><head><script>window.location = '/web' + location.hash;</script></head></html>

此外通过如下命令可查看日志文件的内容:

sudo less /var/log/odoo/odoo-server.log

你还可以使用tail -f 来实时查看日志文件中新增的内容:

sudo tail -f /var/log/odoo/odoo-server.log

设置 Nginx 反向代理

虽然 Odoo 自身可以输出网页,但强烈建议在其上加一层反向代理。反向代理作为一个中间层来管理客户端所发送请求以及 Odoo 服务作出响应之间的数据流。使用反向代理有诸多好处。

从安全角度考虑,有以下几点:

  • 处理并加固HTTPS协议来对数据流加密
  • 隐藏内部网络特征
  • 作为应用防火墙,限制所接受处理的 URL

然后从性能角度考虑,反向代理可提供如下显著的改进:

  • 缓存静态内容,因而降低 Odoo 服务器的负载
  • 压缩内容来加快加载时间
  • 作为负载均衡器,在多台服务间分配负载

Apache是在考虑反向代理时的一个常用选择,Nginx 是近期在技术圈被热议的对其的替代。此处我们使用Nginx作为反向代理,并展示如何使用它来实现上述讨论的安全和性能方面的功能。

首先,我们应当安装Nginx,我们需要它监听默认的HTTP端口,所以需要确保没有被其它服务所占用。执行如下命令应该会报错:

$ 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了:

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安装时默认带有的配置:

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配置文件:

sudo nano /etc/nginx/sites-available/odoo

一个基本的针对Odoo服务的Nginx配置文件如下例所示:

upstream odoo {server 127.0.0.1:8069;
}
upstream odoochat {server 127.0.0.1:8072;
}
server {listen 80;# Add Headers for odoo proxy modeproxy_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;# logaccess_log /var/log/nginx/odoo.access.log;error_log /var/log/nginx/odoo.error.log;# Redirect longpoll requests to odoo longpolling portlocation /longpolling {proxy_pass http://odoochat;}# Redirect requests to odoo backend serverlocation / {proxy_redirect off;proxy_pass http://odoo;}# common gzipgzip_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相关的命令,它们用于对一些文件进行压缩,提升性能。可通过如下命令测试配置是否正确:

$ 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服务前先通过本文中的命令确保并没有这种问题。在完成处理后,可使用如下命令重新加载新的配置:

sudo /etc/init.d/nginx reload

如果操作系统使用的是systemd,上述命令正确的版本应该是:

sudo systemctl reload nginx

通过如下命令可确认 Nginx 是否将访问流量重定向到了后台Odoo服务中:

$ curl http://localhost
<html><head><script>window.location = '/web' + location.hash;</script></head></html>

在这里插入图片描述

配置HTTPS安全服务

网站数据不应在因特网中以普通文件进行传输,在将Odoo网页服务暴露在网络中时,我们应使用HTTPS协议来对数据进行加密。有时可使用自签署证书。但注意自签署证书可能会带来安全风险,比如中间人攻击(Man-in-the-Middle Attack),因此有些浏览器会不接受该证书。

更健壮的解决方案是使用认证的证书机构所签署的证书,在运行商业或电商网站时这就尤为重要了。

小贴士:Let’s Encrypt服务提供免费的证书。Odoo 有现存插件模块处理对Odoo服务SSL证书的自动请求,但在写本文时,还未移植到Odoo 12中,可访问 GitHub 进一步了解。

创建自签署 SSL 证书

下一步,我们应安装证书来启用SSL。创建一个自签署证书,可使用如下命令:

$ 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用户。

在 Nginx上配置HTTPS访问

既然我们已经有了SSL证书,就可以配置 Nginx 来使用它了。要强制使用HTTPS,需要将所有的 HTTP 访问重定向到HTTPS。将前面的server区中替换为如下内容:

server {listen 80;rewrite ^(.*) https://$host$1 permanent;
}

现在,如果重新加载Nginx配置并在浏览器中访问服务的话,将会看到http://地址被转换成了https:// 地址。但该地址不会返回任何内容,我们需要正确地配置HTTPS服务,可通过添加如下服务器配置来实现:

server {listen 443;# Add Headers for odoo proxy modeproxy_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 parametersssl 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;# logaccess_log /var/log/nginx/odoo.access.log;error_log /var/log/nginx/odoo.error.log;# Redirect longpoll requests to odoo longpolling portlocation /longpolling {proxy_pass http://odoochat;}# Redirect requests to odoo backend serverlocation / {proxy_redirect off;proxy_pass http://odoo;}# common gzipgzip_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进行运作,如以下命令所示:

$ 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区之前加入如下代码:

# cache static datalocation ~* /web/static/ {proxy_cache_valid 200 60m;proxy_buffering on;expires 864000;proxy_pass http://odoo;}

通过这一些命令,静态数据就可以缓存60分钟了。在这个期间的其它请求Nginx 会直接使用缓存进行响应。

服务和模块更新

一旦 Odoo 服务运行了一段时间,就会需要对其进行升级。这包括两个步骤:获取服务或模块的新版本、执行安装。

创建分阶环境

如果你按照通过源码安装 Odoo一节正确地进行了安装,应该就可以在暂存区仓库中获取并测试新版本源码。强烈建议创建一个生产环境数据库的拷贝,并使用它进行升级测试。如果odoo-prod是我们的生产环境数据库,可通过如下命令创建一个拷贝odoo-stage:

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生产环境的服务。

更新 Odoo 源码

我们使用git pull 命令来从GitHub仓库获取最新的Odoo源码。在那之前,我们可以使用git tag命令来为当前使用的提交创建一个标签,这样可以可容易的对更新进行撤销,命令如下:

sudo su odoo
cd ~/odoo-12
git tag --force 12-last-prod
git pull

要让代码修改生效,我们需要重启Odoo服务。而要使用数据文件的修改生效,需要对模块进行升级。通常对Odoo稳定版本的修改都是代码的修复,因此无需冒险执行模块升级。如果需要对模块升级,可使用-u 附加参数,或者是-u base,它将升级所有模块。

现在可以启动Odoo的分阶服务了,它将使用在分阶数据库上使用升级代码:

~/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来检查升级代码是否正确运作。如果出现了错误,可通过如下命令来返回上一个版本:

sudo su odoo
cd ~/odoo-12
git checkout 12-last-prod
exit

如果一切运行都如预期,则可安全地执行生产环境服务的升级,通常是通过重启来实现。如果想要执行实际的模块升级,建议的方法是停止服务、运行升级、再重启服务,命令如下:

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 拉取新的版本到生产仓库并完成升级:

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/做更进一步了解。

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. python3运行《21个项目玩转深度学习》遇到的问题

    由于我的环境是python3,而这本书用的是python2,所以学习过程中会有一些代码不兼容的问题,在此列出我遇到的。chapter_8中使用自己的数据集进行训练时会遇到:Traceback (most recent call last):File "main.py", line 14, in <module>flags.DEFINE_integer(&…...

    2024/3/29 5:45:39
  2. C++游戏之游戏动画的实现(三)

    上一节,我们已经知道如何利用GDI在窗体上绘制图片和文字了,是不是很简单,那么现在如何利用GDI在游戏中实现动画效果呢?俗话说的好,2D游戏是贴图的艺术,3D是渲染的艺术,贴图嘛,也很简单,有两种方式,一种采用定时器,一种则是利用消息循环,目前都是采用的第二种绘制方…...

    2024/3/29 5:45:44
  3. matlab-importdata,textread

    我在matlab2014a中使用importdata函数时,想把字符和数字分开 比如一个1.txt文件(内容如下) %path/track/result/ 12 20 50 60 45 48 63 30 ..... A=importdata(‘1.txt’); 这时候运行A.data会把所有的数字都表示出来是个N*4的结构体 但是如果数字是重复一样的 比如2.txt(…...

    2024/3/28 20:44:07
  4. 百度智能小程序正式开源,开发方案详解!

    13 日下午,2018 百度智能小程序学院首场线下公开课在北京举行,百度官方数据显示,自今年 7 月份百度 AI 开发者大会以来,百度智能小程序月活已经过了 1.5 亿,值得一提的是,智能小程序已经在GitHub上开源,百度也即将成立开源联盟,促进小程序生态的发展和建设。会上,百度…...

    2024/3/7 22:43:10
  5. 一个简单有效的手写识别引擎

    实现一个手写识别引擎有多复杂困难?那就要看你使用什么算法啦。 在开源库中比较常用的有使用 SVM (Support Vector Machine) 的 Zinnia(http://zinnia.sourceforge.net)。 从其源代码来看,的确有点复杂,主要是 SVM 本身就不是什么简单易懂的东西。 那有没有其他容易一点的…...

    2024/3/29 5:46:17
  6. matlab中importdata函数导入数据 到工作空间

    用load函数导入mat文件大家都会。但是今天我拿到一个数据,文件后缀名居然是‘.data’。该怎么读呢?我只好用matlab界面Workspace区域的“import data”按钮手工导入该文件。恩,还好,居然成功了。顺便提一下,这个“import data”按钮功能很强大,连excel文件都能导入。但是…...

    2024/3/29 5:46:47
  7. 招募Python机器学习深度学习兼职

    招募Python 爬虫, 机器学习, 深度学习, 神经网络等兼职,按单结算利润丰厚!...

    2024/3/20 0:53:06
  8. 设计模式系列(七)简单工厂模式、工厂方法模式和抽象工厂模式对比

    设计模式系列(七)简单工厂模式、工厂方法模式和抽象工厂模式对比在前面的三篇文章中,依次讲解了简单工厂模式、工厂方法模式和抽象工厂模式,这篇文章主要对其进行简单的对比和概括,详细部分大家可以参考前三篇文章。简单工厂模式:点击打开链接工厂方法模式:点击打开链接…...

    2024/3/29 5:46:48
  9. 共享 || 68份90后用户画像报告

    90后用户画像报告合集,是各行各业针对90后的用户画像分析报告。这里共享大概68份不同行业的90后用户画像分析报告,希望可以有个帮助。内容都是第一手整理的资料,仅供大家自行收藏分享,如需转载请在公众号后台申请并注明来源哈~如果大家身边也有需要这些资料的人,在分享的同…...

    2024/3/29 5:46:41
  10. QQ飞车手游设计分析

    腾讯系竞速手游的逆袭(QQ飞车手游设计分析) 前言 这是中山大学数据科学与计算机学院软件工程2019年3D游戏编程与设计的作业1。 导语 在中国巨大的游戏市场下,手游战场上的战火从未熄灭,其中以王者荣耀为首的MOBA类手游与以PUBG(现改名和平精英)为代表的吃鸡类手游延续了PC端的…...

    2024/3/29 5:46:41
  11. 刚学编程的程序员必备这5大编程网站,你知道几个?

    一个好的网站,就是程序员学编程的基地。虽说新手程序员也许知道一些在线编程网站,但是质量上乘的编程网站又知道几个呢?下面就来给大家推荐5个质量上乘的编程网站:0、LeetcodeLeetCode是大名鼎鼎的在线刷题网站,通过该网站的刷题,你将提高自己代码和解题能力。它将帮助你…...

    2024/3/28 22:54:12
  12. 深度学习图像分割整理

    1 综述 Semantic Segmentation using Fully Convolutional Networks over the years Jun 1, 2017 https://meetshah1995.github.io/semantic-segmentation/deep-learning/pytorch/visdom/2017/06/01/semantic-segmentation-over-the-years.html#sec_datasets 2 常见分割网络总结…...

    2024/3/7 22:43:05
  13. MATLAB 读取txt文件(importdata函数)

    利用 importdata 函数data = importdata("123.txt",,1000)%读取文件,从第1行一直到第1000行实际应用data = importdata("123.txt",,10000) %读取[m n]= size(data)%寻找含有%的地方for i =1:mtemp = find(data{i}==%)if isempty(temp)t(i) = 0else t(i) …...

    2024/3/28 20:52:44
  14. Research on Pedestrian Attribute Recognition Based on Semantic Segmentation in Natural Scene

    动机: 以往的研究主要使用传统的机器学习方法和神经网络来识别行人属性,主要判断自然场景中行人属性的存在性。但是,仅仅判断属性是否存在是不够的,获取属性的位置通常会提供更多的信息。例如,行人的位置信息有助于提高行人重新识别的能力。我们知道,人类将属性的位置作为…...

    2024/3/28 20:52:43
  15. 简单工厂方法模式--水果实例

    本文参看了:http://www.cnblogs.com/seesea125/archive/2012/05/02/2478981.html转载原创一半一半一、简单工厂和工厂方法定义: 简单工厂模式是由一个工厂类根据参数来决定创立出哪一种产品类的实例。简单工厂方法只有一个工厂方法。 工厂方法模式通过调用不同的工厂方法返回…...

    2024/3/28 20:52:43
  16. 深度学习模型的保存方式

    学习过深度学习的同志们都知道在训练过程中,模型的重要性,训练好的模型可以用来做分类,因此,我们需要对经过千幸万苦训练好的模型进行保存。本人在学习深度学习的时候,只要使用两种方式,一种是tensorflow版的保存,还有一种是keras版的模型的保存。下面逐一介绍下:一、T…...

    2024/3/28 20:52:41
  17. 学习编程技术的成长之路

    只要有一本好书,有一个舞台,每一个人都可能成为大牛级的高手,希望大家通过我精心搜集的这些网站找到自己的兴趣爱好,以增强自己的信心。 众里寻他千百度,为了百度,为了梦想,我们一起分享、交流、奋斗! Simple and reliable —— 简单可依赖 C 语言学习 Linux C 编程一站…...

    2024/3/28 20:52:40
  18. 【matlab】常用函数importdata

    importdata没有头文件并且全是数字用load,有头文件并且数据类型统一用importdata。 查看帮助用 help load help importdatadata.txt内容如下: a1 a2 a3 b1 b2 b3 1 2 3 4 4 4 6 5 6测试代码:delimiterIn = ; % 字符分隔符 headerlinesIn = 2; % 文件头的行数 A = imp…...

    2024/3/28 20:52:39
  19. 推荐一篇学习jbpm的超级好的文章——揭秘jbpm流程引擎内核设计思想及构架(胡大哥的新作)

    不知道怎么形容了,看后真是受益匪浅,在此,向伟大的胡大哥表示感谢! 推荐所有入门级和菜鸟级的jbpm们如圣经般研读,呵呵。 转载自胡大哥的博客,原文地址:http://blog.csdn.net/james999/archive/2007/09/02/1769592.aspx 揭秘jbpm流程引擎内核设计思想及构架 作者 胡长城…...

    2024/3/28 20:52:37
  20. 程序包管理

    软件包管理 一、c语言程序的构建过程 1.程序源代码 --> 预处理 --> 编译 --> 汇编 --> 链接--> 可执行程序 开放源码:就是程序码,文本格式的源代码,写给人类看的程序语言,但机器并不认识,所以无法执行; 编译器:将程序码转译成为机器看的懂得语言,就类似…...

    2024/3/28 20:52:36

最新文章

  1. 2024 年多链代币开发对您的业务有何好处

    2024 年&#xff0c;多链代币开发将成为寻求增强数字化影响力并释放区块链领域新机遇的企业的关键战略。通过利用多个区块链&#xff0c;公司可以显着提高其代币的可扩展性、互操作性和安全性。这种方法不仅提高了交易速度并降低了费用&#xff0c;还使企业能够利用更广泛的用户…...

    2024/3/29 17:57:10
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 钡铼技术R40工业路由器赋能智慧电网实现远程智能采集数据

    在当今的智能化时代&#xff0c;智慧电网作为能源互联网的重要基础设施&#xff0c;其建设和升级离不开先进的通信技术和设备的支持。钡铼技术R40工业路由器凭借其强大的数据传输能力、稳定可靠的性能以及卓越的环境适应性&#xff0c;在赋能智慧电网实现远程智能采集数据方面发…...

    2024/3/29 16:55:35
  4. node整理学习(二)

    模块化的概念 一、什么是模块化 模块化是指解决一个复杂问题时&#xff0c;自顶向下逐层把系统划分成若干模块的过程&#xff0c;模块是可组合、分解和更换的单元 二、模块化的好处 1、提高了代码的复用性 2、提高了代码的可维护性 3、可以实现按需加载 三、模块化规范 …...

    2024/3/28 4:29:35
  5. Python|OpenCV-基于OpenCV实现给图像增加噪点(11)

    前言 本文是该专栏的第12篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 在图像处理中,给图像添加噪点是一个常见的预处理步骤,用于模拟真实世界中的噪声条件,从而评估或测试图像处理算法的性能。OpenCV是一个强大的计算机视觉库,它提供了许多函数和方法来处理…...

    2024/3/29 13:40:24
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/3/27 10:21:24
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/3/24 20:11:25
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/3/29 2:45:46
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/3/29 16:26:39
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/3/29 5:19:52
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/3/28 17:01:12
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/3/29 11:11:56
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/3/29 1:13:26
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/3/29 8:28:16
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/3/29 7:41:19
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/3/24 20:11:18
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/3/29 9:57:23
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/3/29 0:49:46
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/3/24 20:11:15
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/3/29 17:27:19
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/3/24 20:11:13
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/3/26 11:21:23
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/3/28 18:26:34
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/3/28 12:42:28
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/3/28 20:09:10
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57