Appearance
单 Tomcat 实例部署多个 WAR 应用
最终实现的效果:在同一个 Tomcat 实例中部署多个应用并通过不同的子域名访问,同时在 Java 应用程序上下文中隐藏应用名(即不包含 /app1 或 /app2)。
1. 前提
确保 DNS 中已经设置了 app1.mydomain.com 和 app2.mydomain.com 指向你的服务器 IP 地址。
2. Tomcat 配置
假设你已经将 app1.war 和 app2.war 部署到了 Tomcat。默认情况下,Tomcat 会将它们部署为 /app1 和 /app2。
你可以通过修改 Tomcat 的 server.xml 文件来设置虚拟主机,以便通过不同的域名访问不同的应用。
Note:确保
appBase指向正确的目录。
示例配置:
XML
<Host name="app1.mydomain.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Context path="" docBase="app1" reloadable="true"/>
</Host>
<Host name="app2.mydomain.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Context path="" docBase="app2" reloadable="true"/>
</Host>1
2
3
4
5
6
7
2
3
4
5
6
7
这里的 path="" 将应用的上下文路径设置为空,这样在应用内部获取路径时,不会包含 /app1 或 /app2。
3. Nginx 配置
在 Nginx 中设置反向代理,将不同的子域名指向不同的应用。
首先,安装 Nginx,然后编辑 Nginx 配置文件(通常位于 /etc/nginx/nginx.conf 或 /etc/nginx/sites-available/default)。
示例配置:
INI
server {
listen 80;
server_name app1.mydomain.com;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
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 $scheme;
}
}
server {
listen 80;
server_name app2.mydomain.com;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
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 $scheme;
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
可以看到实际上只有 server_name 的配置不同。
Nginx 会根据不同的子域名将请求转发到 Tomcat。在 proxy_pass 中,我们不需要再指定 /app1 或 /app2,因为 Tomcat 的虚拟主机配置已经处理了子域名和应用路径的映射。
通过 proxy_set_header Host $host; 配置。当客户端请求 app1.mydomain.com 或 app2.mydomain.com 时,Nginx 会将原始的 Host 头信息(即 app1.mydomain.com 或 app2.mydomain.com)保留并传递给 Tomcat。Tomcat 会根据这个 Host 头信息正确匹配到对应的虚拟主机配置。