为什么我得到 "Internal Server Error" 运行 两个 Odoo 实例(相同域但不同端口)?
Why am I getting "Internal Server Error" running two Odoo instances (same domain but different ports)?
我在云服务器中有两个 Odoo 实例。如果我执行以下步骤,我会得到 "Internal Server Error":
- 我先登录(
http://111.222.33.44:3333
)
- 我关闭会话
- 我在同一个浏览器中加载第二个实例的地址(
http://111.222.33.44:4444
)
如果我想在第二个实例(在另一个端口)中工作,我需要先删除浏览器 cookie 才能访问另一个 Odoo 实例。如果这样做一切正常。
如果我同时在不同的浏览器(Firefox 和 Chromium)中加载它们,它们也能正常工作。
这不是 NginX 问题,因为我尝试过使用和不使用它。
有没有办法永久解决这个问题?这是预期的行为吗?
最后我认为这是预期的行为。所有网站的 cookie 都专门为每个网站(每个域)存储在网络浏览器中。因此,如果我只更改端口,则第一个实例的 cookie 会与另一个实例的 cookie 发生冲突,因为它们具有相同的域(在我的示例中为 111.222.33.44
)。
所以有一些解决方法:
在本地更改域
正在 /etc/hosts
的笔记本电脑中创建几个域名:
111.222.33.44 cloud01
111.222.33.44 cloud02
这样cookies就不会互相干扰了。访问每个实例
http://cloud01:3333
http://cloud02:4444
浏览器扩展。多登录或多帐户
还有另一种解决方法。如果我使用这个 chromium 扩展,问题就会消失,因为会话是分开处理的:
如果您有权访问源代码,您可以如下所示更改此文件并检查问题是否已解决。
addons/web/controllers/main.py
if db != request.session.db:
request.session.logout()
request.session.db = db
abort_and_redirect(request.httprequest.url)
并删除 --> request.session.db = db
在这个 IF 语句下面。
尝试以下更改:
openerp/addons/base/ir/ir_http.py
In method _handle_exception somewhere around line 140 you will find this piece of code:
attach = self._serve_attachment()
if attach:
return attach
Replace it with:
if isinstance(exception, werkzeug.exceptions.HTTPException) and exception.code == 404:
attach = self._serve_attachment()
if attach:
return attach
您可以在您的机器上使用一个 OpenERP 服务器完美地为所有数据库提供服务。不幸的是,您没有提到您看到的错误以及您期望的结果 - 这让帮助您变得有点困难;-)
无论如何,根据您提供的信息,这里有一些随机的想法:
如果你对 OpenERP 没有监听所有接口有问题,尝试在配置文件中指定 0.0.0.0 作为 xmlrpc_interface,这应该让 OpenERP 监听所有的 8069 IP。
请注意,如果您要连接到例如http://www.sample.com:8069/?db=openerp 因为您直接连接到 OpenERP。如果你想通过 Apache,你需要在你的虚拟主机配置中设置 ReverseProxy 规则,然后 OpenERP 不需要监听所有 public IP。
OpenERP 6.1及以后可以根据虚拟主机名自动检测数据库名,过滤可用的数据库名:需要用--db-filter参数启动,表示用于过滤可用数据库列表的模式。 %h 代表域名,%d 是该域的第一个域组件。因此,例如 --db-filter=^%d$ 如果我最终使用 http://test.example.com:8069 在服务器上,我只会看到测试数据库。如果只有一个数据库匹配,则不会显示列表,用户将直接找到正确的数据库。如果您确保 OpenERP 看到外部主机名,这甚至可以在 Apache 反向代理之后工作,即通过在 Apache 代理配置中设置 X-Forwarded-Host header 并启用 OpenERP 的 --proxy 模式。
端口重用问题的出现是因为您试图在同一个 interface/port 组合上启动多个 OpenERP 服务器。这是根本不可能的,除非您小心地使用 xmlrpc_interface 参数中设置的 IP 为每个 IP 仅启动一个服务器,我认为您不需要这样做。 Apache 支持的 named-based 虚拟主机全部由一个主进程处理,该进程在所有接口上侦听端口 80。如果你想对 OpenERP 做同样的事情,你只需要为你所有的域启动一个 OpenERP 服务器,并让它监听 0.0.0.0,端口 8069,正如我上面解释的那样。
最重要的是,不清楚您在各种配置文件中的不同设置。 运行 在同一台机器上使用相同代码的 40 个不同的 OpenERP 服务器听起来有点矫枉过正。 OpenERP 被设计为 multi-tenant 以便可以从同一台服务器提供许多(读取:数百个)数据库。
我在云服务器中有两个 Odoo 实例。如果我执行以下步骤,我会得到 "Internal Server Error":
- 我先登录(
http://111.222.33.44:3333
) - 我关闭会话
- 我在同一个浏览器中加载第二个实例的地址(
http://111.222.33.44:4444
)
如果我想在第二个实例(在另一个端口)中工作,我需要先删除浏览器 cookie 才能访问另一个 Odoo 实例。如果这样做一切正常。
如果我同时在不同的浏览器(Firefox 和 Chromium)中加载它们,它们也能正常工作。
这不是 NginX 问题,因为我尝试过使用和不使用它。
有没有办法永久解决这个问题?这是预期的行为吗?
最后我认为这是预期的行为。所有网站的 cookie 都专门为每个网站(每个域)存储在网络浏览器中。因此,如果我只更改端口,则第一个实例的 cookie 会与另一个实例的 cookie 发生冲突,因为它们具有相同的域(在我的示例中为 111.222.33.44
)。
所以有一些解决方法:
在本地更改域
正在 /etc/hosts
的笔记本电脑中创建几个域名:
111.222.33.44 cloud01
111.222.33.44 cloud02
这样cookies就不会互相干扰了。访问每个实例
http://cloud01:3333
http://cloud02:4444
浏览器扩展。多登录或多帐户
还有另一种解决方法。如果我使用这个 chromium 扩展,问题就会消失,因为会话是分开处理的:
如果您有权访问源代码,您可以如下所示更改此文件并检查问题是否已解决。
addons/web/controllers/main.py
if db != request.session.db:
request.session.logout()
request.session.db = db
abort_and_redirect(request.httprequest.url)
并删除 --> request.session.db = db
在这个 IF 语句下面。
尝试以下更改:
openerp/addons/base/ir/ir_http.py
In method _handle_exception somewhere around line 140 you will find this piece of code:
attach = self._serve_attachment()
if attach:
return attach
Replace it with:
if isinstance(exception, werkzeug.exceptions.HTTPException) and exception.code == 404:
attach = self._serve_attachment()
if attach:
return attach
您可以在您的机器上使用一个 OpenERP 服务器完美地为所有数据库提供服务。不幸的是,您没有提到您看到的错误以及您期望的结果 - 这让帮助您变得有点困难;-)
无论如何,根据您提供的信息,这里有一些随机的想法:
如果你对 OpenERP 没有监听所有接口有问题,尝试在配置文件中指定 0.0.0.0 作为 xmlrpc_interface,这应该让 OpenERP 监听所有的 8069 IP。
请注意,如果您要连接到例如http://www.sample.com:8069/?db=openerp 因为您直接连接到 OpenERP。如果你想通过 Apache,你需要在你的虚拟主机配置中设置 ReverseProxy 规则,然后 OpenERP 不需要监听所有 public IP。
OpenERP 6.1及以后可以根据虚拟主机名自动检测数据库名,过滤可用的数据库名:需要用--db-filter参数启动,表示用于过滤可用数据库列表的模式。 %h 代表域名,%d 是该域的第一个域组件。因此,例如 --db-filter=^%d$ 如果我最终使用 http://test.example.com:8069 在服务器上,我只会看到测试数据库。如果只有一个数据库匹配,则不会显示列表,用户将直接找到正确的数据库。如果您确保 OpenERP 看到外部主机名,这甚至可以在 Apache 反向代理之后工作,即通过在 Apache 代理配置中设置 X-Forwarded-Host header 并启用 OpenERP 的 --proxy 模式。
端口重用问题的出现是因为您试图在同一个 interface/port 组合上启动多个 OpenERP 服务器。这是根本不可能的,除非您小心地使用 xmlrpc_interface 参数中设置的 IP 为每个 IP 仅启动一个服务器,我认为您不需要这样做。 Apache 支持的 named-based 虚拟主机全部由一个主进程处理,该进程在所有接口上侦听端口 80。如果你想对 OpenERP 做同样的事情,你只需要为你所有的域启动一个 OpenERP 服务器,并让它监听 0.0.0.0,端口 8069,正如我上面解释的那样。 最重要的是,不清楚您在各种配置文件中的不同设置。 运行 在同一台机器上使用相同代码的 40 个不同的 OpenERP 服务器听起来有点矫枉过正。 OpenERP 被设计为 multi-tenant 以便可以从同一台服务器提供许多(读取:数百个)数据库。