tomcat与nginx/httpd处理请求的区别
nginx/httpd
nginx于httpd都是先有监听进程或线程监听请求,建立连接,对于建立好的连接,放到已连接的队列,等待工作线程去消费,即处理该连接,之后的通信是工作进程/线程通过该已经建立的连接套接字直接和客户端通信
即请求建立是通过监听套接字,实际数据通信是通过连接套接字
tomcat
connector负责监听请求,建立连接,请求时,通过connector经过engine、host、context、wrapper的层次处理,生成响应数据,最后再经由wraper、context、host、engine,最后再经由connector返回给客户端;
即connector是唯一的关口,请求与响应都经过该connector
tomcat处理jsp动态请求
请求www.pc.com/img/index.jsp时处理过程;
配置如下:
<Server>
<Service>
<Connector .../>
<Engine name="Catalina" defaultHost="localhost">
<Host name="www.pc.com" appBase="webapps/pc"
unpackWARs="true" autoDeploy="true">
<Context path="" docBase="" reloadable="true"/>
<Context path="/img" docBase="img" reloadable="true"/>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="pc_access_log" sufffix=".txt"
pattern="%h %l %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
-
connector接收后,procotolhandler分析协议,processor处理并交给绑定的engine
-
engine分析后,找到对应的host,找不到就发给定义的默认host
-
host接收后,根据path匹配,交给对应context处理,找不到就用默认的path=""的context处理,没定义path=""时,就用
/ROOT/目录去响应 -
context接收后,以www.pc.com/img/index.jsp为例,img的context被匹配,然后先找webapps/pc/WEB-INF/web.xml文件,根据其文件定义匹配index.jsp决定如何处理该文件,如果没有定义webapps私有的web.xml,就找
/conf/web.xml的默认配置; -
根据<prefix>/conf/web.xml定义:被匹配到的servlet-name是jsp,进而找到下方对应的servlet,其内部指定的类是org.apache.jasper.servlet.JspServlet <servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.jsp</url-pattern> <url-pattern>*.jspx</url-pattern> </servlet-mapping> # <servlet> <servlet-name>jsp</servlet-name> <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> <init-param> <param-name>fork</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>xpoweredBy</param-name> <param-value>false</param-value> </init-param> <load-on-startup>3</load-on-startup> </servlet> # 于是采用lib/jasper.jar进行处理,jar展开后,依据org.apache.jasper.servlet.JspServlet找到对应类,于是就用该类处理index.jsp文件 [root@host2 tomcat]# pwd /usr/local/tomcat [root@host2 tomcat]# ll lib/jasper.jar -rw-r----- 1 root root 599412 Jul 1 05:50 lib/jasper.jar
-
jspSerlet将jsp文件翻译为java源代码,再编译为.class文件,
-
编译后目录及文件,在
/work目录下 -
[root@host2 tomcat]# pwd /usr/local/tomcat [root@host2 tomcat]# ll work/Catalina/www.pc.com/img/org/apache/jsp/ total 16 -rw-r----- 1 root root 5462 Sep 3 11:24 index_jsp.class -rw-r----- 1 root root 4825 Sep 3 11:24 index_jsp.java
-
index_jsp.class就是要执行的servlet程序,包含输出数据和html代码
tomcat处理静态资源
对于静态资源,也是采用servlet进行处理,下方是
# 静态资源文件匹配到的default的servlet-name
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
# 名为default的servlet由org.apache.catalina.servlets.DefaultServlet实现
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
# 对应jar包为lib/catalina.jar
[root@host2 tomcat]# ll lib/catalina.jar
-rw-r----- 1 root root 1703845 Jul 1 05:50 lib/catalina.jar
展开catalina.jar包后,找到对应的DefaultServlet.class即为处理静态资源的servlet
举例:
www.pc.com/img/index.jsp 由动态的servlet处理
www.pc.com/img/index.html
www.pc.com/img/index.htm
www.pc.com/img/index.txt
www.pc.com/img/index.js 都是由静态servlet处理