web服务器学习体会

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wgj99991111/article/details/53421728

web服务器其实就是一个应答器,他可以按照预先程序的设计响应客户端浏览器的所有问题。在这个响应的过程中,在网络上使用的是http协议,当然为了安全性后来出现了https协议,而传输的内容时符合HTML标准的文档。当前市面上的web服务器架构很多,比如微软的iis,Apache、tomcat,nginx等等,其实现的功能都是相似的,只不过实现的具体方法不同。
一 、tomcat的结构图为:
这里写图片描述
这里写图片描述
二、tomcat处理请求的流程
这里写图片描述
下面以tomcat为例,说说web服务器是如何实现响应用户请求的任务的。
假设来自客户的请求为:
http://localhost:8080/wsota/wsota_index.jsp

  1. 请求被发送到本机端口8080,被在那里侦听的CoyoteHTTP/1.1 Connector获得
  2. Connector把该请求交给它所在的Service的Engine来处理,并等待来自Engine的回应
  3. Engine获得请求localhost/wsota/wsota_index.jsp,匹配它所拥有的所有虚拟主机Host
  4. Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机)
  5. localhost Host获得请求/wsota/wsota_index.jsp,匹配它所拥有的所有Context
  6. Host匹配到路径为/wsota的Context(如果匹配不到就把该请求交给路径名为""的Context去处理)
  7. path="/wsota"的Context获得请求/wsota_index.jsp,在它的mapping table中寻找对应的servlet
  8. Context匹配到URLPATTERN为*.jsp的servlet,对应于JspServlet类
  9. 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法
    10)Context把执行完了之后的HttpServletResponse对象返回给Host
    11)Host把HttpServletResponse对象返回给Engine
    12)Engine把HttpServletResponse对象返回给Connector
    13)Connector把HttpServletResponse对象返回给客户browser

三、tomcat的配置
tomcat的配置在server.xml这个文件中进行,下面讲述这个文件中的基本配置信息,更具体的配置信息请参考tomcat的文档:
server: 1、port 指定一个端口,这个端口负责监听关闭tomcat的请求
2、shutdown 指定向端口发送的命令字符串
service: 1、name 指定service的名字
Connector (表示客户端和service之间的连接):
1、port 指定服务器端要创建的端口号,并在这个断口监听来自客户端的请求
2、minProcessors 服务器启动时创建的处理请求的线程数
3、maxProcessors 最大可以创建的处理请求的线程数
4、enableLookups 如果为true,则可以通过调用request.getRemoteHost()进行DNS查

询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址
5、redirectPort 指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号
6、acceptCount 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理

队列中的请求数,超过这个数的请求将不予处理
7、connectionTimeout 指定超时的时间数(以毫秒为单位)
Engine(表示指定service中的请求处理机,接收和处理来自Connector的请求):
1、defaultHost 指定缺省的处理请求的主机名,它至少与其中的一个host元素的name属性值是一样的
Context (表示一个web应用程序):
1、docBase 应用程序的路径或者是WAR文件存放的路径
2、path 表示此web应用程序的url的前缀,这样请求的url为http://localhost:8080/path/****
3、reloadable 这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化,自动装载新的应用程序,我们可以在不重起tomcat的情况下改变应用程序
host (表示一个虚拟主机):
1、name 指定主机名
2、appBase 应用程序基本目录,即存放应用程序的目录
3、unpackWARs 如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接

从WAR文件中运行应用程序
Logger (表示日志,调试和错误信息):
1、className 指定logger使用的类名,此类必须实现org.apache.catalina.Logger 接口
2、prefix 指定log文件的前缀
3、suffix 指定log文件的后缀
4、timestamp 如果为true,则log文件名中要加入时间,如下例:localhost_log.2001-10-04.txt
Realm (表示存放用户名,密码及role的数据库):
1、className 指定Realm使用的类名,此类必须实现org.apache.catalina.Realm接口
Valve (功能与Logger差不多,其prefix和suffix属性解释和Logger 中的一样):
1、className 指定Valve使用的类名,如用org.apache.catalina.valves.AccessLogValve类可以记录应用程序的访问信息
directory(指定log文件存放的位置):
1、pattern 有两个值,common方式记录远程主机名或ip地址,用户名,日期,第一行请求的字符串,HTTP响应代码,发送的字节数。combined方式比common方式记录的值更多

