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

7

我想使用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 Web应用程序,如果有区别的话。 我已经看到其他解决方案,我可以更改我的Web应用程序的上下文路径,但我需要Nginx能够透明地代理请求,而不需要Tomcat配置了解Nginx路径。
2个回答

5
首先,没有像透明代理一个后端从根域到带有添加基本URL的域名一样的东西。
如果您想将http://xyz/abc代理到http://def,那么没有100%的保证可以使所有内容正常工作。您需要进行特定于应用程序的更改。
如果您的后端API是不返回访问当前URL的URL,则无需担心proxy_pass。但是,如果您有HTML,则需要修复出现的所有问题。
请参见我为deluge后端创建的简单配置。 如何使用NGINX将对特定URL的调用代理到deluge? 正如您所看到的,所有子过滤器都是为了修复CSS、JavaScript和HTML中的URL。我必须运行它,找到问题,然后实施修复。以下是供您参考的配置。
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="./';
}

1
谢谢你的回答 - 很遗憾没有简单的解决方案,但是你的回答给了我足够的线索来开始研究我的应用程序规则。 - olambert

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接