我尝试使用nginx在同一主机/端口上反向代理多个Web应用程序,使用不同的路径来区分应用程序。
我的nginx配置如下所示:
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $proxy_connection;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto;
proxy_set_header X-Forwarded-Ssl $proxy_x_forwarded_ssl;
proxy_set_header X-Forwarded-Port $proxy_x_forwarded_port;
upstream app1 {
server 192.168.0.1:8080;
}
upstream app2 {
server 192.168.0.2:8080;
}
server {
server_name my-application-server;
listen 80;
location /app1/ {
proxy_pass http://app1/;
}
location /app2/ {
proxy_pass http://app2/;
}
}
这会正确地代理对我的应用上的单个页面的任何请求-例如http://my-application-server/app1/context/login
,但我的应用中的任何超链接都被断开,因为它们缺少路径的app1
部分-例如,它们将我定向到http://my-application-server/context/login-success
而不是http://my-application-server/app1/context/login-success
。
我已经尝试为proxy_redirect
和rewrite
添加不同的值,但是我做的任何事情都不能使这些链接正确呈现。
我的应用程序是一个运行在tomcat上的java web应用程序,如果这有什么不同的话。我见过其他的解决方案,我可以改变我的web应用程序的上下文路径,但是我需要nginx透明地代理请求,而不必配置tomcat来知道nginx路径。
2条答案
按热度按时间eqfvzcg81#
首先,没有什么比透明地将后端从根域代理到添加了基本url的域更好的了。
如果您想将
http://xyz/abc
代理到http://def
,那么就没有办法100%保证一切正常工作。如果你的后端API是访问当前URL时不返回URL的东西,那么你就不需要担心proxy_pass。但是如果你有一个html,那么你就需要修复你所遇到的一切。
查看我为洪水后端创建的简单配置
How to proxy calls to specific URL to deluge using NGINX?
正如你所能做的,所有的sub_filter都是为了修复CSS、JavaScript和HTML中的url。我不得不运行它,发现问题,然后实现修复。下面是供你参考的配置
您可以根据您的应用程序自定义以上内容。但以下是您需要的内容
bvjveswy2#
您可以使用
rewrite
来去除路径前缀,例如参考文献: