nginx: вгору з декількома серверними директивами?


15

Я намагаюся пакувати 2 програми, які використовують nginx як проксі і доставляють кожен конфігураційний файл у /etc/nginx/conf.d/.

Це в одному файлі ( combined.conf) чудово працює:

    upstream backend1 {
      http://localhost:8989;
    }

    upstream backend2 {
      http://localhost:8990;
    }

    server {
      location /backend1/ {
        proxy_pass  http://backend1;
      }
      location /backend2/ {
        proxy_pass  http://backend2;
      }

Однак при розділенні на 2 файли один із переадресацій не працює систематично:

  • backend1.conf:

    upstream backend1 {
      http://localhost:8989;
    }
    
    server {
      location /backend1/ {
        proxy_pass  http://backend1;
      }
    
  • backend2.conf:

    upstream backend2 {
      http://localhost:8990;
    }
    
    server {
      location /backend2/ {
        proxy_pass  http://backend2;
      }
    

Отже, моє запитання: чи може httpвузол мати 2 різних serverдітей?

Документація Nginx про це нічого не говорить.

Інші люди, здається, досягли успіху з такою архітектурою, хоча :(

Версія Nginx - 1.1.19-1ubuntu0.1.

Дякую за будь-яку пораду!


Якщо бути точнішим, коли я використовую два файли, підхід за замовчуванням відповідає 404.
oDDsKooL

Відповіді:


8

після такого бурчання та тестування я придумав спосіб змусити його працювати і мати можливість відправляти один конфігураційний файл на додаток.

Ось він розсилається в одному загальному файлі та парі файлів вище / потоку / локації для програми:

  • /etc/nginx/conf.d/common-proxies.conf:

    include /upstreams/*.conf;
    
    server {
    include /locations/*.conf
    }
    
  • /etc/nginx/locations/backend1.conf

    location /backend1/ {
      upstream http://backend1;
    }
    
  • /etc/nginx/locations/backend2.conf

    location /backend2/ {
      upstream http://backend2;
    }
    
  • /etc/nginx/upstreams/backend1.conf

    upstream backend1 {
      http://localhost:8989;
    }
    
  • /etc/nginx/upstreams/backend2.conf

    upstream backend2 {
      http://localhost:8990;
    }
    

1
Це друкарня? вище за течією повинен бути "сервер localhost: 8990" замість " localhost: 8990 ;". Дивіться тут: nginx.org/en/docs/http/ngx_http_upstream_module.html
mbdev

З документа, який ви пов’язали, видно, що кожна команда всередині блоку закінчується напівколоною. Напр upstream backend { server 127.0.0.1:8080 max_fails=3 fail_timeout=30s; }. Крім того, це працює з ;:)
oDDsKooL

Я мав на увазі, що перед адресою відсутнє ключове слово "сервер". Ігноруйте крапку з комою.
mbdev

1

Блок http може мати багато дітей на сервері. Однак nginx вибирає один серверний блок для обробки запиту. Отже, запит ніколи не «бачить» місце backend2, оскільки воно відповідає першому блоку сервера.


Ви маєте на увазі, мабуть, саме моя locationдиректива відсмоктує і захоплює запит, призначений для backend2?
oDDsKooL

Або мені потрібен спосіб диференціювати обидва serverблоки, коли nginx шукає відповідний serverдля переадресації запиту?
oDDsKooL

Обидва блоки розташування повинні знаходитися в одному блоці сервера.
чорний
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.