Tomcat

311 阅读10分钟

HTTP/1.0,发送请求,创建一次连接,获得一个web资源,连接断开。 HTTP/1.1,发送请求,创建一次连接,获得多个web资源,保持连接。

HTTP

请求

常见请求头 描述
Referer 浏览器通知服务器,当前请求来自何处。如果是直接访问,则不会有这个头。常用于:防盗链
If-Modified-Since 浏览器通知服务器,本地缓存的最后变更时间。与另一个响应头组合控制浏览器页面的缓存。
Cookie 与会话有关技术,用于存放浏览器缓存的cookie信息。
User-Agent 浏览器通知服务器,客户端浏览器与操作系统相关信息
Connection 保持连接状态。Keep-Alive 连接中,close 已关闭
Host 请求的服务器主机名
Content-Length 请求体的长度
Content-Type 如果是POST请求,会有这个头,默认值为application/x-www-form-urlencoded,表示请求体内容使用url编码
Accept 浏览器可支持的MIME类型。文件类型的一种描述方式。
MIME格式 大类型/小类型[;参数]例如:text/html ,html文件;text/css,css文件;text/javascript,js文件;image/*,所有图片文件.
Accept-Encoding 浏览器通知服务器,浏览器支持的数据压缩格式。如:GZIP压缩
Accept-Language 浏览器通知服务器,浏览器支持的语言。各国语言(国际化i18n)

响应

常见请求头 描述
Location 指定响应的路径,需要与状态码302配合使用,完成跳转。
Content-Type 响应正文的类型(MIME类型)取值:text/html;charset=UTF-8,Content-Disposition
Set-Cookie 与会话相关技术。服务器向浏览器写入cookie
Content-Encoding 服务器使用的压缩格式取值:gzip
Content-length 响应正文的长度
Refresh 定时刷新,格式:秒数;url=路径。url可省略,默认值为当前页。取值:3;url=www.itcast.cn //三秒刷新页面到www.itcast.cn
Server 指的是服务器名称,默认值:Apache-Coyote/1.1。可以通过conf/server.xml配置进行修改。<Connector port="8080" ... server="itcast"/>
Last-Modified 服务器通知浏览器,文件的最后修改时间。与If-Modified-Since一起使用。

tomcat

目录结构

  • bin:脚本目录 启动脚本:startup.bat 停止脚本:shutdown.bat
  • conf:配置文件目录 (config /configuration) 核心配置文件:server.xml 用户权限配置文件:tomcat-users.xml 所有web项目默认配置文件:web.xml
  • lib:依赖库,tomcat和web项目中需要使用的jar包
  • logs:日志文件. localhost_access_log..txt tomcat记录用户访问信息,星表示时间。 例如:localhost_access_log.2016-02-28.txt
  • temp:临时文件目录,文件夹内内容可以任意删除。
  • webapps:默认情况下发布WEB项目所存放的目录。
  • work:tomcat处理JSP的工作目录和session钝化文件

web应用的目录结构

mail

    html,jsp,css,js等
    
    WEB-INF目录

        classes目录(class文件)
        
        lib目录(jar包)  
        
        web.xml文件(web配置)

tomcat优化

tomcat的3种运行模式:

  • bio bio(blocking I/O),顾名思义,即阻塞式I/O操作,表示Tomcat使用的是传统的Java I/O操作(即java.io包及其子包)。Tomcat在默认情况下,就是以bio模式运行的。遗憾的是,就一般而言,bio模式是三种运行模式中性能最低的一种。我们可以通过Tomcat Manager来查看服务器的当前状态。

  • nio 是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。Java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。

  • apr (Apache Portable Runtime/Apache可移植运行库),是Apache HTTP服务器的支持库。你可以简单地理解为,Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高Tomcat对静态文件的处理性能。 Tomcat apr也是在Tomcat上运行高并发应用的首选模式。

1.启动NIO模式

修改server.xml里的Connector节点,修改protocol为org.apache.coyote.http11.Http11NioProtocol

<Connector port="8080" protocal="org.apache.coyote.http11.Http11NioProtocol" 
  connectionTimeout="20000" redirectPort="8443"/>

2.开启线程池

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

将server.xml中线程池打开,并在connector中配置使用

<!--
    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    -->
  • 参数说明
参数 说明
maxThreads(最大线程数) (int) The max number of active threads in this pool, default is 200
minSpareThreads(最小活跃线程数) (int) The minimum number of threads always kept alive, default is 25
maxQueueSize(最大的等待队里数,超过则请求拒绝) (int) The maximum number of runnable tasks that can queue up awaiting execution before we reject them. Default value is Integer.MAX_VALUE
prestartminSpareThreads(是否在启动时就生成minSpareThreads个线程) (boolean) Whether minSpareThreads should be started when starting the Executor or not, the default is false

-最佳实践

<Executer name="tomcatThread Pool" namePrefix="catalina-exec-" 
maxThreads="800" minSpareThreads="100" maxQueueSize="100" prestartminSpareThreads="true"/>

3.连接器(Connector)

Connector是Tomcat接收请求的入口,每个Connector有自己专属的监听端口 Connector有两种:HTTP Connector和AJPConnector

  • 通用属性
属性 说明
enableLookups 若是你想request.getRemoteHost()的调用 履行,以便返回的长途客户端的实际主机名的DNS查询,则设置为true。设置为false时跳过DNS查找,并返回字符串情势的IP地址(从而提高性能)。默认景象下,禁用DNS查找。
maxPostSize 将被容器以FORM URL参数形式处理的最大长度(以字节为单位)的POST。通过设置此属性的值小于或等于0可以禁用该限制。如果没有指定,该属性被设置为2097152(2兆字节)。
port TCP端口号,连接器利用该端口号将创建一个服务器套接字,并等待传入的连接。你的操作系统将只允许一个服务器应用程序在一个特定的IP地址侦听特定的端口号。如果使用特殊值0(零),则Tomcat将为连接器随机选择一个空闲的端口。这是通常只用在嵌入式和测试应用程序。
protocol 设置协议来处理传入流量。org.apache.coyote.http11.Http11Protocol -阻塞式的Java连接器;org.apache.coyote.http11.Http11NioProtocol -不阻塞Java连接器;org.apache.coyote.http11.Http11AprProtocol的 -的APR / native 连接器.也可以使用的用户自定义的实现。看一看在我们的连接器比较图。Java连接器,HTTP和HTTPS,配置是相同的。 APR连接器和APR特定的SSL设置的更多信息,请访问APR文档
URIEncoding 这将指定使用的字符编码 ,来解码URI字符。如果没有指定,ISO-8859-1将被使用。
xpoweredBy 将此属性设置为true会导致Tomcat支持使用Servlet规范的通知,(在规范中推荐使用头字段)。默认值是假的。
  • 标准实现
属性 说明
acceptCount 当所有可能的请求处理线程都在使用时,传入连接请求的最大队列长度。当队列满时收到的任何请求将被拒绝。默认值是100。
acceptorThreadCount 用于接受连接的线程的数量。在一个多CPU的机器上,增加该值,虽然你可能不会真正需要超过2个。此外,有很多非保持活动连接,您可能需要增加这个值。默认值是 1。
compression 为了节省服务器带宽,连接器可以使用HTTP/1.1 GZIP压缩。可接受的参数的值是“off ”(禁用压缩),“on ”(允许压缩,这会导致文本数据被压缩),“force ”(强制在所有的情况下压缩),或者一个整数值(这是相当于为“on”,但指定了输出之前被压缩的数据最小量)。如果不知道内容长度但被设置为“on”或更积极的压缩,输出的数据也将被压缩。如果没有指定,该属性被设置为“关”。
connectionUploadTimeout 上传数据过程中,指定的以毫秒为单位超时时间。只有在设置disableUploadTimeout为false有效。
disableUploadTimeout 此标志允许servlet容器在数据上传时使用不同的连接超时,通常较长。如果没有指定,该属性被设置为true,禁用上传超时。
executor 指向Executor元素的引用。如果这个属性被设置,并且被命名的executor存在,连接器将使用这个executor,而其他所有线程相关属性将被忽略。请注意共享的executor如果没有指定到一个连接器,则该连接器将使用一个私有的,内部的executor来提供线程池。
maxConnections 对于BIO,默认的是maxThreads的值,除非使用了Executor,在这种情况下默认值是executor的maxThreads值 。对于NIO的默认值是10000。APR /native的默认值是8192。需要注意的是Windows系统的APR/native,所配置的值将减少到小于或等于maxConnections的1024的倍数的最大值。这样做是出于性能方面的考虑。如果设置的值-1,maxConnections功能被禁用,而且连接数将不做计算。
maxThreads 最多同时处理的连接数,Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。如果没有指定,该属性被设置为200。如果使用了execute将忽略此连接器的该属性,连接器将使用execute,而不是一个内部线程池来处理请求。
minSpareThreads The minimum number of threads always kept running. If not specified, the default of 10 is used.始终保持运行最小线程数。如果没有指定,则默认为10。
SSLEnabled 在连接器上使用此属性来启用SSL加密传输。如果要打开SSL握手/加密/解密,请设置true。默认值是false。当设置这个值为true时,为了传递正确的request.getScheme()和 request.isSecure()到servlets,你需要设置scheme和secure属性。更多信息请查看SSL支持。
  • 禁用AJP连接器

AJP(Apache JServerProtocol) AJPv13协议是面向包的。WEB服务器和Servlet容器通过TCP连接来交互;为了节省SOCKET创建的昂贵代价,WEB服务器会尝试维护一个永久TCP连接到servlet容器,并且在多个请求和响应周期过程会重用连接。

我们一般是使用Nginx+tomcat的架构,所以用不着AJP协议,所以把AJP连接器禁用。

<!--<Connector port="8009" protocol="AJP/1.3" redictPort="8443" />-->
  • 最佳实践
<Connector executor="tomcatThreadPool" 
protocal="org.apache.coyote.http11.Http11NioProtocol" 
          port="8080" 
          connectionTimeout="20000"
          redirectPort="8443" 
          enableLookups="false"
          maxPostSize="10485760"
          URIEncoding="UTF-8"
          acceptCount="100"
          acceptorThreadCount="2"
          disableUploadTimeout="ture"
          maxConnections="10000"
          SSLEnabled="false"
			   />

4.JVM参数的优化

  • Java栈

Java栈是与每一个线程关联的,JVM在创建每一个线程的时候,会分配一定的栈空间给线程。它主要用来存储线程执行过程中的局部变量,方法的返回值,以及方法调用上下文。栈空间随着线程的终止而释放。

  • Java堆

Java中堆是由所有的线程共享的一块内存区域,堆用来保存各种JAVA对象,比如数组,线程对象等。

设置合适的JVM参数优化,注意jdk版本