我尝试使用nginx将代理转换为运行各种网络应用的kubernetes pod。我的问题是,我只能在位置设置为/
而不是/someplace
我知道内部IP正在运行,因为当我使用location /
时,两个网络应用都会成功加载,我可以在内部卷曲网页。
我想要发生什么
http://ServerIP/app1路由到http://Pod1IP:3000 http://ServerIP/app2路由到http://Pod2IP:80
通过这种方式,我可以轻松地在同一个端口上运行我的所有应用程序。
我相信发生了什么 http://ServerIP/app1 - > httpL // Pod1IP:3000 / APP1
我尝试通过重写下面的URI来解决这个问题,当我尝试访问/app1
server {
listen 80;
location = /app1/ {
rewrite ^.*$ / break;
proxy_pass http://10.82.5.80:80;
}
location / {
proxy_pass http://10.106.228.213:15672;
}
}
我弄乱了什么想法?
我尝试使用的webapp称为RabbitMQ UI。为了尝试调试我的情况,我卷了三个不同的URL来查看nginx响应的内容。
卷曲/
加载正确的html页面,它可以在浏览器中运行。
curl http://10.82.5.80/
<!doctype html>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<html>
<head>
<title>RabbitMQ Management</title>
<script src="js/ejs-1.0.min.js" type="text/javascript"></script>
<script src="js/jquery-1.12.4.min.js" type="text/javascript"></script>
<script src="js/jquery.flot-0.8.1.min.js" type="text/javascript"></script>
<script src="js/jquery.flot-0.8.1.time.min.js" type="text/javascript"></script>
<script src="js/sammy-0.7.6.min.js" type="text/javascript"></script>
<script src="js/json2-2016.10.28.js" type="text/javascript"></script>
<script src="js/base64.js" type="text/javascript"></script>
<script src="js/global.js" type="text/javascript"></script>
<script src="js/main.js" type="text/javascript"></script>
<script src="js/prefs.js" type="text/javascript"></script>
<script src="js/formatters.js" type="text/javascript"></script>
<script src="js/charts.js" type="text/javascript"></script>
<link href="css/main.css" rel="stylesheet" type="text/css"/>
<link href="favicon.ico" rel="shortcut icon" type="image/x-icon"/>
<!--[if lte IE 8]>
<script src="js/excanvas.min.js" type="text/javascript"></script>
<link href="css/evil.css" rel="stylesheet" type="text/css"/>
<![endif]-->
</head>
<body>
<div id="outer"></div>
<div id="debug"></div>
<div id="scratch"></div>
</body>
</html>
卷曲/rabbitmq
返回未找到或永久移动
curl http://10.82.5.80/rabbitmq
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.10.3 (Ubuntu)</center>
</body>
</html>
卷曲/rabbitmq/
位置会显示正确的页面,但会在浏览器中加载空白。我想这是因为浏览器无法引用html doc中的js文件?
curl http://10.82.5.80/rabbitmq/
<!doctype html>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<html>
<head>
<title>RabbitMQ Management</title>
<script src="js/ejs-1.0.min.js" type="text/javascript"></script>
<script src="js/jquery-1.12.4.min.js" type="text/javascript"></script>
<script src="js/jquery.flot-0.8.1.min.js" type="text/javascript"></script>
<script src="js/jquery.flot-0.8.1.time.min.js" type="text/javascript"></script>
<script src="js/sammy-0.7.6.min.js" type="text/javascript"></script>
<script src="js/json2-2016.10.28.js" type="text/javascript"></script>
<script src="js/base64.js" type="text/javascript"></script>
<script src="js/global.js" type="text/javascript"></script>
<script src="js/main.js" type="text/javascript"></script>
<script src="js/prefs.js" type="text/javascript"></script>
<script src="js/formatters.js" type="text/javascript"></script>
<script src="js/charts.js" type="text/javascript"></script>
<link href="css/main.css" rel="stylesheet" type="text/css"/>
<link href="favicon.ico" rel="shortcut icon" type="image/x-icon"/>
<!--[if lte IE 8]>
<script src="js/excanvas.min.js" type="text/javascript"></script>
<link href="css/evil.css" rel="stylesheet" type="text/css"/>
<![endif]-->
</head>
<body>
<div id="outer"></div>
<div id="debug"></div>
<div id="scratch"></div>
</body>
</html>
答案 0 :(得分:1)
尝试在代理位置添加网址,如下所示:
location = /app1/ {
proxy_pass http://10.82.5:80/;
}
在proxy_pass末尾添加一个尾随/
会强制nginx在将请求发送到后端时从您的请求中删除/app1
前缀。
关于它如何在官方nginx页面上运行的说明:http://nginx.org/en/docs/http/ngx_http_proxy_module.html?&_ga=1.74997266.187384914.1443061481#proxy_pass
If the proxy_pass directive is specified with a URI, then when a request is passed to the server, the part of a normalized request URI matching the location is replaced by a URI specified in the directive: