Как опубликовать два экземпляра odoo с использованием nginx, разные пути вместо разных имен серверов или портов?

#nginx #odoo

#nginx #odoo

Вопрос:

Я хотел бы опубликовать два экземпляра odoo, используя разные пути, например mysite.com/odoo11 и mysite.com/odoo12 . Я использую образы odoo docker и nginx: 1.15.12-alpine docker image.

 server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name mysite.com;

        index index.php index.html index.htm;

        root /var/www/html;

#   ...ssl config...


#    location / {
#        proxy_set_header X-Real-IP  $remote_addr;
#        proxy_set_header X-Forwarded-For $remote_addr;
#        proxy_set_header X-Forwarded-Proto $scheme;
#        proxy_set_header Host $host;
#        proxy_pass http://odoo:8069;
#    }


    location /odoo {
        rewrite ^/odoo(.*) /$1 break;
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://odoo:8069;
    }

    location ~* /web/static/ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://odoo:8069;

    }

}
  

Я начал только с одного экземпляра odoo за / odoo path . Я осмотрелся и обнаружил, что способ сделать это — использовать правило перезаписи.

     location /odoo {
        rewrite ^/odoo(.*) /$1 break;
  

Но когда я использую его в своей конфигурации, он не перенаправляет на образ odoo docker, а перенаправляет в корневую папку. Это журнал nginx.

 152.206.199.193 - - [03/Oct/2020:16:20:49  0000] "GET /odoo HTTP/2.0" 200 84 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36" "-"
2020/10/03 16:20:49 [error] 14#14: *6 open() "/var/www/html/web" failed (2: No such file or directory), client: 152.206.199.193, server: example.com, request: "GET /web HTTP/2.0", host: "example.com", referrer: "https://example.com/odoo"
152.206.199.193 - - [03/Oct/2020:16:20:49  0000] "GET /web HTTP/2.0" 404 548 "https://example.com/odoo" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36" "-"
2020/10/03 16:20:49 [error] 14#14: *6 open() "/var/www/html/favicon.ico" failed (2: No such file or directory), client: 152.206.199.193, server: example.com, request: "GET /favicon.ico HTTP/2.0", host: "example.com", referrer: "https://example.com/web"
  

Я пробовал proxy_redirect http: // $host http://odoo:8069 ; вместо proxy_pass и изменения порядка правила перезаписи. Я все еще не понимаю разницы между правилом перезаписи и proxy_redirect или proxy_pass, поэтому было бы неплохо получить некоторое представление и об этом.

Это мой первый вопрос по stackoverflow, поэтому заранее спасибо.

Ответ №1:

Я не думаю, что у вас это получится.

Контроллеры веб-страниц, отвечающие за рендеринг веб-страниц, работают на основе совпадения с URL-адресом.

Например, mysite.com/web используется path /web for the webclient controller. Rewriting it to mysite.com/odoo12/web/odoo12/web uses path `, и это не приведет к запуску контроллера рендеринга webclient.

Ваш лучший вариант — использовать вместо этого поддомены, такие как odoo11.mysite.com и odoo12.mysite.com .

Odoo даже поддерживает это. Опция dbfilter сервера может динамически фильтровать базу данных для использования в соответствии с именем поддомена. Смотрите: https://www.odoo.com/documentation/12.0/setup/deploy.html#dbfilter

Комментарии:

1. Теперь я не могу изменять записи DNS, так что это будет решением в будущем. Я думал, что, используя правила nginx, я мог бы удалить путь, а затем перенаправить в соответствующий контейнер docker. Думаю, тогда мне придется использовать порты. Спасибо за ваш ответ и подсказку о dbfilter том, что я обязательно его использую.