此文记录思路,不讨论细节。
今天工作时遇到了这样一个问题,我需要在同一台机器上用tomcat启动两个不一样的java web工程,并分别提供给两个调用方调试。
我能想到两种解决方案。
第一种解决方案,是分别启动两个tomcat进程。
这个方案很简单,把tomcat目录copy一份,分别在两个tomcat的webapp下部署,修改成不同的端口号,分别启动,就完成了。虽然简单,但是启动了两个tomcat的进程,我嫌占内存,能省一点儿是一点儿。。
第二种解决方案,部署到同一个tomcat中。
这个方案也很简单,把两个项目包放到webapp目录下,分别命名为projectA和projectB,然后在server.xml中配置一下:
<Context path="/projectA" docBase="projectA" debug="0" reloadable="true" />
<Context path="/projectB" docBase="projectB" debug="0" reloadable="true" />
通过访问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之间加入了/projectA
和projectB
。
这样一来,调用方请求www.A.com/xxx
,到达nginx,由nginx改写uri,然后访问到tomcat,目的达成。