Tomcat

目录

  • 部署tomcat
  • 主配置文件
  • Nginx+Tomcat实现动静分离
  • Nginx+Tomcat+memcache实现高可用会话集群

一、部署tomcat

第一步:安装JDK
tomcat在处理客户端请求的jsp文件的时候,会将jsp文件中的java程序提取出来并且运行,java程序能够运行是需要JDK的支持的。
目前jdk存在两个分支,一个是Oracle公司负责维护的jdk,一个是开源界维护的openjdk,并且openjdk软件在CentOS的光盘中会提供。
方法一:使用Oracle的分支,进入Oracle官网下载jdk10版本,网址是https://www.oracle.com/technetwork/java/javase/downloads/jdk10-downloads-4416644.html
会看到Linux相对应的两个文件,一个.rpm文件,一个.tar.gz文件(绿色版),.rpm文件就是普通rpm软件包的正常安装方式即可,.tar.gz文件下载下来之后直接解压至指定目录就可以使用。
Tomcat
然后安装,安装之后的文件目录会存放在/usr/java目录下。

[root@Web1 src]# pwd
/usr/local/src
[root@Web1 src]# ls jdk-10.0.2_linux-x64_bin.rpm 
jdk-10.0.2_linux-x64_bin.rpm
[root@Web1 src]# yum -y localinstall jdk-10.0.2_linux-x64_bin.rpm 
[root@Web1 src]# cd /usr/java/
[root@Web1 java]# ls
default  jdk-10.0.2  latest

可以看到生成了三个目录,在jdk-10.0.2目录下的bin目录下存在一个java命令。需要将bin目录下的命令配置到系统的PATH变量中。配置如下:

[root@Web1 ~]# vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk-10.0.2
export PATH=$JAVA_HOME/bin:$PATH
# 重载环境变量
[root@Web1 ~]# source /etc/profile.d/java.sh
[root@Web1 ~]# which java
/usr/java/jdk-10.0.2/bin/java

到此为止,JDK的安装和PATH变量的配置已经完成,可以使用java -version命令查看安装的JDK版本。
Tomcat
方法二:使用openjdk分支,openjdk在CentOS的本地光盘中就会提供,因此使用yum直接安装即可。

[root@Web2 ~ ]# yum list all *openjdk*

执行上面的命令之后,会看到很多openjdk版本和各个版本的各个组件,假如使用java-1.8.0-openjdk这个版本,另外还需要关注相对应版本的java-1.8.0-openjdk-devel这个组件。他们的关系如下:
java-1.8.0-openjdk    java程序的运行环境
java-1.8.0-openjdk-devel java程序的编译开发环境
仅安装openjdk之后,只存在一个jre下的java命令,但是继续安装openjdk-devel之后,就会多出一个javac命令。
安装这两个组件,

[root@Web2 ~]# yum -y install java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel.x86_64

安装后我们不知道bin目录在什么位置,这样就无法配置系统的PATH变量。可以使用命令rpm来查看软件包安装后每个文件的位置:

[root@Web2 ~]# rpm -ql java-1.8.0-openjdk-devel |grep /bin$
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64/bin

配置PATH变量

[root@Web2 ~]# vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64
export PATH=$JAVA_HOME/bin:$PATH
[root@Web2 ~]# source /etc/profile.d/java.sh
[root@Web2 ~]# which java
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64/bin/java

Tomcat
第二步:安装tomcat
方法一:tomcat在CentOS的本地光盘中就会提供,因此直接yum仓库安装即可。

[root@Web2 ~]# yum -y install tomcat tomcat-admin-webapps tomcat-webapps

其中tomcat-admin-webapps是一个tomca应用程序t的管理组件,tomcat-webapps是一个提供tomcat的默认欢迎首页文件的组件。
tomcat安装完成之后,会提供一个管理命令/usr/sbin/tomcat,而且还会提供相应的tomcat服务(CentOS6--/etc/init.d/tomcat start、CentOS7--systemctl start tomcat)。
启动tomcat

[root@Web2 ~]# /usr/sbin/tomcat start