四、Context的部署配置文件web.xml的说明
一个Context对应于一个Web App,每个Web App是由一个或者多个servlet组成的
当一个Web App被初始化的时候,它将用自己的ClassLoader对象载入“部署配置文件web.xml”中定义的每个servlet类
它首先载入在$CATALINA_HOME/conf/web.xml中部署的servlet类
然后载入在自己的Web App根目录下的WEB-INF/web.xml中部署的servlet类
web.xml文件有两部分:servlet类定义和servlet映射定义
每个被载入的servlet类都有一个名字,且被填入该Context的映射表(mapping table)中,和某种URL PATTERN对应
当该Context获得请求时,将查询mapping table,找到被请求的servlet,并执行以获得请求回应。(所以我们自己定义的每一个servlet都应该在web.xml中进行定义和映射)

分析一下所有的Context共享的web.xml文件,在其中定义的servlet被所有的Web App载入

 <!----------------------------------------------------------------------------------------------->  
  
  
<web-app>  
  
  
  <!-- 概述:  
       该文件是所有的WEB APP共用的部署配置文件,  
       每当一个WEB APP被DEPLOY,该文件都将先被处理,然后才是WEB APP自己的/WEB-INF/web.xml  
       -->  
  
  
  
  <!--  +-------------------------+  -->  
  <!--  |    servlet类定义部分    |  -->  
  <!--  +-------------------------+  -->  
  
    
  
  <!-- DefaultServlet  
       当用户的HTTP请求无法匹配任何一个servlet的时候,该servlet被执行  
       URL PATTERN MAPPING : /  
       -->  
  
    <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>true</param-value>  
        </init-param>  
        <load-on-startup>1</load-on-startup>  
    </servlet>  
  
  
  <!-- InvokerServlet  
       处理一个WEB APP中的匿名servlet  
       当一个servlet被编写并编译放入/WEB-INF/classes/中,却没有在/WEB-INF/web.xml中定义的时候  
       该servlet被调用,把匿名servlet映射成/servlet/ClassName的形式  
       URL PATTERN MAPPING : /servlet/*  
       -->  
  
    <servlet>  
        <servlet-name>invoker</servlet-name>  
        <servlet-class>  
          org.apache.catalina.servlets.InvokerServlet  
        </servlet-class>  
        <init-param>  
            <param-name>debug</param-name>  
            <param-value>0</param-value>  
        </init-param>  
        <load-on-startup>2</load-on-startup>  
    </servlet>  
  
  
  <!-- JspServlet  
       当请求的是一个JSP页面的时候(*.jsp)该servlet被调用  
       它是一个JSP编译器,将请求的JSP页面编译成为servlet再执行  
       URL PATTERN MAPPING : *.jsp  
       -->  
  
    <servlet>  
        <servlet-name>jsp</servlet-name>  
        <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>  
        <init-param>  
            <param-name>logVerbosityLevel</param-name>  
            <param-value>WARNING</param-value>  
        </init-param>  
        <load-on-startup>3</load-on-startup>  
    </servlet>  
  
  
  
  <!--  +---------------------------+  -->  
  <!--  |    servlet映射定义部分    |  -->  
  <!--  +---------------------------+  -->  
  
      
    <servlet-mapping>  
        <servlet-name>default</servlet-name>  
        <url-pattern>/</url-pattern>  
    </servlet-mapping>  
  
    <servlet-mapping>  
        <servlet-name>invoker</servlet-name>  
        <url-pattern>/servlet/*</url-pattern>  
    </servlet-mapping>  
  
    <servlet-mapping>  
        <servlet-name>jsp</servlet-name>  
        <url-pattern>*.jsp</url-pattern>  
    </servlet-mapping>  
  
  
  <!--  +------------------------+  -->  
  <!--  |    其它部分,略去先    |  -->  
  <!--  +------------------------+  -->  
  
    ... ... ... ...  
  
</web-app>  

猜你喜欢

转载自blog.csdn.net/wgj99991111/article/details/53421728