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

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

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

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

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

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

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


person ChesuCR    schedule 12.05.2015    source источник
comment
Когда вы запускаете Odoo без обратного прокси-сервера (из коробки), Odoo может правильно работать только с одной базой данных. Когда вы пытаетесь переключать базы данных, он не может различать разные базы данных, например, чтобы узнать, какой веб-сайт принадлежит какой базе данных. Если вы хотите также развернуть Odoo в производственной среде, я предлагаю вам использовать обратный прокси-сервер и поддомены для баз данных (например, db_name.host.com). Это хорошее руководство для этого: schenkels.nl/2014/12/   -  person Andrius    schedule 12.08.2015
comment
Да, я уже использую NginX. Но я думаю, что если куки настроены правильно, то должно нормально работать переключение баз данных и портов с одним и тем же доменом.   -  person ChesuCR    schedule 12.08.2015
comment
Здравствуйте, эта проблема все еще находится в открытом состоянии на github. github.com/odoo/odoo/pull/6705 . Так что я думаю, вам придется какое-то время использовать разные браузеры или обходной путь, сделанный вами самостоятельно.   -  person Rutul Raval    schedule 27.10.2015


Ответы (4)


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

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.

person Rutul Raval    schedule 27.10.2015
comment
мм нет, это не работает, я все еще получаю ту же самую внутреннюю ошибку сервера. Возможно, именно поэтому вопрос все еще остается открытым. Вы уверены, что проблема заключается в том, почему я получаю сообщение об ошибке? - person ChesuCR; 27.10.2015

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

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
person Rutul Raval    schedule 27.10.2015
comment
Спасибо!! Но у меня уже была эта строка в коде! И пока не работает :( - person ChesuCR; 28.10.2015

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

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

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

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

  • 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 спроектирован так, чтобы быть многопользовательским, поэтому многие (читай: сотни) баз данных могут обслуживаться с одного сервера.

person Jainik Patel    schedule 27.10.2015
comment
Ошибка внутреннего сервера появляется только на стороне клиента. Я думаю, что это проблема управления файлами cookie в Odoo. Не учитывается, что я использую разные экземпляры на каждом порту сервера. И мне нужно использовать более одного экземпляра, я не могу использовать только один, потому что я хочу сделать видимыми разные базы данных в каждом экземпляре с разными модулями. - person ChesuCR; 28.10.2015
comment
Вы пробовали параметр --db-filter при запуске сервера? Если нет, то попробуйте. - person Rutul Raval; 28.10.2015

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

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

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

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

111.222.33.44  cloud01
111.222.33.44  cloud02

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

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

Расширение браузера. Мультилогин или мультиаккаунт

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

person ChesuCR    schedule 01.06.2015