tomcat默认工作在非特权用户下,因此tomcat就无法监听80端口,因此tomcat默认监听8080端口。
测试
浏览器中输入ip:8080,出现下图界面表示tomcat启动成功。
Tomcat
方法二:在tomcat的官网下载安装。网址为:https://tomcat.apache.org/
下载成功后如下,然后解压至/usr/local目录下就可以使用。

[root@Web1 src]# pwd
/usr/local/src
[root@Web1 src]# ls apache-tomcat-8.5.32.tar.gz 
apache-tomcat-8.5.32.tar.gz
[root@Web1 src]# tar -zxvf apache-tomcat-8.5.32.tar.gz -C /usr/local/
[root@Web1 local]# ls -d /usr/local/apache-tomcat-8.5.32/
/usr/local/apache-tomcat-8.5.32/

这样/usr/local目录下的apache-tomcat-8.5.32太长,因此使用软链接的方式,

[root@Web1 local]# pwd
/usr/local
[root@Web1 local]# ln -sv apache-tomcat-8.5.32/  tomcat8

解压后的bin目录下提供了一套tomcat的管理脚本,例如启动tomcat的startup.sh,关闭tomcat的shutdown.sh,查看tomcat版本信息的version.sh等等。
Tomcat


二、主配置文件

tomcat的主配置文件server.xml文件的整体结构如下,而且文件结构也符合tomcat的架构层次。

<Server port="8005" shutdown="SHUTDOWN">
        <Service name="Catalina">
                <Connector port="8080" />
                <Connector  />
                ...
                <Engine name="Catalina" defaultHost="localhost">
                        <Host name="localhost">
                        ...
                        </Host>
                </Engine>
        </Service>
</Server>

tomcat是java语言开发的,因此配置文件也相符合于面向对象的思想,例如,文件中的每个元素创建“对象”,并为属性赋值实例化对象。
Tomcat
该配置文件中的元素都是大写字母开头。
Server
配置文件中的顶层元素,代表一个tomcat实例,并且配置文件中仅能有一个Server。

属性备注属性值
classname实现server的类名
port接受关闭tomcat请求的端口,仅能绑定至127.0.0.18005
shutdown定义关闭tomcat的字符串指令SHUTDOWN

Tomcat
Listener
表示一个事件的监听器

属性备注属性值
clsssname实现该监听器的类名
SSLEngine是否使用SSLon或者off

GlobalNamingResources
全局JNDI资源,该元素没有任何属性,所有的应用程序都可以引用全局JNDI资源。那什么是JNDI资源呢?JNDI多用于java的数据库连接中,到这里我们首先要想到的是JDBC,在JDBC中,连接数据库需要用户名、用户名密码和数据库名称等参数,将来如果这三个参数中的任何一个修改,则整个程序中相关的地方都需要修改,简直是牵一发而动全身,因此出现JNDI技术,在JNDI中,将连接数据库需要的用户、用户密码和数据库名称等JDBC引用的参数定义为一个整体(即这个整体中包含JDBC要用到类库、数据库驱动程序、用户、用户密码等),然后为这个整体设置一个名称,这样以后连接数据库的时候直接在程序中引用这个整体的名称即可,无论用户、用户密码怎么变换,只要这个整体的名称不变,我们仅要修改这个整体的用户和用户密码,而无需修改整个程序。这里的这个整体就是JNDI数据源(JNDI资源)。
虽然GlobalNamingResources没有定义任何的属性,但是可以在<GlobalNamingResources>...</GlobalNamingResources>中嵌套Resource元素。
Resource
定义JNDI数据源

属性备注默认值
name定义的JNDI资源的名称
auth指定管理Resource的管理器有Container和Application两种
type使用的类名
description描述信息---

示例:

  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>

示例表示定义了一个名为UserDataBase的全局JNDI数据源,使用容器管理该Resource,该数据源为加载tomcat-users.xml文件至内存中而定义的用于用户授权的数据库。然后在认证文件tomcat-users.xml中添加如下几行。表示用户名为admin,用户密码为centos的认证用户分别以manager-gui和admin-gui的角色登录manager和host-manager的应用程序。
Tomcat
Tomcat
Service
包含一个或多个Connector和一个Engine的服务组件。属性name表示该Service的名称,默认保持 Catalina即可。<Service>...</Service>中可以嵌套Connector元素和Engine元素。
Connector
代表一个接受客户端请求的连接器。

