Tomcat绑定域名最直接的办法就是修改conf目录下server.xml里的Host节点,把name从默认的localhost换成语你的域名,同时确保云服务器安全组和防火墙放行对应端口。
很多Java开发者在项目上线前都会卡在最后这一步:本地测试一切正常,一放到服务器上、一换成域名访问就开始出各种幺蛾子,其实Tomcat本身并不区分”本机访问”和”外网访问”,它只认server.xml里定义的虚拟主机名,你把域名写进配置文件,它才知道该把请求路由到哪里。
tomcat绑定域名怎么配置:最稳妥的三步走
找到server.xml里的Host节点
打开Tomcat安装目录下的conf/server.xml,用编辑器搜索”Host”关键词,你会看到这样一段默认配置:
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
这里的name就是Tomcat当前认领的主机名,默认只有localhost,所以当你尝试用域名替换IP访问时,Tomcat根本不认识这个域名,直接给你返回404或者断开连接。
修改name属性并保留旧Host
把name=”localhost”整体替换成你的域名,比如name=”www.example.com”,有个细节容易被忽略:建议把原Host注释掉或者再新增一条并行配置,这样通过IP调试或者本地测试时依然能正常访问,行业共识认为,同时保留两个Host是处理测试环境和线上环境切换最省事的做法。
<Host name="www.example.com" appBase="/data/www/myapp" unpackWARs="true" autoDeploy="true">
调整appBase指向项目目录
appBase属性默认指向webapps,如果你的项目是打成war包扔进去的,保持默认就行,但如果是前后端分离工程,前端dist目录和后端API想分开管理,直接把appBase指向独立目录会更清爽,data/www/myapp,改完先执行shutdown.sh,再执行startup.sh,让配置生效:
/usr/local/tomcat/bin/shutdown.sh /usr/local/tomcat/bin/startup.sh
这里补充一个容易踩的坑:如果项目里有涉及session跨域或者cookie域名的逻辑,要提前把上下文路径和域名绑定配套起来,否则换域名后很容易出现session丢失或cookie串域问题。
tomcat绑定域名访问不了:八成卡在端口和解析上
域名解析没有真正生效
改了配置还进不去,第一步不是怀疑代码,而是先ping一下你的域名,如果ping出来的IP跟服务器IP对不上,或者完全没有响应,说明DNS解析还没完成,国内主流云服务商都提供域名解析面板,添加一条A记录指向服务器公网IP,等几分钟到几小时不等,解析才会全球生效。
安全组和防火墙拦截了端口
这是相当一部分人的崩溃点:配置全部改对、Tomcat正常启动、域名解析也成功,但访问就是超时,根因几乎都在云服务器安全组或者本机防火墙,如果你之前一直用IP加8080测试,那么安全组很可能只放行了8080,80端口根本没有打开,去控制台安全组添加一条入方向规则,协议选TCP,端口填80,来源设置为0.0.0.0/0,保存后几秒钟就生效。
Linux系统层面同样需要检查防火墙,CentOS用户常用这两条命令:
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload
在简米云或酷番云上做tomcat云服务器绑定域名时,安全组的操作路径大同小异,核心就是确保80端口对外开放。
项目根路径和前端路由的坑
如果你的项目是前后端分离的,前端打包后的dist目录放到了webapps/ROOT下,访问域名时切记不要带项目名,很多人遇到tomcat绑定域名后访问出现404,其实是因为仍然用http://域名/项目名/这种带Context Path的方式访问,而Tomcat的conf/Catalina目录下又在映射其他路径,两者冲突就报了404。
tomcat绑定域名和nginx反代:什么时候该上nginx
直连Tomcat适合轻量部署
如果你的服务器数量不多、部署的是一个中型Java应用、也不打算做负载均衡,直接把域名绑到Tomcat上完全够用,Tomcat本身就是个完整的HTTP服务器,处理业务请求的能力并不差,静态资源性能比nginx弱一些,但对常规企业应用来说差距不算明显。
nginx前置解决多应用和证书管理
当你遇到下面这些情况,在tomcat绑定域名和nginx反代之间做选择时,nginx明显更合适:
- 一台服务器同时运行Java、Python、Node多个应用,需要按域名或路径做分流
- HTTPS证书不想反复导入Tomcat的keystore,希望统一交给nginx管理
- 静态资源体量比较大,想借助nginx的缓存和压缩能力减轻Tomcat压力
nginx配置反代时,server块大致长这样:
server {
listen 80;
server_name www.example.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
注意proxy_set_header Host这行必不可少,否则Tomcat收到的请求头里缺少真实Host信息,绑定域名配置就会被跳过,直接落到默认Host上。
tomcat绑定域名后如何配置https:把证书装进keystore
申请证书并生成jks文件
目前申请免费DV证书的路子很多,拿到的证书文件一般包含私钥和证书链,要让它被Tomcat使用,需要转换成Java标准的keystore格式,如果你拿到的是.pfx或.p12格式文件,直接通过keytool导入:
keytool -importkeystore -srckeystore yourdomain.pfx -srcstoretype PKCS12 -destkeystore tomcat.keystore -deststoretype JKS
修改server.xml的Connector节点
把生成的tomcat.keystore复制到conf目录,然后打开server.xml,在原有8080端口Connector下方新增一个443端口的SSL配置:
<Connector
port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="200" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="conf/tomcat.keystore"
certificateKeystorePassword="你的密码"
type="RSA" />
</SSLHostConfig>
</Connector>
重启Tomcat后,访问https://www.example.com就能看到地址栏的小锁图标,如果想强制HTTP跳转到HTTPS,在web.xml里配置security-constraint即可,批量把所有请求转发到443端口。
tomcat绑定域名常见问题解答
问:tomcat绑定域名后访问显示localhost还是旧页面,怎么解决?
浏览器缓存或本机hosts文件里如果写死了旧解析记录,就会出现这种情况,先清空浏览器缓存,Windows下执行ipconfig/flushdns刷新DNS缓存,服务器端则要确认server.xml中是否同时存在两个Host,旧Host没删掉就会兜底接管请求。
问:绑定域名时能不能一个Tomcat对应多个域名?
完全支持,复制一条新的Host节点,把name改成第二个域名,appBase指向相同或不同的项目目录,Tomcat会同时监听并正确路由,需要注意每个Host下的Context映射要独立配置,否则容易出现域名A访问到域名B项目的问题。
问:修改server.xml后启动失败,跟绑定域名有关系吗?
如果报错指向Connector端口冲突,多数是8080或443端口被其他进程占用,用netstat -tlnp查看端口占用情况,如果报错提示SSL证书加载失败,大概率是证书文件路径写错了,server.xml对绝对路径和相对路径有严格要求,建议优先使用绝对路径。
Tomcat绑定域名本质上就是一次配置层面的翻译工作:把域名翻译成Tomcat认识的主机名,把端口和目录对应好,再把外网请求链路打通,把握住这三个核心点,无论你是直连还是加nginx做反代,都能顺顺利利跑起来。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/665685.html




