Почему я получаю "внутреннюю ошибку сервера", запускающую два экземпляра Odoo (тот же домен, но разные порты)?

у меня есть два экземпляра Odoo на сервере в облаке. Если я сделаю следующие шаги, я получу "внутреннюю ошибку сервера":

  1. я делаю логин в первой инстанции (http://111.222.33.44:3333)
  2. Я закрываю сессию
  3. я загружаю адрес второго экземпляра в том же браузере (http://111.222.33.44:4444)

Если я хочу работать во втором экземпляре (в другом порту), мне нужно сначала удалить куки браузера, чтобы получить доступ к другому экземпляру Odoo. Если сделать это все работает нормально.

Если я загружаю их в разные браузеры (Firefox и Chromium) одновременно, они также работают хорошо.

это не проблема NginX, потому что я пытался с ним и без него.

есть ли способ решить эту проблему навсегда? Это ожидаемое поведение?

4 ответов


Если у вас есть доступ к исходному коду вы можете изменить этот файл, как показано ниже, и проверьте, если проблема решена или нет.

addons/web/controllers/main.py

if db != request.session.db:
     request.session.logout()
     request.session.db = db
     abort_and_redirect(request.httprequest.url)

удалить --> запрос.сессия.db = db

который находится ниже этого если заявление.


попробуйте следующие изменения в:

openerp/addons/base/ir/ir_http.py

методом _handle_exception где-то около строки 140 вы найдете этот кусок кода:

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

вы можете отлично обслуживать все базы данных с помощью одного сервера OpenERP на вашем компьютере. К сожалению, вы не упомянули, какую ошибку вы видели и что вы ожидали в результате-делает его немного сложнее, чтобы помочь вам ; -)

в любом случае, вот некоторые случайные идеи, основанные на предоставленной Вами информации:

  • Если у вас есть проблема с OpenERP, не прослушивающим все интерфейсы, попробуйте указать 0.0.0.0 как xmlrpc_interface в конфигурации файл, это должно иметь OpenERP слушать 8069 на всех IPs.

  • обратите внимание, что Apache не имеет значения, если вы подключаетесь, например,http://www.sample.com:8069/?db=openerp потому что вы напрямую подключаетесь к OpenERP. Если вы хотите пройти через Apache, вам нужно настроить правила ReverseProxy в ваших конфигурациях vhost, и OpenERP не нужно слушать все общедоступные IPs.

  • OpenERP 6.1 и более поздние версии могут автоматически определять имя базы данных основываясь на имени виртуального хоста и фильтруя имя доступных баз данных: вам нужно запустить его с параметром --db-filter, который представляет собой шаблон, используемый для фильтрации списка доступных баз данных. %h представляет доменное имя, А %d является первым доменным компонентом этого домена. Так, например, с --db-filter=^%d$ Я буду видеть тестовую базу данных, только если я в конечном итоге на сервере использую http://test.example.com:8069. Если есть только одно совпадение базы данных, список не отображается и пользователь сразу попадет на нужную базу данных. Это работает даже за обратными прокси-серверами Apache, если вы убедитесь, что OpenERP видит внешнее имя хоста, т. е. установив заголовок X-Forwarded-Host в конфигурации прокси-сервера Apache и включив режим --proxy OpenERP.

    проблема повторного использования порта возникает, потому что вы пытаетесь запустить несколько серверов OpenERP в одной комбинации интерфейс/порт. Это просто невозможно, если вы не будете осторожны, чтобы начать только один сервер на IP с IP, установленным в параметре xmlrpc_interface, и я не думаю, что вам это нужно. Виртуальные хосты на основе имен, поддерживаемые Apache, обрабатываются одним главным процессом, который прослушивает порт 80 на всех интерфейсах. Если вы хотите сделать то же самое с OpenERP, вам нужно запустить только один сервер OpenERP для всех ваших доменов и заставить его слушать 0.0.0.0, порт 8069, как я объяснил выше. Кроме того, неясно, что бы вы установили по-разному в различной конфигурации файлы. Запуск 40 различных серверов OpenERP на одной машине с одинаковым кодом звучит как много излишеств. OpenERP предназначен для нескольких арендаторов, так что многие (читай: сотни) баз данных могут обслуживаться с одного сервера.


наконец, я думаю, что это ожидаемое поведение. Файлы cookie всех веб-сайтов хранятся специально для каждого веб-сайта (для каждого домена) в веб-браузере. Поэтому, если я только изменяю порт, cookies первого экземпляра конфликтуют с cookies другого экземпляра, потому что имеют тот же домен (111.222.33.44 в моем примере).

Итак, есть некоторые обходные пути:

Изменить Домен Локально

создание пары доменных имен в моем ноутбуке в /etc/hosts:

111.222.33.44  cloud01
111.222.33.44  cloud02

тогда куки больше не мешают друг другу. Для доступа к каждому экземпляру

http://cloud01:3333
http://cloud02:4444

Расширение Broswer. Multilogin или Multiaccount

есть еще один обходной путь. Если я использую это расширение chromium, проблема исчезает, потому что сеансы обрабатываются отдельно: