龙空技术网

Tomcat 原理、调优和错误汇总

技术很有趣 772

前言:

此刻咱们对“nginxtomcatcgi问题”可能比较珍视,我们都想要分析一些“nginxtomcatcgi问题”的相关知识。那么小编在网络上汇集了一些有关“nginxtomcatcgi问题””的相关文章,希望各位老铁们能喜欢,兄弟们快快来学习一下吧!

本地环境:Tomcat 6、Windows 10、Java 1.7、myeclipse 10

一、使用方法

1.1 Tomcat 部署静态页面

参考链接:

二、使用错误

2.1 503 Service Unavailable

原因:

2.2 The web application [/project-name] registered the JDBC driver [oracle.jdbc.driver.OracleDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.

或者The web application [/project-name] registered the JDBC driver [com.alibaba.druid.proxy.DruidDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.

可能存在的问题

数据库账号密码错误有多个数据库配置源jar包问题,把连接jdbc的jar包,拷贝到tomcate的lib目录下就可以了,如:ojdbc14.jar服务器内存冲突,重启系统Tomcat内存不够Window->Preferences->tomcat 点击右侧的按钮,Creat Launch Configuration,在你对应的tomcat属性Aarguments下面添加一句话:-Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=256m误报:

实现ServletContextListener,然后再contextDestroyed()方法中添加如下代码:

Enumeration drivers = DriverManager.getDrivers();

while (drivers.hasMoreElements()) {

Driver driver = drivers.nextElement();

try {

DriverManager.deregisterDriver(driver);

logger.info(String.format(“deregistering jdbc driver: %s”, driver));

} catch (SQLException e) {

e.printStackTrace();

logger.error(String.format(“deregistering jdbc driver: %s”, driver));

}

}

最后在web.xml中注册自己的监听器,问题解决。

2.3 lib1.so: lib2.so: 无法打开共享对象文件: 没有那个文件或目录

(1)如果共享库文件安装到了/lib或/usr/lib目录下, 那么需执行一下ldconfig命令

(2)

 # cat /etc/ld.so.conf include ld.so.conf.d/*.conf # echo "/usr/local/lib" >> /etc/ld.so.conf # ldconfig

(3) export LD_LIBRARY_PATH=…/webapps/项目名称/WEB-INF/classes

参考链接:

myeclipse修改代码后无法实时加载到tomcat

暂未解决

三、原理

概述

HTTP server主要用来给浏览器等客户端提供静态资源的访问功能,还有代理服务器、负载均衡等功能。当然,通过CGI/Servlet技术,也可以将处理过的动态内容通过HTTP Server分发,但是一个HTTP Server始终只是把服务器上的文件如实的通过HTTP协议传输给客户端。

而tomcat属于application server,也是绑定服务器IP并监听TCP端口。它实现了部分HTTP server的功能,没有nginx和Apache的功能丰富。主要用于处理动态内容。没有提供java EE规范,如下图:

架构

两大核心部分connector(连接器)和container(容器)。

tomcat的work目录是工作目录,在浏览器访问jsp =》java=》.class。tomcat定时扫描work目录,不是实时的,因此修改jsp文件后不会立马生效,可以立即删除work目录。

针对由jsp转换成的java文件,比如my-jsp.java,tomcat编译支持的文件大小最大为64k。改进:1.把jsp中的业务逻辑写入单独的类,在jsp中通过调用这个类的静态方法来执行;2.将jsp页面中的js提取出来放到单独的js文件内。

AJP协议:二进制协议

客户端< - http / s->代理< - http / s - >应用

VS

客户端< - http / s->代理< - AJP - >应用

xshell 关闭后 linux的tomcat断掉解决

方法一:

输入命令

nohup ./catalina.sh run &

显示为:

[1]8579

如何关掉?

输入命令查看进程号

ps -ef |grep tomcat

显示处root 456 33345 99。。。省略

其中33345为端口号

输入命令结束进程 kill -9 进程号

kill -9 33345

方法二:

启动方式

(1)Catania

(2)startup

使用startup方式启动tomcat,tomcat运行不受shell影响。

Several ports (8005, 8080, 8009) required by Tomcat Server at localhost are already in use

方法一:进入tomcat bin目录执行shutdown.sh或者shutdown.bat。

方法二:进一步排查——任务管理器或者命令行kill杀掉Java、tomcat相关进程,重启eclipse。

tomcat 调优

动静分离

nginx+tomcat,使用nginx实现静态资源的访问,tomcat处理jsp。

tomcat线程池

打开tomcat的server.xml

配置Executor

​​<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4" maxIdLeTime="60000"/>

参数解释

name

给执行器(线程池)起一个名字

namePrefix

指定线程池中的每一个线程的name前缀

maxThreads

线程池中最大的线程数量

假设:请求的数量超过了“750”,这将不是意味着将maxThreads属性值设置为“750”,它的最好解决方案是使用“Tomcat集群”。

也就是说,如果有“1000”请求,两个Tomcat实例设置“maxThreads= 500”,而不在单Tomcat实例的情况下设置maxThreads=1000。

minSpareThreads

线程池中允许空闲的线程数量(多余的线程都杀死)

maxIdLeTime

一个线程空闲多久算是一个空闲线程

其他的配置其实阅读官方文档是最好的。

 <Connector port="8081" protocol="HTTP/1.1" executor = "tomcatThreadPool" connectionTimeout="20000" redirectPort="8443" enableLookups="false"/>

enableLookups="false"

关闭dns解析,减少性能损耗

minProcessors

服务器启动时创建的最少线程数

maxProcessors

最大可以创建的线程数

acceptCount=“1000”

线程池中的线程都被占用,允许放到队列中的请求数

maxThreads=“3000”

最大线程数

minSpareThreads=“20”

最小空闲线程数,这里是一直会运行的线程

和压缩有关系的配置

通过修改tomcat的运行模式

BIO

Tomcat8以下版本,默认使用的就是BIO(阻塞式IO)模式。

对于每一个请求都要创建一个线程来进行处理,不适合高并发

APR(Apache Portable Runtime)

是Tomcat生产环境运行的首选方式

如果操作系统未安装apr或者apr路径未指到Tomcat默认可识别的路径,

则apr模式无法启动,自动切换启动nio模式。

所以必须要安装apr和native,直接启动就支持apr

apr是从操作系统级别解决异步IO问题,apr的本质就是使用jni(java native interface)

技术调用操作系统底层的IO接口,所以需要提前安装所需要的依赖

提升Tomcat对静态文件的处理性能,当然也可以采用动静分离。

禁用AJP连接器 Apache JServer Protocol

使用Nginx+tomcat的架构,所以用不着AJP协议,所以把AJP连接器禁用

Linux 下修改 TOMCAT_HOME/bin/catalina.sh,在其中加入,可以放在 CLASSPATH = 下面:

JAVA_OPTS="-server -XX:PermSize=512M -XX:MaxPermSize=1024m -Xms2048m -Xmx2048m"

windows 下修改 TOMCAT_HOME/bin/catalina.bat,在其中加入,可以放在 set CLASSPATH = 下面:

set JAVA_OPTS=-server -XX:PermSize=512M -XX:MaxPermSize=1024m -Xms2048m -Xmx2048m

这些参数在我们学习 JVM 部分文章时已经都认识过了,不过这里还是简单介绍下:

-server:启用 JDK的 server 版本;

-Xms:Java虚拟机初始化时堆的最小内存,一般与 Xmx配置为相同值,这样的好处是GC不必再为扩展内存空间而消耗性能;

-Xmx:Java虚拟机可使用堆的最大内存;

-XX:PermSize:Java虚拟机永久代大小;

-XX:MaxPermSize:Java虚拟机永久代大小最大值;

线程池配置

<Executor name="tomcatThreadPool"  namePrefix="catalina-exec-"  maxThreads="1000"  minSpareThreads="100"  maxIdleTime="60000"  maxQueueSize="Integer.MAX_VALUE"  prestartminSpareThreads="false"  threadPriority="5"  className="org.apache.catalina.core.StandardThreadExecutor"/> 

name:线程池名称,用于 Connector中指定。 namePrefix:所创建的每个线程的名称前缀,一个单独的线程名称为

namePrefix+threadNumber。 maxThreads:池中最大线程数。

minSpareThreads:活跃线程数,也就是核心池线程数,这些线程不会被销毁,会一直存在。

maxIdleTime:线程空闲时间,超过该时间后,空闲线程会被销毁,默认值为6000(1分钟),单位毫秒。

maxQueueSize:在被执行前最大线程排队数目,默认为Int的最大值,也就是广义的无限。除非特殊情况,这个值不需要更改,否则会有请求不会被处理的情况发生。

prestartminSpareThreads:启动线程池时是否启动 minSpareThreads部分线程。默认值为false,即不启动。

threadPriority:线程池中线程优先级,默认值为5,值从1到10。

className:线程池实现类,未指定情况下,默认实现类为org.apache.catalina.core.StandardThreadExecutor。如果想使用自定义线程池首先需要实现

org.apache.catalina.Executor接口。

线程池配置完成后需要在 Connector 中指定:

<Connector executor="tomcatThreadPool" ... 
<Connector port="9027"   ...........   compression="on"   compressionMinSize="2048" connectionTimeout="20000" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" ................   />

compression 打开压缩功能

compressionMinSize 启用压缩的输出内容大小,这里面默认为2KB

compressableMimeType 压缩类型

connectionTimeout 定义建立客户连接超时的时间. 如果为 -1, 表示不限制建立客户连接的时间

参考链接:1.Tomcat 性能优化——

标签: #nginxtomcatcgi问题 #tomcat localhost拒绝了我们的连接 #server tomcat server at local