LabHub
学习 学习路径 课程

Tomcat 与 nginx 运维

打开 Tomcat 看看里面有什么

在 LabHub 中继续学习

一句话总结

Tomcat只要知道目录七个角色就能说明大部分运行情况,其中实际发生故障的地方是bin/setenv.sh·work/·logs/catalina.out是三。

概念图: 在独立执行的Tomcat上上传WAR · bin/setenv.sh · 一定要放在setenv.sh里。 · work/

为什么还是Tomcat呢

穿弹力靴的话,里面有内置的Tomcat。java -jar以结束。 但是如果去国内SI现场的话,仍然有在独立执行的Tomcat上上传WAR的系统。 要多得多。原因不是技术上的偏好。

所以新员工在第一周被淘汰的事情就是“请把汤姆猫放上去”。 还有那一刻systemctl start tomcat遇到了这个不行的服务器。

目录地图

/opt/tomcat
├── bin/       기동·정지 스크립트. catalina.sh, startup.sh, shutdown.sh, setenv.sh
├── conf/      설정. server.xml, web.xml, context.xml, tomcat-users.xml, logging.properties
├── lib/       톰캣 자신과 모든 웹앱이 공유하는 JAR (JDBC 드라이버를 여기 두는 관행)
├── logs/      catalina.out, localhost_access_log.*.txt, 각종 *.log
├── webapps/   배포 대상. WAR 를 두면 자동으로 같은 이름 디렉터리로 전개된다
├── work/      JSP 를 컴파일한 .java/.class 캐시
└── temp/      java.io.tmpdir

只说一下现场实际出现问题的点。

server.xml的层次

server.xml是俄罗斯娃娃。从外面往里读的话理解得很快。

<Server port="8005" shutdown="SHUTDOWN">      <!-- JVM 하나 -->
  <Service name="Catalina">                   <!-- 커넥터들 + 엔진 하나 -->
    <Connector port="8080" protocol="HTTP/1.1" ... />   <!-- 바깥과 만나는 문 -->
    <Engine name="Catalina" defaultHost="localhost">    <!-- 요청 처리 엔진 -->
      <Host name="localhost" appBase="webapps"          <!-- 가상 호스트 -->
            unpackWARs="true" autoDeploy="true">
        <Valve className="...AccessLogValve" pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>
    </Engine>
  </Service>
</Server>

context.xml — 网络应用程序单元设置

conf/context.xml恩全域,conf/Catalina/localhost/<앱이름>.xml是每个应用程序的设置。 使用后者的话**webapps可以服务外部的目录**(docBase). 分发成果物/app/deploy/order在这里,不碰Tomcat的运营方式就出来了。

DB连接池(<Resource>)也一般在这里。所以“DB连接信息在哪里”的 答案一般是context.xml或应用程序的属性文件中的一者。

移动和静止——没有systemd时

# 기동 (백그라운드, catalina.out 으로 로그)
/opt/tomcat/bin/catalina.sh start

# 포그라운드 (컨테이너에서 쓰는 방식. 로그가 터미널로)
/opt/tomcat/bin/catalina.sh run

# 정지 (8005 포트로 SHUTDOWN 전송, 종료 대기)
/opt/tomcat/bin/catalina.sh stop 30 -force

stop后面的30 -force是“等30秒,如果没死就kill”。 在操作脚本中最好放这个。如果有正在处理会话的线程的话 汤姆猫有时会乖乖地不死。

确认是否启动的最可靠的方法不是过程,而是日志和端口

grep 'Server startup in' /opt/tomcat/logs/catalina.out | tail -1
ss -ltn | grep 8080

实际上存在“进程正在运行,但端口未打开”。 只有由于端口冲突或初始化失败而导致连接器死亡的情况。只看进程 看到“上来了”后,5分钟后又接到电话。

在现场相遇的样子

在SI现场第一次接触Tomcat的第一周,通常会经历这三种情况之一。

这三个问题都不是一旦不知道Tomcat就会出现的,而是因为不知道某个文件做什么而出现的。所以目录地图是第一位的。