我有一个部署在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
答案 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 /之后的所有内容,否则,可以避免使用该行代码。