我正在尝试使用创建反向代理路由nginx-代理和 docker for打开旅行计划(OTP)版本 1.5.0 和 2.2.0 在同一台机器上。
如果我有一个简单的位置块,如:
location /otp2 {
proxy_pass http://127.0.0.1:8081;
}
OTP发出的大多数调用都会被传递到上游服务器,但是 OTP Web 应用程序也有一些硬编码调用http://host/otp
(http://host/images
不是 http://host/otp2/otp
和http://host/otp2/images
)。由于它们与 nginx 位置块不匹配,因此无法解析。
我如何确保这些调用也被路由到上游服务器?
我尝试过的方法
正则表达式 + 重写
经过一番折腾之后我决定:
location ~^/(otp2|otp|images) {
rewrite ^(/otp2)$ $1/ permanent;
rewrite ^/(otp2)(.*) $2 break;
rewrite ^/(otp)(.*) /$1$2 break;
rewrite ^/(images)(.*) $1$2 break;
proxy_pass http://127.0.0.1:8081;
}
这是可行的,但是这阻止我运行 OTP 版本 1.5.0,因为该二进制文件还请求http://host/otp
和http://host/images
。
此外,我在该主机上运行的每个具有路由的其他 Web 应用程序都/images
可能会被该位置块接收。
子域名
我无法更改 DNS,所以(我认为)我只能执行基于路径的位置块,而不能执行像otp2.host.com
和这样的子域otp1.host.com
。
单独的位置块
根据其中一位回答者的建议,我尝试了单独的位置块:
location /otp2 {
proxy_pass http://127.0.0.1:8081/;
}
location /otp2/otp {
proxy_pass http://127.0.0.1:8081/otp/;
}
location /otp2/images {
proxy_pass http://127.0.0.1:8081/images/;
}
这部分可以工作,但留下了一些未处理的 OTP 请求,从而破坏了应用程序(表单的主机sub1.sub2.company.country
在下面的屏幕截图中被混淆了):
答案1
让我们使用单独的位置块来处理来自 OTP 1.5.0 和 2.2.0 的特定硬编码请求,请尝试此配置:
server {
listen 80;
server_name your_host_name;
# For OTP 1.5.0
location /otp1 {
proxy_pass http://127.0.0.1:8080;
}
location /otp1/otp {
proxy_pass http://127.0.0.1:8080/otp;
}
location /otp1/images {
proxy_pass http://127.0.0.1:8080/images;
}
# For OTP 2.2.0
location /otp2 {
proxy_pass http://127.0.0.1:8081;
}
location /otp2/otp {
proxy_pass http://127.0.0.1:8081/otp;
}
location /otp2/images {
proxy_pass http://127.0.0.1:8081/images;
}
# Additional web-apps with /images path
location /other-web-app/images {
proxy_pass http://127.0.0.1:8082/images;
}
# Handle remaining OTP v2 requests
location /otp {
proxy_pass http://127.0.0.1:8081/otp;
}
location /images {
proxy_pass http://127.0.0.1:8081/images;
}
}