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

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

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;
  }
}

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

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

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

1 ответ

Решил, используя это 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/'

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

@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 /. В противном случае вы можете избежать этой строки кода.

Другие вопросы по тегам