属性备注属性值
accepCount等待队列的长度10
port连接器监听的端口
protocol连接器应用的协议类型http/https/ajp
connectionTimeout连接的超时时间,单位为毫秒20000
address连接器监听的IP地址默认为所有地址,0.0.0.0
maxThreads最大并发连接数http连接器默认200,https连接器默认150
enableLookups是否开启DNS反解true或false
clientAuthtomcat是否需要认证客户端默认false
redirectPort重定向至指定端口的Connector8443
scheme如果为SSL连接器,则为httpshttp/https
secureSSL连接器则为truetrue或false
SSLEnabled是否开启SSLtrue或false
sslProtocolTLS

其中ajp协议应用在Apache在反向代理tomcat的场景,Apache和tomcat之间就是使用ajp协议通信,它是一种二进制协议。
Engine
代表一个servlet实例,用于处理Connector接受并传递过来的请求。

属性备注属性值
name定义Engine的名称Catalina
defaultHost定义Engine的默认虚拟主机默认为localhost
jvmRoute应用于tomcat集群中的session共享,会在一次会话中添加该值,获得session sticky---

Host
嵌套在<Engine name="Catalina" defaultHost="localhost"> ... </Engine>中的元素,代表一个虚拟主机,一个Engine可以有多个Host。

属性备注属性值
name虚拟主机名
appBase虚拟主机的站点根目录webapps
unpackWARstomcat是否解开WAR归档文件,默认为true,自动解开true或false
autoDeploy是否自动部署追加到根目录下的新应用程序,默认为truetrue或false

示例:
在Engine中新嵌套一个Host,也就是新增加一个虚拟主机,配置内容如下

      <Host name="Web1.linux.com" appBase="/data/webapps"
            unpackWARS="true" autoDeploy="true" />

创建appBase目录,并且tomcat虚拟主机中的每个应用程序都是单独放在一个目录内,因此创建ROOT目录,

[root@Web1 ~]# mkdir -p /data/webapps/ROOT
放入jsp测试页面
[root@Web1 ~]# vim /data/webapps/ROOT/index.jsp
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>  
        <title>My JSP 'first.jsp' starting page</title>   
  </head>

  <body>
        <!-- 在JSP的页面中以表格的形式打印九九乘法表 -->
     <h1>九九乘法表</h1>
     <%
         for(int i=1;i<=9;i++) {
             for(int j=1;j<=i;j++) {
                 out.println(i+"*"+j+"="+(i*j)+"  ");
        }
        out.println("<br/>");
      }
      %>
    </body>
</html>

然后hosts文件中添加Web1.linux.com记录,浏览器中访问。
Tomcat
Realm
访问应用程序的时候需要安全认证,即需要输入用户和用户密码,Realm就是指定存储验证信息(用户和用户密码)的数据源。

<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>

表示通过UserDatabaseRealm的方式获取验证信息,并且该数据源为GlobalNamingResources元素定义的全局JNDI资源UserDatebase。Realm元素嵌套的位置代表验证的范围,例如嵌套在Engine中,则Engine中所有的Host虚拟主机都共用这个认证信息。嵌套在Host中,则Host中所有的应用程序都共用这个认证信息。嵌套在Context中,则该应用程序使用这个认证信息。
Valve
可以嵌套在Engine、Host、Context元素中的组件,不同的类型可以实现特定的功能,例如AccessLogValve可以实现生成访问日志的功能,RemoteAddrValve可以实现控制远程IP地址的访问。
示例:

      <Host name="Web1.linux.com" appBase="/data/webapps"
            unpackWARS="true" autoDeploy="true">
<!--
    directory表示日志存放的目录,prefix和suffix分别表示生成的日志文件名的前缀和后缀,pattern表示记录日志的格式
-->
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="Web1_access_log" suffix=".log"
               pattern="%h %l %u %t "%r" %s %b" />
        <Valve className="org.apache.catalina.valves.RemoteAddrValve" 
               deny="192.168.239.1" />
         </Host>

继续访问Web1.linux.com,结果没有返回页面内容,并且在logs目录下生成了访问日志。
Tomcat
Tomcat
Context
嵌套在Host中的元素,代表某个虚拟主机中的应用程序。常用属性如下

