搭建 Tomcat 就像是在自家灶台间里把烤箱和炉子接通,别急着画个完美的流程图,先看看实际火花是如何迸出来的。 大量人心里总有个九宫格,当作只要选中对应的心仪版本,插上服务器就能自动生效。
这想法挺乐观,但现实往往是冷冰冰的。你得先搞清楚服务器到底是几代机器,Windows 上跑 Tomcat 那味儿跟 Linux 上的根本就不忒顺。别老想着直接让系统自动识别,有时候把 Tomcat 解压到 /usr/local 下面,直接双击运行个 jar 包试试,结局发现端口被占用了,要么日志里全是乱码。
这时候才要动真格的方式,比如用 Docker 要么专门的部署脚本,先把代码包扔进去,把端口改好,进个管住台看看是不是启动正常。别光看报错信息,去查那个管住台里的堆栈跟踪,有时候难题不在代码,而在环境变量没配对,要么刚刚运行的进程还在后台拖泥带水。 配置路径这东西,别总当作文档里的默认值就是对的。
每次部署前,最好还是看看目录结构, SSH 登录后把 Tomcat 目录拉出来,看看有没有残留的进程。有些老版本的部署脚本,可能把 jar 包压在了系统里,这时候再想卸载它,估摸得像个找茬的侦探。先关掉所有相关的 java 进程,检查 tmp 目录是不是被占满了,然后再寻思是不是这堆 jar 包根本就没被系统识别。
有时候最好办的就是重启一下服务器,把刚刚那些乱七八糟的残留进程给清理干净利落,再让 Tomcat 重新找个地方安个家。 部署完第一步,务必得看看日志。别等最终才去查,最好在启动前就盯着那个日志文件看。
要是是造环境,日志文件可能挺大,建议先加个大小限制,比如每小时只写 10M,不然硬盘要慢慢吃撑。日志里藏着最大的秘密——WebSphere 要么 Tomcat 自己发出的报错。
有时候是插件不兼容,有时候是数据库连接超时,有时候就连是个被第三方毛病的代码调用。
这时候别急着定论,去查一下那个报错堆栈,看看是不是某个第三方库跟 JDK 版本打架了。有些时候,用命令行里自带的命令直接报错,比 APP 里显示的友好提示更有用,出于 APP 那是为了用户体验写的,往往是“哎呀”这种话,而命令行往往是“连接数据库黄了”这种实锤。 别一直盯着那个报错信息看,有时候难题不在应用层,而在底层的网络要么外设。
比如数据库连接没连上,要么防火墙挡住了端口,要么某个中间件挂了。
这时候得看物理服务器的状态,看看网卡是不是正常。
有时候是网络配置不对,害得 TCP 连接超时,要么防火墙规则把 8080 端口给封了。
这时候得在服务器里动了刀,检查一下端口映射,看看是不是该打端口了。
有时候还得配个防火墙规则,让 Tomcat 能通上那个不死心的数据库。 测试区不能省,但千万别为了刷数据而刷数据。部署好之后,先跑个好办的页面,看看能不能正常访问,看看那个日志能不能正常刷出来。
要是有毛病,先看看是代码逻辑错,还是网络难题。
有时候换个浏览器要么换个 IP 试试,看看是不是客户端的难题。别一启动就满屏红字,先看看是不是那个页面的 CSS 没加载完,要么那个按钮没绑定事件。
有时候是前端和后端没对齐,这都归于用户体验范畴,不是代码毛病,但确实让人头疼。 有时候部署完直接跑个造任务,发现数据没更新,要么状态不对。
这时候别慌,先看看那个任务的-job.properties 文件是不是被改过。
有时候是那个定时任务没定时,要么那个任务被锁死了。检查任务队列,看看是不是某个任务卡住了,害得整个队列都堵住了。
有时候是那个任务本身逻辑错了,比如循环没跑通,要么那个脚本文件被注释了。
这时候要检查那个任务脚本,看看是不是路径不对,要么那个脚本文件本身就挂掉了。
有时候还得检查那个数据库,看看那个表的索引是不是没了。 有时候部署完才发现难题,比如那个网页打开是灰色的,要么那个按钮不亮。
这时候可能是那个样式表没加载,要么那个脚本文件没运行。
这时候得去查那个 JS 文件,看看是不是路径错了,要么那个文件被删了。
有时候是那个 CSS 根本没加载,害得那个页面直接是个空白。
这时候要检查那个服务器的缓存设置,要么那个浏览器的设置。
有时候还得检查那个页面的资源文件,看看是不是那个图片没加载,要么那个字体没配好。 有时候难题出在环境变量上,比如那个数据库的连接字符串没填对,要么那个配置文件里那个 key 的值不对。
这时候得去查那个配置文件的 key 值,看看是不是把那个值填错了。
有时候还得去查那个数据库的表结构,看看是不是那个表的字段没配好。
有时候还得去查那个连接池,看看是不是那个连接被占用了。
有时候还得去查那个防火墙,看看是不是那个端口没通。
有时候还得去查那个任务的调度器,看看是不是那个任务没触发。 有时候部署完才发现难题,比如那个页面打开是灰色的,要么那个按钮不亮。
这时候可能是那个样式表没加载,要么那个脚本文件没运行。
这时候得去查那个 JS 文件,看看是不是路径错了,要么那个文件被删了。
有时候是那个 CSS 根本没加载,害得那个页面直接是个空白。
这时候要检查那个服务器的缓存设置,要么那个浏览器的设置。
有时候还得检查那个页面的资源文件,看看是不是那个图片没加载,要么那个字体没配好。 有时候难题出在环境变量上,比如那个数据库的连接字符串没填对,要么那个配置文件里那个 key 的值不对。
这时候得去查那个配置文件的 key 值,看看是不是把那个值填错了。
有时候还得去查那个数据库的表结构,看看是不是那个表的字段没配好。
有时候还得去查那个连接池,看看是不是那个连接被占用了。
有时候还得去查那个防火墙,看看是不是那个端口没通。
有时候还得去查那个任务的调度器,看看是不是那个任务没触发。 有时候难题出在数据库上,比如那个数据库没启动,要么那个连接被占用了。
这时候得去查那个数据库的配置,看看是不是那个数据库没启动。
有时候还得去查那个连接池,看看是不是那个连接被占用了。
有时候还得去查那个防火墙,看看是不是那个端口没通。
有时候还得去查那个任务的调度器,看看是不是那个任务没触发。 有时候部署完才发现难题,比如那个页面打开是灰色的,要么那个按钮不亮。
这时候可能是那个样式表没加载,要么那个脚本文件没运行。
这时候得去查那个 JS 文件,看看是不是路径错了,要么那个文件被删了。
有时候是那个 CSS 根本没加载,害得那个页面直接是个空白。
这时候要检查那个服务器的缓存设置,要么那个浏览器的设置。
有时候还得检查那个页面的资源文件,看看是不是那个图片没加载,要么那个字体没配好。 有时候难题出在环境变量上,比如那个数据库的连接字符串没填对,要么那个配置文件里那个 key 的值不对。
这时候得去查那个配置文件的 key 值,看看是不是把那个值填错了。
有时候还得去查那个数据库的表结构,看看是不是那个表的字段没配好。
有时候还得去查那个连接池,看看是不是那个连接被占用了。
有时候还得去查那个防火墙,看看是不是那个端口没通。
有时候还得去查那个任务的调度器,看看是不是那个任务没触发。 有时候难题出在数据库连接上,比如那个 JDBC 配置没配好,要么那个连接池配置错了。
这时候得去查那个配置文件,看看是不是那个 SQL 语句没写对。
有时候还得去查那个数据库的连接,看看是不是那个连接没建立成功。
有时候还得去查那个防火墙,看看是不是那个端口没通。
有时候还得去查那个任务的调度器,看看是不是那个任务没触发。 有时候部署完才发现难题,比如那个页面打开是灰色的,要么那个按钮不亮。
这时候可能是那个样式表没加载,要么那个脚本文件没运行。
这时候得去查那个 JS 文件,看看是不是路径错了,要么那个文件被删了。
有时候是那个 CSS 根本没加载,害得那个页面直接是个空白。
这时候要检查那个服务器的缓存设置,要么那个浏览器的设置。
有时候还得检查那个页面的资源文件,看看是不是那个图片没加载,要么那个字体没配好。 有时候难题出在环境变量上,比如那个数据库的连接字符串没填对,要么那个配置文件里那个 key 的值不对。
这时候得去查那个配置文件的 key 值,看看是不是把那个值填错了。
有时候还得去查那个数据库的表结构,看看是不是那个表的字段没配好。
有时候还得去查那个连接池,看看是不是那个连接被占用了。
有时候还得去查那个防火墙,看看是不是那个端口没通。
有时候还得去查那个任务的调度器,看看是不是那个任务没触发。 有时候难题出在数据库表结构上,比如那个表的列名没匹配,要么那个数据库版本不兼容。
这时候得去查那个数据库的表结构,看看是不是那个表没创建成功。
有时候还得去查那个任务的调度器,看看是不是那个任务没触发。
有时候还得去查那个防火墙,看看是不是那个端口没通。
有时候还得去查那个任务的配置,看看是不是那个任务没执行。 有时候部署完才发现难题,比如那个页面打开是灰色的,要么那个按钮不亮。
这时候可能是那个样式表没加载,要么那个脚本文件没运行。
这时候得去查那个 JS 文件,看看是不是路径错了,要么那个文件被删了。
有时候是那个 CSS 根本没加载,害得那个页面直接是个空白。
这时候要检查那个服务器的缓存设置,要么那个浏览器的设置。
有时候还得检查那个页面的资源文件,看看是不是那个图片没加载,要么那个字体没配好。 有时候难题出在环境变量上,比如那个数据库的连接字符串没填对,要么那个配置文件里那个 key 的值不对。
这时候得去查那个配置文件的 key 值,看看是不是把那个值填错了。
有时候还得去查那个数据库的表结构,看看是不是那个表的字段没配好。
有时候还得去查那个连接池,看看是不是那个连接被占用了。
有时候还得去查那个防火墙,看看是不是那个端口没通。
有时候还得去查那个任务的调度器,看看是不是那个任务没触发。 有时候部署完才发现难题,比如那个页面打开是灰色的,要么那个按钮不亮。
这时候可能是那个样式表没加载,要么那个脚本文件没运行。
这时候得去查那个 JS 文件,看看是不是路径错了,要么那个文件被删了。
有时候是那个 CSS 根本没加载,害得那个页面直接是个空白。
这时候要检查那个服务器的缓存设置,要么那个浏览器的设置。
有时候还得检查那个页面的资源文件,看看是不是那个图片没加载,要么那个字体没配好。 有时候难题出在环境变量上,比如那个数据库的连接字符串没填对,要么那个配置文件里那个 key 的值不对。
这时候得去查那个配置文件的 key 值,看看是不是把那个值填错了。
有时候还得去查那个数据库的表结构,看看是不是那个表的字段没配好。
有时候还得去查那个连接池,看看是不是那个连接被占用了。
有时候还得去查那个防火墙,看看是不是那个端口没通。
有时候还得去查那个任务的调度器,看看是不是那个任务没触发。 有时候难题出在数据库连接池上,比如那个连接数没配好,要么那个连接池配置错了。
这时候得去查那个配置文件,看看是不是那个连接数量没设对。
有时候还得去查那个数据库的连接,看看是不是那个连接没建立成功。
有时候还得去查那个防火墙,看看是不是那个端口没通。
有时候还得去查那个任务的调度器,看看是不是那个任务没触发。 有时候部署完才发现难题,比如那个页面打开是灰色的,要么那个按钮不亮。
这时候可能是那个样式表没加载,要么那个脚本文件没运行。
这时候得去查那个 JS 文件,看看是不是路径错了,要么那个文件被删了。
有时候是那个 CSS 根本没加载,害得那个页面直接是个空白。
这时候要检查那个服务器的缓存设置,要么那个浏览器的设置。
有时候还得检查那个页面的资源文件,看看是不是那个图片没加载,要么那个字体没配好。 有时候难题出在环境变量上,比如那个数据库的连接字符串没填对,要么那个配置文件里那个 key 的值不对。
这时候得去查那个配置文件的 key 值,看看是不是把那个值填错了。
有时候还得去查那个数据库的表结构,看看是不是那个表的字段没配好。
有时候还得去查那个连接池,看看是不是那个连接被占用了。
有时候还得去查那个防火墙,看看是不是那个端口没通。
有时候还得去查那个任务的调度器,看看是不是那个任务没触发。 有时候部署完才发现难题,比如那个页面打开是灰色的,要么那个按钮不亮。
这时候可能是那个样式表没加载,要么那个脚本文件没运行。
这时候得去查那个 JS 文件,看看是不是路径错了,要么那个文件被删了。
有时候是那个 CSS 根本没加载,害得那个页面直接是个空白。
这时候要检查那个服务器的缓存设置,要么那个浏览器的设置。
有时候还得检查那个页面的资源文件,看看是不是那个图片没加载,要么那个字体没配好。 有时候难题出在环境变量上,比如那个数据库的连接字符串没填对,要么那个配置文件里那个 key 的值不对。
这时候得去查那个配置文件的 key 值,看看是不是把那个值填错了。
有时候还得去查那个数据库的表结构,看看是不是那个表的字段没配好。
有时候还得去查那个连接池,看看是不是那个连接被占用了。
有时候还得去查那个防火墙,看看是不是那个端口没通。
有时候还得去查那个任务的调度器,看看是不是那个任务没触发。 有时候难题出在数据库表结构上,比如那个表的列名没匹配,要么那个数据库版本不兼容。
这时候得去查那个数据库的表结构,看看是不是那个表没创建成功。
有时候还得去查那个任务的调度器,看看是不是那个任务没触发。
有时候还得去查那个防火墙,看看是不是那个端口没通。
有时候还得去查那个任务的配置,看看是不是那个任务没执行。 有时候部署完才发现难题,比如那个页面打开是灰色的,要么那个按钮不亮。
这时候可能是那个样式表没加载,要么那个脚本文件没运行。
这时候得去查那个 JS 文件,看看是不是路径错了,要么那个文件被删了。
有时候是那个 CSS 根本没加载,害得那个页面直接是个空白。
这时候要检查那个服务器的缓存设置,要么那个浏览器的设置。
有时候还得检查那个页面的资源文件,看看是不是那个图片没加载,要么那个字体没配好。 有时候难题出在环境变量上,比如那个数据库的连接字符串没填对,要么那个配置文件里那个 key 的值不对。
这时候得去查那个配置文件的 key 值,看看是不是把那个值填错了。
有时候还得去查那个数据库的表结构,看看是不是那个表的字段没配好。
有时候还得去查那个连接池,看看是不是那个连接被占用了。
有时候还得去查那个防火墙,看看是不是那个端口没通。
有时候还得去查那个任务的调度器,看看是不是那个任务没触发。 有时候难题出在数据库连接池上,比如那个连接数没配好,要么那个连接池配置错了。
这时候得去查那个配置文件,看看是不是那个连接数量没设对。
有时候还得去查那个数据库的连接,看看是不是那个连接没建立成功。
有时候还得去查那个防火墙,看看是不是那个端口没通。
有时候还得去查那个任务的调度器,看看是不是那个任务没触发。 有时候部署完才发现难题,比如那个页面打开是灰色的,要么那个按钮不亮。
这时候可能是那个样式表没加载,要么那个脚本文件没运行。
这时候得去查那个 JS 文件,看看是不是路径错了,要么那个文件被删了。
有时候是那个 CSS 根本没加载,害得那个页面直接是个空白。
这时候要检查那个服务器的缓存设置,要么那个浏览器的设置。
有时候还得检查那个页面的资源文件,看看是不是那个图片没加载,要么那个字体没配好。 有时候难题出在环境变量上,比如那个数据库的连接字符串没填对,要么那个配置文件里那个 key 的值不对。
这时候得去查那个配置文件的 key 值,看看是不是把那个值填错了。
有时候还得去查那个数据库的表结构,看看是不是那个表的字段没配好。
有时候还得去查那个连接池,看看是不是那个连接被占用了。
有时候还得去查那个防火墙,看看是不是那个端口没通。
有时候还得去查那个任务的调度器,看看是不是那个任务没触发。 有时候难题出在数据库表结构上,比如那个表的列名没匹配,要么那个数据库版本不兼容。
这时候得去查那个数据库的表结构,看看是不是那个表没创建成功。
有时候还得去查那个任务的调度器,看看是不是那个任务没触发。
有时候还得去查那个防火墙,看看是不是那个端口没通。
有时候还得去查那个任务的配置,看看是不是那个任务没执行。 有时候部署完才发现难题,比如那个页面打开是灰色的,要么那个按钮不亮。
这时候可能是那个样式表没加载,要么那个脚本文件没运行。
这时候得去查那个 JS 文件,看看是不是路径错了,要么那个文件被删了。
有时候是那个 CSS 根本没加载,害得那个页面直接是个空白。
这时候要检查那个服务器的缓存设置,要么那个浏览器的设置。
有时候还得检查那个页面的资源文件,看看是不是那个图片没加载,要么那个字体没配好。 有时候难题出在环境变量上,比如那个数据库的连接字符串没填对,要么那个配置文件里那个 key 的值不对。
这时候得去查那个配置文件的 key 值,看看是不是把那个值填错了。
有时候还得去查那个数据库的表结构,看看是不是那个表的字段没配好。
有时候还得去查那个连接池,看看是不是那个连接被占用了。
有时候还得去查那个防火墙,看看是不是那个端口没通。
有时候还得去查那个任务的调度器,看看是不是那个任务没触发。 有时候部署完才发现难题,比如那个页面打开是灰色的,要么那个按钮不亮。
这时候可能是那个样式表没加载,要么那个脚本文件没运行。
这时候得去查那个 JS 文件,看看是不是路径错了,要么那个文件被删了。
有时候是那个 CSS 根本没加载,害得那个页面直接是个空白。
这时候要检查那个服务器的缓存设置,要么那个浏览器的设置。
有时候还得检查那个页面的资源文件,看看是不是那个图片没加载,要么那个字体没配好。 有时候难题出在环境变量上,比如那个数据库的连接字符串没填对,要么那个配置文件里那个 key 的值不对。
这时候得去查那个配置文件的 key 值,看看是不是把那个值填错了。
有时候还得去查那个数据库的表结构,看看是不是那个表的字段没配好。
有时候还得去查那个连接池,看看是不是那个连接被占用了。
有时候还得去查那个防火墙,看看是不是那个端口没通。
有时候还得去查那个任务的调度器,看看是不是那个任务没触发。