Tomca配置
配置多个端口
一个Service可以有多个Connector这里配置一个简单的规则,给HTTP/1.1协议配置多个端口。Connector的详细解释可以参考另一位大神写的博客
详解tomcat的连接数与线程池 - 编程迷思 - 博客园 (cnblogs.com)
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="8082" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
Host选择域名
一个Service里只能配置一个Engine但是可以在Engine节点下配置多个Host。name配置域名,appBase配置应用的位置。
#C:\Windows\System32\drivers\etc\hosts 127.0.0.1 localhost 127.0.0.1 localserver
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> <Host name="localserver" appBase="webapps2" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host>
Host默认域名
如果域名对于的是本机但没有对应的Host存在,则寻找默认的Host。Engine.defaultHost配置默认的Host
<Engine name="Catalina" defaultHost="localserver"> <!-- <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> --> <Host name="localserver" appBase="webapps2" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> </Engine>
Host自动部署
Host.autoDeploy为true则触发自动部署,项目启动后再webapps下放入app2应用,不用重启tomcat也可以访问到app2的服务。
Context应用
一个Host下可以有多个应用,默认的我们没有做任何的配置,将应用放到appBase指定的目录里,tomcat可以自动加载多个应用,应用名为war包名称或解压后的根目录名。除此之外我们还可以单独配置Context.将应用放到指定的目录,并指定应用名。
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> <Context docBase="D:/tomcat9/app1" path="/outapp"></Context> </Host>
Context热部署
reloadable开启热部署。reloadable属性指示tomcat是否在运行时监控在WEB-INF/classes和WEB-INF/lib目录下class文件的改动。如果值为true,那么当class文件改动时,会触发Web应用的重新加载。
<Context docBase="D:/tomcat9/app1" path="/outapp" reloadable="true"></Context>
多个Service
一个Server可以对应多个Service可以理解为隔离服务。每一个Service下多个Connector连接器和一个Engine引擎,一个Engine引擎对应多个Host,一个Host对应多个Context,一个Context对应多个Wrapper.
<Service name="Catalina"> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Engine name="Catalina" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> </Engine> </Service> <Service name="Catalina"> <Connector port="9080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Engine name="Catalina" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="localhost" appBase="webapps2" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> </Engine> </Service>
Value责任链
tomcat分为4个等级的容器从上到下分别是Engine,Host,Context,Wrapper。容器与容器直接串联,高层次容器的末尾是下一层容器的frist。在每一层都加入Value标签该标签就是向责任链中添加节点。这里使用的是log功能的value。
<Service name="Catalina"> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Engine name="Catalina" defaultHost="localhost"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="1" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="2" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> <Context docBase="D:/tomcat9/app1" path="/outapp"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="3" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Context> </Host> </Engine> </Service>
优化启动速度
1.删除掉 webapps 文件夹下不需要的工程。
2.JVM 的类加载器在加载类时,需要查找每一个 JAR 文件,去找到所需要的类。如果删除了不需要的 JAR 文件,查找的速度就会快一些。这里请注意:Web 应用中的 lib 目录下不应该出现 Servlet API 或者 Tomcat 自身的 JAR,这些 JAR 由 Tomcat 负责提供。如果你是使用 Maven 来构建你的应用,对 Servlet API 的依赖应该指定为provided。
3.及时清理日志,删除 logs 文件夹下不需要的日志文件。同样还有 work 文件夹下的 catalina 文件夹,它其实是 Tomcat 把 JSP 转换为 Class 文件的工作目录。有时候我们也许会遇到修改了代码,重启了 Tomcat,但是仍没效果,这时候便可以删除掉这个文件夹,Tomcat 下次启动的时候会重新生成。
4.如果你的项目没有使用 JSP 作为 Web 页面模板,你完全可以把 TLD 扫描禁止掉。方法是,找到 Tomcat 的conf/目录下的context.xml文件,在这个文件里 Context 标签下,加上 JarScanner 和 JarScanFilter 子标签,像下面这样。
<Context> <JarScanner> <JarScanFilter defaultTLDScan="false"/> </JarScanner> </Context>
5.关闭 WebSocket 支持找到 Tomcat 的conf/目录下的context.xml文件。更进一步,如果你不需要 WebSocket 这个功能,你可以把 Tomcat lib 目录下的websocket-api.jar和tomcat-websocket.jar这两个 JAR 文件删除掉,进一步提高性能。
<Context containerSciFilter="org.apache.tomcat.websocket.server.WsSci"> <JarScanner> <JarScanFilter defaultTLDScan="false"/> </JarScanner> </Context>
6.关闭 JSP 支持我们发现关闭 JSP 用的也是 containerSciFilter 属性,如果你想把 WebSocket 和 JSP 都关闭,那就这样配置。
<Context containerSciFilter="org.apache.tomcat.websocket.server.WsSci | org.apache.jasper.servlet.JasperInitializer"> <JarScanner> <JarScanFilter defaultTLDScan="false"/> </JarScanner> </Context>
7.禁止 Servlet 注解扫描,Servlet 3.0 引入了注解 Servlet,Tomcat 为了支持这个特性,会在 Web 应用启动时扫描你的类文件,因此如果你没有使用 Servlet 注解这个功能,可以告诉 Tomcat 不要去扫描 Servlet 注解。具体配置方法是,在你的 Web 应用的web.xml文件中这么配置。
<web-app metadata-complete="true"></web-app>
8.并行启动多个 Web 应用Tomcat 启动的时候,默认情况下 Web 应用都是一个一个启动的,等所有 Web 应用全部启动完成,Tomcat 才算启动完毕。如果在一个 Tomcat 下你有多个 Web 应用,为了优化启动速度,你可以配置多个应用程序并行启动,可以通过修改server.xml中的配置。Engine中的startStopThreads表示多个Host并行启动,Host中的startStopThreads表示多个应用并行启动。
<Engine name="Catalina" defaultHost="localhost" startStopThreads="0"> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" startStopThreads="0"> </Host> </Engine>