属性备注
docBase对应的web应用程序的目录
path指定该应用程序映射为服务器根目录的URI路径,即host+path
reloadable是否重新加载web应用程序类,默认为false

注:tomcat虚拟主机中的每个应用程序必须单独存在一个目录中,docBase可以使用相对路径和绝对路径,相对路径是相对于Host虚拟主机的appBase目录。
如果path属性值为空字符串,则表示该应用程序为根web应用,即ROOT目录。
示例:

<Host name="Web1.linux.com" appBase="/data/webapps"
            unpackWARS="true" autoDeploy="true">
    <Context path="/test" docBase="test" reloadable="true" />
</Host>

然后创建web应用程序的jsp代码,URL地址列中输入http://web1.linux.com:8080/test ,查看访问结果。

[root@Web1 ~]# mkdir -p /data/webapps/test
[root@Web1 test]# vim index.jsp 

<HTML>
    <HEAD>
        <TITLE>JSP test</TITLE>
    </HEAD>
    <BODY>
        <%
        out.println("<h1>Hello World!!</h1>");
        %>
    </BODY>
</HTML>

Tomcat


三、Nginx+Tomcat实现动静分离

tomcat能够处理用户的web请求(包括动态资源和静态资源),但是tomcat在处理静态资源的时候性能并不是很好,更多的时候是让tomcat只处理动态资源请求,因此使用tomcat大多是使用如下的架构:
Tomcat
在tomcat的前端加一个Nginx反向代理,Nginx接受用户发来的Web请求,当请求的是静态资源的时候,Nginx自己处理,当请求的动态资源的时候,则Nginx将请求代理到后面的tomcat实例。这样来实现tomcat的性能最大化。
Nginx的反向代理配置如下:
当用户请求的是除了jsp|do以外的静态资源的时候,则Nginx自己到/data/webapps/html目录下响应请求,但用户请求的是jsp|do的动态资源的时候,则Nginx将请求代理到后边的tomcat。因此来实现动静分离。

[root@Web1 ~]# vim /etc/nginx/conf.d/proxy.conf
server {
    listen 80;
    server_name Web1.linux.com;
    index   index.jsp;

    location / {
        root /data/webapps/html;
        expires 30d;
    }
    location ~* \.(jsp|do)$ {
        proxy_pass http://localhost:8080;

    }
}

tomcat的sever.xml的主要配置如下:

      <Host name="localhost"  appBase="/data/webapps"
            unpackWARs="true" autoDeploy="true">

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
        <Context path="" docBase="test" reloadable="true"/>
      </Host>

然后在/data/webapps/html目录下编辑一个测试静态资源,在/data/webapps/test目录下编辑一个测试jsp动态代码。

[root@Web1 ~]# cat /data/webapps/html/index.html 
<h2>This is static resource!</h2>
[root@Web1 ~]# cat /data/webapps/test/index.jsp 
<%@ page language="java" %>
<HTML>
    <HEAD>
        <TITLE>JSP test</TITLE>
    </HEAD>
    <BODY>
        <%
        out.println("<h1>This is dynamic resource!</h1>");
        %>
    </BODY>
</HTML>

测试:
在浏览器中输入Nginx的IP地址。
Tomcat
Tomcat


四、Nginx+Tomcat+memcached实现高可用会话集群

通过前端负载均衡器调度到后端不同Tomcat服务器的时候,会出现session不一致的问题。为了解决这个问题,目前实现会话保持的方式主要一下三种:
① stickysession,会话绑定,通过前端调度器特定的算法,将同一个客户端总是调度到后端同一台服务器,例如Nginx做负载均衡的ip_hash算法。
② session replication,会话复制,这个操作在服务器自身上边进行,服务器之间通过复制会话来实现会话同步,例如Tomcat自带的会话集群功能Cluster。
③ session server,会话服务器,通过将session存储在特定的主机之上,服务器通过统一地访问session主机实现会话同步,例如redis、memcached就是这种会话服务器。
环境拓扑:

主机IP地址功能
Master.linux.com192.168.239.137负载均衡调度器
Web1.linux.com192.168.239.129Nginx+tomcat1主机兼memcached1主机
Web2.linux.com192.168.239.140Nginx+tomcat2主机兼memcached2主机

