分类: LINUX
2018-09-01 16:32:53
第五章 Tomcat
1 初识tomcat
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
Tomcat最初是由Sun的软件构架师詹姆斯·邓肯·戴维森开发的。后来他帮助将其变为开源项目,并由Sun贡献给Apache软件基金会。由于大部分开源项目O'Reilly都会出一本相关的书,并且将其封面设计成某个动物的素描,因此他希望将此项目以一个动物的名字命名。因为他希望这种动物能够自己照顾自己,最终,他将其命名为Tomcat(英语公猫或其他雄性猫科动物)。而O'Reilly出版的介绍Tomcat的书籍的封面也被设计成了一个公猫的形象。而Tomcat的Logo兼吉祥物也被设计成了一只公猫。
当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。目前Tomcat最新版本为9.0。
2 Tomcat Server 的组成部分说明
1) Server
Server元素代表了整个Catalina的servlet容器
2)Service
Service是一个集合,它是由一个或者多个Connector组成,以及一个Engine,负责处理所有Connector所获得的客户请求
3)Connector
一个Connector在某个指定端口上监听客户请求,并将获得的请求交给Engine来处理,从Engine处获得回应并返回客户
Tomcat有两个典型的Connector,一个直接监听来自Browser的http请求,一个监听来自其他webserver的请求
4)Engine
Engine下可以配置多个虚拟主机Virtual Host,每个虚拟主机都有一个域名
当Engine获得一个请求时,它把该请求匹配到某个Host上,然后把该请求交给该Host来处理,Engine有一个默认虚拟主机,当请求无法匹配到任何一个Host上的时候,将交给默认Host来处理
5)Host
代表一个Virtual Host,虚拟主机,每个虚拟主机和某个网络域名Domain Name相匹配。每个虚拟主机下都可以部署(deploy)一个或者多个Web App,每个Web App对应于一个Context ,有一个Context path
当Host获得一个请求时,将把该请求匹配到某个Context上,然后把该请求交给该Context来处理,匹配的方法是“最长匹配”,所以一个path的Context将称为该Host的默认Context
所有无法和其他Context的路径名匹配的请求都将最终和默认的Context匹配
6)Context
一个Context对应于一个Web Appliaction,一个Web Appliaction由一个或多个Servlet组成
3 实验
-----------ReProxy-------------------------Client-----------
192.168.56.202 nginx 192.168.56.200 Tomcat
192.168.56.201 Tomcat
1、配置 Tomcat:注:Client 两个客户端配置相同
安装 JDK
[root@localhost ~]# tar -zxvf jdk-7u65-linux-x64.gz
[root@localhost ~]# mv jdk1.7.0_65/ /usr/local/java
[root@localhost ~]# which java
[root@localhost ~]# rm -rf /usr/bin/java //删除 redhat 集成的 java
[root@localhost ~]# ln -s /usr/local/java/bin/* /usr/bin/
[root@localhost ~]# java -version
[root@localhost ~]# vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin
[root@localhost ~]# source /etc/profile.d/java.sh
[root@localhost ~]# echo $PATH
[root@localhost ~]# java -version
安装 Tomcat
[root@localhost ~]# tar -zxvf apache-tomcat-7.0.54.tar.gz
[root@localhost ~]# mv apache-tomcat-7.0.54 /usr/local/tomcat7
[root@localhost ~]# /usr/local/tomcat7/bin/startup.sh
[root@localhost ~]# netstat -anput | grep 8080
[root@localhost ~]# mkdir -p /web/kgc
[root@localhost ~]# vim index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<% out.println("Welcome to test site,");%>
[root@localhost ~]# vim /usr/local/tomcat7/conf/server.xml
Host 标签内添加:
[root@localhost ~]# /usr/local/tomcat7/bin/shutdown.sh //关闭服务
[root@localhost ~]# /usr/local/tomcat7/bin/startup.sh //开启服务
2、配置 Nginx 反向代理
安装 Nginx
[root@localhost ~]# yum install pcre-devel zlib-devel -y
[root@localhost ~]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
[root@localhost ~]# make && make install
[root@localhost ~]# ln -s /usr/local/nginx/sbin/* /usr/local/sbin/
[root@localhost ~]# nginx -t //初始化 nginx
[root@localhost ~]# nginx //启动 Nginx
[root@localhost ~]# netstat -anput | grep 80
[root@localhost ~]# vim nginx.conf
动静分离:
location ~ \.jsp$ {
proxy_pass 192.168.56.200:8080;
}
测试: 访问 Nginx 提供的静态页面
/index.jsp 访问 Tomcat 提供的 JAVA 动态页面
Tomcat 集群 cluster:
http 模块内--定义服务器
upstream myCluster {
server 192.168.56.200:8080 weight=5;
server 192.168.56.201:8080;
}
server 模块内--定义集群
location ~ \.jsp$ {
proxy_pass //于上面 cluster 定义名称相同
proxy_redirect off;
proxy_set_header Host $host; //返回主机名
proxy_set_header X-Real-IP $remote_addr; //真实 ip
proxy_set_header X-Forwarded-For
$proxy_add_x_forwarded_for; //启动转发
}
测试:/index.jsp 刷新页面后会反复出现 server1和 server2
企业动静分离写法:
location ~*\.(html|gif|jpg|jpeg|ico|swf|htm|xml)$ {
proxy_pass
}
location ~ .*.jsp$ {
index index.jsp;
proxy_pass #来自 jsp 请求交给 tomcat处理
proxy_redirect off;
proxy_set_header Host $host; #后端的 Web 服务器可以通过 X-
Forwarded-For 获取用户真实 IP
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-
For $proxy_add_x_forwarded_for;
client_max_body_size 10m; #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数
proxy_connect_timeout 90; #nginx 跟后端服务器连接超时时间(代理连接超时)
proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 6 32k; #proxy_buffers 缓冲区,网页平均在32k 以下的话,这样设置
proxy_busy_buffers_size 64k;#高负荷下缓冲大小
(proxy_buffers*2) proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从 upstream 服务器传
}
location ~ .*\.(gif|jpg|png|bmp|swf)$ #由 nginx 处理静态页面
{
expires 30d; #使用 expires 缓存模块,缓存到客户端 30 天
}
location ~ .*\.( jsp|js|css)?$
{
expires 1d;
}
error_page 404 /404.html; #错误页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
4、性能测试
下面我们使用的 ab 压力测试工具,模拟发起一次 1 万的并发请求,使用的 index.html页面是百度首页代码
主要参数说明:
Requests per second:平均每秒处理事务数
Time per request:平均事务响应时间
Tranfer rate:平均每秒吞吐量
经上面测试得出:nginx 每秒能请求 6000 次,而 tomcat 只请求 1000 次。
nginx 每秒吞吐量是 3.6M,tomcat 每秒吞吐量 0.6M
由此看来,nginx 是 tomcat6 倍的处理能力,如果网站程序静态页面多的话,就应该考
虑使用 Nginx 与 Tomcat 整合来使用。