Servlet

WEB请求处理 学习笔记

2018-02-06  本文已影响66人  专职跑龙套

1. WEB 服务器

按功能分类,Web Server可以分为:

1.1 HTTP Server

HTTP Server 运行在服务器之上,绑定服务器的IP地址并监听某一个TCP端口来接收并处理HTTP请求,这样客户端就能够通过HTTP协议来获取服务器上的网页(HTML格式)、文档(PDF格式)、音频(MP4格式)、视频(MOV格式)等等资源。

一个HTTP Server关心的是HTTP协议层面的传输和访问控制,所以在Apache/Nginx上你可以看到代理、负载均衡等功能。

关于 Apache 与 Nginx 的对比,参见 LAMP 性能优化

1.2 Application Server

Application Server 是一个应用执行的服务器。

对于 Tomcat 来说,就是需要提供 JSP/Sevlet 运行需要的标准类库、Interface 等。为了方便,应用服务器往往也会集成 HTTP Server 的功能,但是不如专业的 HTTP Server 那么强大,所以 Application Server 往往是运行在 HTTP Server 的背后,执行应用,将动态的内容转化为静态的内容之后,通过 HTTP Server 分发到客户端。

Tomcat 运行在 JVM 之上,它和HTTP服务器一样,绑定IP地址并监听TCP端口,同时还包含以下指责:

所以 Tomcat 属于是一个 Application Server,更准确的来说,是一个Servlet/JSP 应用的容器。

Apache 与 Tomcat 整合使用:
虽然 Tomcat 也可以认为是HTTP服务器,但通常它仍然会和 Apache/Nginx 配合在一起使用:

2. 什么是CGI

CGI 全称是 通用网关接口 (Common Gateway Interface),是 HTTP 服务器与外部应用程序进行“交谈”的一种工具,其程序须运行在网络服务器上,是一种根据请求信息动态产生响应内容的接口协议。
CGI 可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。如 PHP,Perl,TCL 等。

通过CGI,HTTP Server可以将根据请求启动不同的外部程序,并将请求内容转发给该程序,在程序执行结束后,将执行结果作为回应返回给客户端。
所以,CGI的定义是:外部应用程序与HTTP 服务器之间的接口协议。

CGI程序通过标准输入(STDIN)和标准输出(STDOUT)来进行输入输出。
HTTP服务器和CGI接口另外设置了一些环境变量,用来向CGI程序传递一些重要的参数,例如:

具体参见 CGI 环境变量

每当客户请求CGI的时候,HTTP服务器就请求操作系统生成一个新的CGI解释器进程(如php-cgi.exe),CGI的一个进程则处理完一个请求后退出,下一个请求来时再创建新进程。当然,这样在访问量很少没有并发的情况也行。可是当访问量增大,并发存在,这种方式就不适合了。于是就有了FastCGI。

3. 什么是FastCGI

FastCGI 像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去 fork 一次。
FastCGI 是语言无关的、可伸缩架构的 CGI 开放扩展,其主要行为是将 CGI 解释器进程保持在内存中并因此获得较高的性能。

FastCGI工作原理:

4. 什么是PHP-CGI

PHP-CGI 是 PHP 自带的 FastCGI 管理器。PHP-CGI的不足:

5. 什么是PHP-FPM

PHP-FPM 是一个 PHP FastCGI 管理器,是只用于 PHP 的,使用 PHP-FPM 来控制 PHP-CGI 的 FastCGI 进程,它负责管理一个进程池,来处理来自Web服务器的请求。
PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,比Spawn-FCGI具有更多优点,所以被PHP官方收录了。在PHP 5.3.3中可以直接使用PHP-FPM了。
Apache+PHP配合使用,会在Apache配置下面一段:
LoadModule php5_module C:/php/php5apache2_2.dll

当 PHP 需要在 Apache 服务器下运行时,一般来说,它可以模块的形式集成,此时模块的作用是接收 Apache 传递过来的 PHP 文件请求,并处理这些请求,然后将处理后的结果返回给 Apache。

6. 什么是Servlet

与CGI不同的是,Servlet对每个请求都是单独启动一个线程,而不是进程。
Servlet和JSP两者分工协作:

Servlet 的框架是由两个 Java 包组成的:

Servlet的 框架的核心是 javax.servlet.Servlet 接口,所有的 Servlet 都必须实现这个接口。在 Servlet 接口中定义了5个方法,其中 3 个方法代表了Servlet的生命周期:

一个 Servlet 的配置:

<servlet>
    <!-- Servlet对象的名称 -->
    <servlet-name>action<servlet-name>
    <!-- 创建Servlet对象所要调用的类 -->
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
        <!-- 参数名称 -->
        <param-name>config</param-name>
        <!-- 参数值 -->
        <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <init-param>
        <param-name>detail</param-name>
        <param-value>2</param-value>
    </init-param>
    <init-param>
        <param-name>debug</param-name>
        <param-value>2</param-value>
    </init-param>
    <!-- Servlet容器启动时加载Servlet对象的顺序 -->
    <load-on-startup>2</load-on-startup>
</servlet>
<!-- 要与servlet中的servlet-name配置节内容对应 -->
<servlet-mapping>
    <servlet-name>action</servlet-name>
    <!-- 客户访问的Servlet的相对URL路径 -->
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

创建 Servlet 对象的时机:

销毁 Servlet 对象的时机:
Servlet 容器停止或者重新启动:Servlet 容器调用 Servlet 对象的 destroy 方法来释放资源。

