用单个tomcat进程启动多个项目,并对请求方无感知

此文记录思路,不讨论细节。

用单个tomcat进程启动多个项目,并对请求方无感知_第1张图片
tomcat.jpg

今天工作时遇到了这样一个问题,我需要在同一台机器上用tomcat启动两个不一样的java web工程,并分别提供给两个调用方调试。

我能想到两种解决方案。

第一种解决方案,是分别启动两个tomcat进程。

这个方案很简单,把tomcat目录copy一份,分别在两个tomcat的webapp下部署,修改成不同的端口号,分别启动,就完成了。虽然简单,但是启动了两个tomcat的进程,我嫌占内存,能省一点儿是一点儿。。

第二种解决方案,部署到同一个tomcat中。

这个方案也很简单,把两个项目包放到webapp目录下,分别命名为projectA和projectB,然后在server.xml中配置一下:



通过访问www.xxx.com/projectA/xxxx链接来请求第一个工程,访问www.xxx.com/projectB/xxx链接来请求第二个工程。

这样就完成了在一个tomcat进程中部署两个项目。不过这个方案存在一个问题,请求的uri与原uri不一致,原本我访问projectA的uri是/xxxx,现在我需要通过/projectA/xxxx来访问。也就是说我要在原本的uri前加上/projectA,这个对于提供给调用方调试是不允许的,我总不能让他们在调试的时候修改uri,调试完成再改回去吧?所以说,这个方案不可行,需要再想想。

那么,想要在一个进程里启动两个项目,还不想改动原来的uri,该怎么做?

也许能用nginx来实现这一想法。

tomcat还是按照上边的第二种解决方案来部署,实现在一个进程里启动两个项目。

假设第一个项目的域名是www.A.com,第二个项目的域名是www.B.com,那么,我们可以根据域名,对两个项目分别代理:

server {
    listen 80;
    server_name  www.A.com;
    location ^~ / {
        proxy_set_header Host $host;
        proxy_set_header X-Remote-Addr $remote_addr;
        proxy_set_header X-Request-URL $scheme://$host$request_uri;
        proxy_pass http://www.A.com/projectA/$request_uri;
    }
}

server {
    listen 80;
    server_name  www.B.com;
    location ^~ / {
        proxy_set_header Host $host;
        proxy_set_header X-Remote-Addr $remote_addr;
        proxy_set_header X-Request-URL $scheme://$host$request_uri;
        proxy_pass http://www.B.com/projectB/$request_uri;
    }
}

上面的nginx配置就实现了对两个域名分别代理,通过proxy_pass配置,对uri做修改,分别在domain和uri之间加入了/projectAprojectB

这样一来,调用方请求www.A.com/xxx,到达nginx,由nginx改写uri,然后访问到tomcat,目的达成。

你可能感兴趣的:(用单个tomcat进程启动多个项目,并对请求方无感知)