为什么我得到 "Internal Server Error" 运行 两个 Odoo 实例(相同域但不同端口)?

Why am I getting "Internal Server Error" running two Odoo instances (same domain but different ports)?

我在云服务器中有两个 Odoo 实例。如果我执行以下步骤,我会得到 "Internal Server Error":

  1. 我先登录(http://111.222.33.44:3333)
  2. 我关闭会话
  3. 我在同一个浏览器中加载第二个实例的地址(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 以便可以从同一台服务器提供许多(读取:数百个)数据库。