如何在Kubernetes中使用ngnix将后端与前端连接

时间:2019-02-26 07:50:42

标签: angular nginx kubernetes nginx-reverse-proxy nginx-config

我有一个部署在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时,当我们点击ui服务时,它将重定向到后端,并直接从后端提供json输出。

案例2:如果没有proxy_pass,则在我们访问前端服务时,它会显示UI,但没有数据来自后端,即浏览器无法理解http://purser.default.svc.cluster.local:3030

enter image description here

2 个答案:

答案 0 :(得分:3)

使用此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会找到该路径,并根据配置使用purser.default.svc.cluster.local:3030将其转发到后端kubernetes服务proxy_pass

答案 1 :(得分:0)

@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 /之后的所有内容,否则,可以避免使用该行代码。