1.Connector工作模式
Connector是客户端连接到Tomcat容器的服务点,它为引擎提供协议服务来将引擎与客户端各种协议隔离开来,如HTTP、HTTPS、AJP协议。Tomcat有两种可配的工作模式:独立模式或在同一web服务器中共享模式。
1.1独立模式
一个Connecter将在某个指定的端口上侦听客户请求,接收浏览器的发过来的 tcp 连接请求,创建一个 Request 和 Response 对象分别用于和请求端交换数据,然后会产生一个线程来处理这个请求并把产生的 Request 和 Response 对象传给处理Engine(Container中的一部分),从Engine出获得响应并返回客户。
在独立模式下,Tomcat会配置HTTP和HTTPS连接器,这可以使Tomcat看起来更像完整的web服务器以处理静态请求内容同时还委托Catalina引擎来处理动态内容。发布时,Tomcat为这种运作模式提供了3种可能实现,即HTTP、HTTP1.1以及HTTPS。Tomcat中最常见的连接器为标准连接器,也就是通过java标准I/O实现的Coyote连接器。可以使用一些技术实现,这其中就包括使用Java1.4中引入的非阻塞特性NIO,另一方面可能是通过APR充分利用本地代码来优化特定的操作系统。 Connector和Engine不仅运行在同一个JVM中,而且还运行在同一个Tomcat服务实例中。
1.2共享模式:
在共享模式中,Tomcat扮演着对web服务器如Apache httpd、Nginx和微软的IIS支撑的角色。这里web服务器充当客户端通过Apache模块或者通过dll格式ISAPI模块来和Tomcat通信。当该模块判定一个请求需要传入Tomcat处理时,它将使用AJP协议来与Tomcat通信,该协议为二进制协议,在web服务器和Tomcat通信时比基于文本的Http协议更高效。
在Tomcat端,通过AJP连接器来接收web服务器的请求,并将请求解释为Catalina引擎可处理的格式。这种模式下Tomcat作为来自web服务器的单独进程运行在自身独立的JVM中。
不论在哪种模式中,Connector的基本属性都是它所需要监听的IP地址及端口号,以及所支持的协议。还有一个关键属性就是并发处理传入请求的最大线程数。一旦所有的处理线程都忙,那么传入的请求都将被忽略,直到有线程空闲为止。
默认情况下,连接器会监听指定物理机器上的所有IP(address属性默认值为0.0.0.0);但也可以配置为只监听某一个IP,这将限制它只接收指定ip的连接请求。
任意一个连接器接收到的请求都会被传入单一的服务引擎中,而这个引擎,就是众所周知的catalina,它负责处理请求并生成响应结果。
引擎将生成的结果返回给连接器,连接器再通过指定的协议将结果回传至客户端。Connector关键的有 连接器(HTTP HTTPS HTTP1.1 AJP SSL proxy)、运行模式(BIO NIO NIO2/AIO APR)、多线程/线程池。
2.ProtocolHandler
Connector就是使用ProtocolHandler来处理请求的,不同的ProtocolHandler代表不同的连接类型,比如:Http11Protocol使用的是普通Socket来连接的,Http11NioProtocol使用的是NioSocket来连接的。其中ProtocolHandler由包含了三个部件:Endpoint、Processor、Adapter。
Endpoint用来处理底层Socket的网络连接,Processor用于将Endpoint接收到的Socket封装成Request,Adapter用于将Request交给Container进行具体的处理。
Endpoint由于是处理底层的Socket网络连接,因此Endpoint是用来实现TCP/IP协议的,而Processor用来实现HTTP协议的,Adapter将请求适配到Servlet容器进行具体的处理。
Endpoint的抽象实现AbstractEndpoint里面定义的Acceptor和AsyncTimeout两个内部类和一个Handler接口。Acceptor用于监听请求,AsyncTimeout用于检查异步Request的超时,Handler用于处理接收到的Socket,在内部调用Processor进行处理。
3.Connector配置
Connector的主要功能,是接收连接请求,创建Request和Response对象用于和请求端交换数据;然后分配线程让Engine来处理这个请求,并把产生的Request和Response对象传给Engine。
进入Tomcat的请求可以根据Tomcat的工作模式分为如下两类:Tomcat作为应用程序服务器:请求来自于前端的web服务器,这可能是Apache, IIS, Nginx等;Tomcat作为独立服务器:请求来自于web浏览器;Tomcat应该考虑工作情形并为相应情形下的请求分别定义好需要的连接器才能正确接收来自于客户端的请求。一个引擎可以有一个或多个连接器,以适应多种请求方式。定义连接器可以使用多种属性,有些属性也只适用于某特定的连接器类型。一般说来,常见于server.xml中的连接器类型通常有4种: HTTP连接器、 SSL连接器 、AJP 1.3连接器 、 proxy连接器;Tomcat 支持三种协议:HTTP/1.1、HTTP/2.0、AJP。
3.1 BIO HTTP/1.1 Connector配置
<Connector port=”8080” protocol=”HTTP/1.1” maxThreads=”150” conn ectionTimeout=”20000” redirectPort=”8443” />
acceptCount : 接受连接request的最大连接数目,默认值是10
address : 绑定IP地址,如果不绑定,默认将绑定任何IP地址
allowTrace : 如果是true,将允许TRACE HTTP方法
compressibleMimeTypes : 各个mimeType, 以逗号分隔,如text/html,text/xml
compression : 如果带宽有限的话,可以用GZIP压缩
connectionTimeout : 超时时间,默认为60000ms (60s)
maxKeepAliveRequest : 默认值是100
maxThreads : 处理请求的Connector的线程数目,默认值为200
SSL配置
<Connector port="8181" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol = "TLS"
address="0.0.0.0"
keystoreFile="E:/java/jonas-full-5.1.0-RC3/conf/keystore.jks"
keystorePass="changeit" />
keystoreFile:证书位置
keystorePass:证书密码
3.2 NIO HTTP/1.1 Connector配置
<Connector port=”8080” protocol=”org.apache.coyote.http11.Http11NioProtocol” maxThreads=”150” connectionTimeout=”20000” redirectPort=”8443”/>
3.3 Native APR Connector配置
ARP是用C/C++写的,对静态资源(HTML,图片等)进行了优化。在server.xml中要配置一个Listener。这个配置tomcat是默认配好的。
<!--APR library loader. Documentation at /docs/apr.html -->
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
配置使用APR connector
<Connector port=”8080” protocol=”org.apache.coyote.http11.Http11AprProtocol”
maxThreads=”150” connectionTimeout=”20000” redirectPort=”8443”/>
如果配置成功,启动tomcat,会看到如下信息: org.apache.coyote.http11.Http11AprProtocol init
3.4 AJP Connector配置
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
3.5 Coyote HTTP/1.1 Connector
在独立模式下,Tomcat会配置HTTP和HTTPS连接器,这可以使Tomcat看起来更像完整的web服务器以处理静态请求内容同时还委托Catalina引擎来处理动态内容。
<Connector
port="8080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false"
redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" />
port : 在端口号8080处侦听来自客户browser的HTTP1.1请求.如果把8080改成80,则只要输入http://localhost/即可
protocol:设定Http协议,默认值为HTTP/1.1,如果使用AJP处理器,该值必须为AJP/1.3.
minSpareThreads: 该Connector先创建5个线程等待客户请求,每个请求由一个线程负责
maxSpareThreads:设定在监听端口的线程的最大数目,这个值也决定了服务器可以同时响应客户请求的最大数目.默认值为200
acceptCount : 当现有线程已经达到最大数75时,为客户请求排队.当队列中请求数超过100时,后来的请求返回Connection refused错误
redirectport : 当客户请求是https时,把该请求转发到端口8443去,若连接器不支持SSL,如收到SSL请求,Catalina容器将会自动重定向到指定的端口号,让其处理。
enableLookups:若设为true,表示支持域名解析,把IP地址解析为主机名,false返回IP地址.WEB应用中调用request.getRemoteHost方法执行DNS查询返回客户机主机名.默认值为true。
connectionTimeout:定义建立客户连接超时的时间,以毫秒为单位,默认为60000=60秒,如果为-1,表示不限制建立客户连接的时间
allowTrace:是否允许HTTP的TRACE方法,默认为false
emptySessionPath:如果设置为true,用户的所有路径都将设置为/,默认为false。
maxPostSize:指定POST方式请求的最大量,没有指定默认为2097152。
proxyName:如这个连接器正在一个代理配置中被使用,指定这个属性,在request.getServerName()时返回
scheme:设置协议的名字,在request.getScheme()时返回,SSL连接器设为”https”,默认为”http”
secure:在SSL连接器可将其设置为true,默认为false
URIEncoding:用于解码URL的字符编码,没有指定默认值为ISO-8859-1
useBodyEncodingForURI:主要用于Tomcat4.1.x中,指示是否使用在contentType中指定的编码来取代URIEncoding,用于解码URI查询参数,默认为false
xpoweredBy:为true时,Tomcat使用规范建议的报头表明支持Servlet的规范版本,默认为false
bufferSize:设由连接器创建输入流缓冲区的大小,以字节为单位。默认情况下,缓存区大的大小为2048字节
compressableMimeType:MIME的列表,默认以逗号分隔。默认值是text/html,text/xml,text/plain
compression:指定是否对响应的数据进行压缩。off:表示禁止压缩、on:表示允许压缩(文本将被压缩)、force:表示所有情况下都进行压缩,默认值为off
disableUploadTimeOut:允许Servlet容器,正在执行使用一个较长的连接超时值,以使Servlet有较长的时间来完成它的执行,默认值为false
maxHttpHeaderSize:HTTP请求和响应头的最大量,以字节为单位,默认值为4096字节
maxKeepAliveRequest:服务器关闭之前,客户端发送的流水线最大数目。默认值为100
socketBuffer:设Socket输出缓冲区的大小(以字节为单位),-1表示禁止缓冲,默认值为9000字节
toNoDelay:为true时,可以提高性能。默认值为true
threadPriority:设JVM中请求处理线程优先级。默认值为NORMAL-PRIORITY
3.6 AJP连接器
用于将Apache与Tomcat集成在一起,当Apache接收到动态内容请求时,通过在配置中指定的端口号将请求发送给在此端口号上监听的AJP连接器组件。在共享模式中,Tomcat扮演着对web服务器如Apache httpd、Nginx和微软的IIS支撑的角色。这里web服务器充当客户端通过Apache模块或者通过dll格式ISAPI模块来和Tomcat通信。当该模块判定一个请求需要传入Tomcat处理时,它将使用AJP协议来与Tomcat通信,该协议为二进制协议,在web服务器和Tomcat通信时比基于文本的Http协议更高效。
<!—Define an AJP1.3 Connector on port 8089-->
<Connector port="8080" maxThread="50" minSpareThreads="25" maxSpareThread="75" enableLookups="false" redirectPort="8443"
acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" />
<Connection port="8009" enableLookups="false" redirectPort="8443" debug="0" protocol="AJP/1.3" />
backlog:当所有可能的请求处理线程都在使用时,队列中排队的请求最大数目。默认为10,当队列已满,任何请求都将被拒绝
maxSpareThread:允许存在空闲线程的最大数目,默认值为50
maxThread:支持的最大并发连接数,默认值为200
minSpareThreads:设当连接器第一次启动时创建线程的数目,确保至少有这么多的空闲线程可用,默认值为4
port:服务端套接字的TCP端口号,默认值为8089(必须)
topNoDelay:为true时,可以提高性能,默认值为true
soTimeout:超时值
3.7 SSL连接器
下面定义了一个多属性的SSL连接器:debug=“0” 不启动调试模式 ;其中,keystoreFile为证书位置,keystorePass为证书密码。
<Connector port="8443" maxThreads="150" minSpareThreads="25" maxSpareThread="75" enableLookups="false"
acceptCount="100" debug="0" scheme="HTTPs" secure="true" clientAuth="false" sslProtocol="TLS"/>
<Connector port="8181" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol = "TLS"
address="0.0.0.0"
keystoreFile="E:/java/jonas-full-5.1.0-RC3/conf/keystore.jks"
keystorePass="changeit" />
acceptCount : 当最大请求连接maxConnections满时的最大排队大小,默认100。注意此属性和Executor中属性maxQueueSize的区别,这个指的是请求连接满时的堆栈大小,Executor的maxQueueSize指的是处理线程满时的堆栈大小
connectionTimeout:定义建立客户连接超时的时间,以毫秒为单位,默认为60000=60秒,如果为-1,表示不限制建立客户连接的时间
executor:指定配置的线程池名称
keepAliveTimeout:keeAlive超时时间,默认值为connectionTimeout配置值.-1表示不超时
maxConnections:最大连接数,连接满时后续连接放入最大为acceptCount的队列中. 对 NIO和NIO2连接,默认值为10000;对 APR/native,默认值为8192
maxThreads:支持的最大并发连接数,如果指定了Executor, 此属性忽略;否则为Connector创建的内部线程池最大值,默认200
minSpareThreads:如果指定了Executor, 此属性忽略;否则为Connector创建线程池的最小活跃线程数,默认10
processorCache:协议处理器缓存Processor对象的大小,-1表示不限制,当不使用servlet3.0的异步处理情况:如果配置Executor,配置为Executor的maxThreads;否则配置为Connnector的maxThreads。如果使用Serlvet3.0异步处理, 取maxThreads和maxConnections的最大值
————Blueicex 2020/2/28 12:27 blueice1980@126.com