注:Nginx+tomcat主机实现的tomcat的动静分离。

第一步:安装memcache
CentOS本地光盘中提供

[root@Web1 ~]# yum -y install memcached
[root@Web2 ~]# yum -y install memcached

然后开启memcached服务,查看memcached的端口监听状态,
Tomcat
第二步:安装tomcat的第三方类库memcached-session-manager(简称msm)。
该项目在GitHub上。地址为:https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration
需要下载 memcached-session-manager-${version}.jar,memcached-session-manager-tc8-${version}.jar(具体的tc版本要和tomcat版本相同,catalina.sh脚本的 version选项可以查看tomcat的版本信息) 和 spymemcached-${version}.jar。
Tomcat
使用msm还依赖serializer序列化工具,msm提供了四种序列化工具,选择其中一种即可。
这四种连接memcached的序列化工具,分别为kryo-serializer,javolution-serializer,xstream-serializer,flexjson-serializer。
Tomcat
这里以javolution-serializer为例,其下的两个小组件的下载地址如下:
http://www.java2s.com/Code/JarDownload/javolution/javolution-5.5.1.jar.zip
该文件需要解压成jar文件。
http://repo1.maven.org/maven2/de/javakaffee/msm/msm-javolution-serializer/2.1.1/msm-javolution-serializer-2.1.1.jar

所有的jar文件(这里是5个)下载完成之后,将这些jar文件复制到$CATALINA_BASE/lib目录下,该目录下存放着tomcat调用的类库文件(jar文件),我这里的CATALINA_BASE为/usr/local/tomcat8,即安装目录。
第三步:配置Context
在两个tomcat主机的server.xml指定的应用程序下边(即Context),添加Manager元素。具体信息如下:

<Host name="localhost"  appBase="/data/webapps"
            unpackWARs="true" autoDeploy="true">
            <Context path="" docBase="ROOT" reloadable="true">
             <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
                memcachedNodes="n1:192.169.239.129:11211,n2:192.168.239.140:11211"
                failoverNodes="n1"
                requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
                transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"/>
            </Context>
</Host>

memcachedNodes属性指定每个memcache的节点信息,格式为<节点标志符:hostname:port>;
failoverNodes属性指定哪一个memcache节点为备用节点;
requestUriIgnorePattern属性指定无需将静态资源实现会话保持,因为会话本来就是针对动态资源的;
transcoderFactoryClass属性指定序列化工具。
第四步:实现前端的Nginx负载均衡

[root@Master ~]# vim /usr/local/nginx/conf/conf.d/balance.conf
    upstream webserver {
    # tomcat1
        server 192.168.239.129:80 weight=1;
    # tomcat2
        server 192.168.239.140:80 weight=2;
    }

    server {
        listen       80;
        server_name  web.linux.com;
        root    /data/html;
        index    index.php index.html index.htm;

        location / {
            proxy_set_header Host $host;
            proxy_set_header X-Forward-For $remote_addr;
            proxy_pass http://webserver;
        }
    }

到此整个配置已经完成,重启tomcat重新加载新的server.xml文件。
添加测试代码文件index.jsp。

[root@Web1 ~]# vim /data/webapps/ROOT/index.jsp 

<%@ page language="java" %>
 <html>
      <head><title>Tomcat 1</title></head>
          <body>
             <h1><font color="red">Tomcat1.linux.com</font></h1>
           <table align="centre" border="1">
            <tr>
                <td>Session ID</td>
            <% session.setAttribute("linux.com","linux..com"); %>
            <td><%= session.getId() %></td>
            </tr>
            <tr>
            <td>Created on</td>
           <td><%= session.getCreationTime() %></td>
           </tr>
      </table>
    </body>
</html>

在浏览器中输入调度器的IP地址,一直刷新,可以看到调度到不同的tomcat,但是session却保持不变。另外也可以看到连接的是n2的memcache。后边的-n2表示session-id的后缀。
Tomcat
Tomcat
现在暂停n2的memcached服务,继续刷新,session保持不变,但是连接的memcache变成了备用节点n1。实现了memcache的高可用。
Tomcat
Tomcat

转载于:https://blog.51cto.com/13570193/2165362

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值