在 Debian 上通过 Tomcat 配置虚拟主机(Virtual Host),本质是在 server.xml 中配置 <Host>,并配合目录结构和(可选)Apache/Nginx 做反向代理。下面按最常见、最稳妥的方式说明。
假设:
www.a.comwww.b.comserver.xml路径一般是:
/etc/tomcat9/server.xml
或
/opt/tomcat/conf/server.xml
在 <Engine> 标签内添加多个 <Host>:
<Engine name="Catalina" defaultHost="www.a.com">
<Host name="www.a.com" appBase="webapps/a"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="a_access_log"
suffix=".txt"
pattern="%h %l %u %t "%r" %s %b"/>
</Host>
<Host name="www.b.com" appBase="webapps/b"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="b_access_log"
suffix=".txt"
pattern="%h %l %u %t "%r" %s %b"/>
</Host>
</Engine>
mkdir -p /var/lib/tomcat9/webapps/a
mkdir -p /var/lib/tomcat9/webapps/b
放入应用:
webapps/a/ROOT.war
webapps/b/ROOT.war
或直接放静态内容:
webapps/a/ROOT/index.html
vim /etc/hosts
127.0.0.1 www.a.com
127.0.0.1 www.b.com
systemctl restart tomcat9
访问:
http://www.a.com:8080
http://www.b.com:8080
✅ 虚拟主机已生效
server {
server_name www.a.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
}
}
server {
server_name www.b.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
}
}
nginx -t
systemctl reload nginx
✅ 域名直接访问,无需端口
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000" />
⚠️ 需要 root 权限,安全性差
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"/>
defaultHost 指向它即可。
❌ 域名没解析到服务器
❌ Host name 和 proxy_set_header Host 不一致
❌ WAR 没放 ROOT.war
❌ Tomcat 没重启
✅ 最简方案
<Host> 配虚拟主机如果你愿意,我可以:
直接说你用的 Tomcat 版本和 Debian 版本即可。