Как соединить back-end с front-end с помощью ngnix в Kubernetes

У меня есть серверная служба, развернутая в Kubernetes (по адресу http://purser.default.svc.cluster.local:3030) и интерфейсное приложение angular 6 с nginx.conf as

upstream purser {
  server purser.default.svc.cluster.local:3030;
}

server {
  listen 4200;

  location / {
   proxy_pass http://purser;
   root /usr/share/nginx/html/appDApp;
   index index.html index.htm;
   try_files $uri $uri/ /index.html =404;
  }
}

В коде angular мы используем http.get('http://purser.default.svc.cluster.local:3030', {observe: 'body', responseType: 'json'})

Случай 1: с proxy_pass, установленным в nginx.conf, когда мы обращаемся к сервису пользовательского интерфейса, он перенаправляется на серверную часть и выдает json вывод непосредственно из серверной части.

Случай 2: Без proxy_pass, когда мы нажимаем на интерфейсную службу, она показывает пользовательский интерфейс, но данные не поступают из серверной части, т.е. браузер не может понять http://purser.default.svc.cluster.local:3030

введите здесь описание изображения


person Kaladin    schedule 26.02.2019    source источник
comment
Я надеюсь, что вы не пытаетесь подключать интерфейс напрямую к бэкэнду без промежуточного программного обеспечения.   -  person Atomzwieback    schedule 26.02.2019
comment
Да, пользуемся. Вы можете проверить это здесь: github.com/vmware/ Purser / blob / master / cmd / controller / api / api.go   -  person Kaladin    schedule 26.02.2019
comment
Без nginx, если мы храним их обоих в одном модуле, все работает нормально, т.е. оба доступны с использованием localhost   -  person Kaladin    schedule 26.02.2019


Ответы (2)


Решил с помощью этого nginx.conf

upstream purser {
  server purser.default.svc.cluster.local:3030;
}

server {
  listen 4200;

  location /api {
    proxy_pass http://purser;
  }

  location / {
    root /usr/share/nginx/html/purser;
    index index.html index.htm;
    try_files $uri $uri/ /index.html =404;
  }
} 

и вызывает бэкэнд из внешнего интерфейса с помощью BACKEND_URL = window.location.protocol + '//' + window.location.host + '/api/'

Объяснение: Frontend, когда ему требуются данные от серверной части, вызывает себя по пути /api, nginx находит этот путь и в соответствии с конфигурацией перенаправляет его в серверную службу Kubernetes purser.default.svc.cluster.local:3030, используя proxy_pass

person Kaladin    schedule 26.02.2019

@Kaladin, ваш подход был почти готов, но я думаю, что чего-то не хватает.

Что я сделал, было

upstream gateway {
  server gateway-cip-service:3000;
}

server {
  listen 80;

  location /api {
    rewrite /api/(.*) /$1 break;
    proxy_pass http://gateway;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }

  location / {
    root /usr/share/nginx/html;
    index index.html index.htm;
    try_files $uri $uri/ /index.html;
  }
} 

Самой большой головной болью было узнать об обновлении заголовка прокси, такая боль.

Учтите, что в моем бэкэнде у моих маршрутов нет префикса «api», поэтому я использую «rewrite /api/(.*) / $ 1 break;» брать только то, что идет после / api / В противном случае вы можете избежать этой строки кода.

person vimazaco    schedule 04.01.2020