具有不同上下文路径的Nginx反向代理

时间:2017-10-06 17:04:21

标签: tomcat nginx proxy

我正在尝试使用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_redirectrewrite添加各种值,但我没有做任何事情可以说服这些链接正确呈现。

我的应用程序是在tomcat中运行的java webapp,如果这有任何区别。我已经看到其他解决方案,我可以更改我的webapp的上下文路径,但我需要nginx透明地代理请求,而不必配置tomcat来了解nginx路径。

1 个答案:

答案 0 :(得分:2)

首先,没有什么比透明地将后端从根域代理到具有添加的基本URL的域。

如果您想将http://xyz/abc代理到http://def,则无法100%保证一切正常。您需要特定于应用程序的更改

如果您的后端API不会返回访问当前网址的网址,那么您无需担心proxy_pass。但是如果你有一个HTML,那么你需要修复所有你想要的东西。

查看我为deluge backend创建的简单配置

How to proxy calls to specific URL to deluge using NGINX?

正如你所能完成的所有sub_filter一样,用CSS,JavaScript和HTML修复网址。我必须运行它,找到问题,然后实施修复。以下是您的参考配置

location ~* /deluge/(.*) {
    sub_filter_once off;
    sub_filter_types text/css;
    sub_filter '"base": "/"' '"base": "/deluge/"';
    sub_filter '<head>' '<head>\n<base href="/deluge/">';
    sub_filter 'src="/' 'src="./';
    sub_filter 'href="/' 'href="./';
    sub_filter 'url("/' 'url("./';
    sub_filter 'url(\'/' 'url(\'./';

    set $deluge_host 192.168.33.100;
    set $deluge_port 32770;
    proxy_pass http://$deluge_host:$deluge_port/$1;
    proxy_cookie_domain $deluge_host $host;
    proxy_cookie_path / /deluge/;
    proxy_redirect  http://$deluge_host:$deluge_port/ /deluge/;
}

您可以根据自己的应用自定义上述内容。但下面是你需要的东西

location /app1/ {
    sub_filter_once off;
    sub_filter '<head>' '<head>\n<base href="/app1/">';
    sub_filter 'src="/' 'src="./';
    sub_filter 'href="/' 'href="./';
}