6

我在云中的服务器中有两个 Odoo 实例。如果我执行以下步骤,我会收到“内部服务器错误”:

  1. 我首先登录(http://111.222.33.44:3333
  2. 我关闭会话
  3. 我在同一个浏览器中加载第二个实例的地址(http://111.222.33.44:4444

如果我想在第二个实例(在另一个端口)中工作,我需要先删除浏览器 cookie 才能访问另一个 Odoo 实例。如果这样做一切正常。

如果我同时在不同的浏览器(Firefox 和 Chromium)中加载它们,它们也能正常工作。

这不是 NginX 问题,因为我尝试过使用和不使用它。

有没有办法永久解决这个问题?这是预期的行为吗?

4

4 回答 4

0

最后,我认为这是预期的行为。所有网站的 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

浏览器扩展。多登录或多帐户

还有另一种解决方法。如果我使用这个铬扩展,问题就会消失,因为会话是分开处理的:

于 2015-06-01T15:15:03.253 回答
0

您可以在您的机器上使用单个 OpenERP 服务器完美地为所有数据库提供服务。不幸的是,你没有提到你看到了什么错误以及你期望的结果——这让帮助你变得有点困难;-)

无论如何,根据您提供的信息,这里有一些随机的想法:

  • 如果您遇到 OpenERP 没有监听所有接口的问题,请尝试在配置文件中指定 0.0.0.0 作为 xmlrpc_interface,这应该让 OpenERP 在所有 IP 上监听 8069。

  • 请注意,如果您连接到例如http://www.sample.com:8069/?db=openerp ,则 Apache 不相关,因为您直接连接到 OpenERP。如果你想通过 Apache,你需要在你的虚拟主机配置中设置 ReverseProxy 规则,OpenERP 不需要监听所有的公共 IP。

  • OpenERP 6.1 及更高版本可以根据虚拟主机名自动检测数据库名称,并过滤可用数据库的名称:您需要使用 --db-filter 参数启动它,该参数表示用于过滤可用列表的模式数据库。%h 代表域名,%d 是该域的第一个域组件。因此,例如使用 --db-filter=^%d$ 如果我最终使用http://test.example.com:8069在服务器上,我只会看到测试数据库。如果只有一个数据库匹配,则不会显示列表,用户将直接访问正确的数据库。如果您确保 OpenERP 看到外部主机名,这甚至在 Apache 反向代理之后也有效,即通过在您的 Apache 代理配置中设置 X-Forwarded-Host 标头并启用 OpenERP 的 --proxy 模式。

    端口重用问题的出现是因为您试图在同一个接口/端口组合上启动多个 OpenERP 服务器。这根本不可能,除非您小心地使用 xmlrpc_interface 参数中设置的 IP 为每个 IP 启动一个服务器,我认为您不需要这样做。Apache 支持的基于命名的虚拟主机都由一个主进程处理,该进程侦听所有接口上的端口 80。如果你想对 OpenERP 做同样的事情,你只需要为你的所有域启动一个 OpenERP 服务器,并让它监听 0.0.0.0,端口 8069,正如我上面解释的那样。最重要的是,尚不清楚您将在各种配置文件中进行哪些不同的设置。在同一台机器上使用相同的代码运行 40 个不同的 OpenERP 服务器听起来有点矫枉过正。

于 2015-10-27T12:39:59.390 回答
0

尝试以下更改:

openerp/addons/base/ir/ir_http.py

在第 140 行附近的方法_handle_exception中,您会发现这段代码:

attach = self._serve_attachment()
if attach:
    return attach

将其替换为:

if isinstance(exception, werkzeug.exceptions.HTTPException) and exception.code == 404:
    attach = self._serve_attachment()
    if attach:
        return attach
于 2015-10-27T12:19:05.197 回答
0

如果您有权访问源代码,则可以如下所示更改此文件并检查问题是否已解决。

插件/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语句下方。

于 2015-10-27T11:11:20.880 回答