描述一下Tomcat与Servlet是如何工作的:

Servlet 工作原理时序图

CGI与Servlet比较:

7. Tomcat工作原理

两个核心组件:连接器(Connector)和容器(Container)。

Tomcat要为一个Servlet的请求提供服务,需要做三件事:

Connector 分为以下几类:

7.1. Apache HTTP Server 与 Tomcat 的三种连接方式

7.1.1 AJP

Tomcat提供了专门的 JK 插件(即常见的 mod_jk)来负责 Tomcat 和 HTTP 服务器的通信。
JK 安装在对方的 HTTP 服务器上之后,当 HTTP 服务器接收到客户请求时,它会通过 JK 过滤 URL。
JK 根据预先配置好的 URL 映射信息,决定是否把请求转发给 Tomcat 处理。
而 JK 是通过 AJP 协议(Apache JServer Protocol)实现 Apache 与 Tomcat 之间通讯的。

AJP 协议是为 Tomcat 与 HTTP 服务器之间通信而定制的协议,能够提供较高的通信速度和效率。
大致来说,是由于以下两个原因,导致 Tomcat 与 HTTP 服务器整合时,采用 AJP 协议通信的效率要高于HTTP 协议:

使用步骤:

开启虚拟主机:取消注释Include conf/extra/httpd-vhosts.conf
添加JK配置:增加一行Include conf/extra/httpd-jk.conf
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info
worker.list=tomcat
worker.tomcat.type=ajp13
worker.tomcat.host=192.168.0.103
worker.tomcat.port=8009
 JkMount   /*      tomcat
 JkUnMount /*.html tomcat
 JkUnMount /*.jpg  tomcat
 JkUnMount /*.css  tomcat
 JkUnMount /css/*  tomcat
 JkUnMount /js/*   tomcat
 JkUnMount /lib/*  tomcat

7.1.2 http_proxy

这是利用 Apache 自带的 mod_proxy 模块使用代理技术来连接 Tomcat。
http_proxy 模式是基于 HTTP 协议的代理,因此它要求 Tomcat 必须提供 HTTP 服务,也就是说必须启用 Tomcat 的 HTTP Connector。一个最简单的配置如下:

ProxyPass /images !
ProxyPass /css !
ProxyPass /js !
ProxyPass / http://localhost:8080/

在这个配置中,我们把所有 http://localhost 的请求代理到 http://localhost:8080/ ,这也就是 Tomcat 的访问地址,除了 images、css、js 几个目录除外。我们同样可以利用 mod_proxy 来做负载均衡,再看看下面这个配置:

ProxyPass /images !
ProxyPass /css ! 
ProxyPass /js !
 
ProxyPass / balancer://example/
<Proxy balancer://example/>
BalancerMember http://server1:8080/
BalancerMember http://server2:8080/
BalancerMember http://server3:8080/
</Proxy>

7.1.3 ajp_proxy

ajp_proxy 连接方式其实跟 http_proxy 方式一样,都是由 mod_proxy 所提供的功能。配置也是一样,只需要把 http:// 换成 ajp:// ,同时连接的是 Tomcat 的 AJP Connector 所在的端口。上面例子的配置可以改为:

ProxyPass /images !
ProxyPass /css ! 
ProxyPass /js !
 
ProxyPass / balancer://example/
<Proxy balancer://example/>
BalancerMember ajp://server1:8080/
BalancerMember ajp://server2:8080/
BalancerMember ajp://server3:8080/
</Proxy>

采用 proxy 的连接方式,需要在 Apache 上加载所需的模块,mod_proxy 相关的模块有 mod_proxy.so、mod_proxy_connect.so、mod_proxy_http.so、mod_proxy_ftp.so、mod_proxy_ajp.so

7.3. 什么是 Catalina

Catalina 就是 Tomcat 服务器使用的 Apache 实现的 Servlet 容器的 名字。

7.2. Tomcat 日志

Tomcat 日志信息分为两类:

7.2.1 访问日志

启用访问日志,默认 tomcat 不记录访问日志,如下方法可以使 tomcat 记录访问日志
编辑${catalina}/conf/server.xml 文件:

<Valve className="org.apache.catalina.valves.AccessLogValve"`
directory="logs"  prefix="localhost_access_log." suffix=".txt"`
pattern="common" resolveHosts="false"/>

通过对示例中 pattern 项的修改,可以改变日志输出的内容。
该项值可以为: common 与 combined ,这两个预先设置好的格式对应的日志输出内容如下:

pattern 也可以根据需要自由组合 , 例如 pattern="%h %l"
对 于各 fields 字段的含义请参照: http://tomcat.apache.org/tomcat-6.0-doc/config/valve.html 中的 Access Log Valve 项。

7.2.2 运行日志

Tomcat日志分为5类:catalina 、localhost 、manager 、admin 、host-manager
日志的级别分为7种:SEVERE (highest value) > WARNING > INFO > CONFIG > FINE > FINER > FINEST (lowest value)

设定日志级别,修改 conf/logging.properties 中的内容,设定某类日志的级别,示例:

Tomcat下相关的运行日志文件:


引用:
WEB请求处理三:Servlet容器请求处理
Tomcat与Apache整合
Apache HTTP Server 与 Tomcat 的三种连接方式介绍
日志系统&access日志&相关日志文件
Tomcat日志设定

上一篇 下一篇

猜你喜欢

热点阅读