晓夏

YoungCheung

Zhang Sir's technical way

Apache-Tomca 部署实战

浏览量:1374

一、Tomcat简介

        Tomcat服务器是一个免费的开放源代码的Web应用服务器。Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet 和JSP规范总是能在Tomcat中得到体现,Tomcat 5支持最新的Servlet 2.4和JSP 2.0规范。因为Tomcat技术先进、性能稳定,而且免费,因而深受Java爱好者的喜爱并得到了部分软件开发商的认可,是目前比较流行的开放源代码的Web应用服务器,属于轻量级应用服务器,

        在中小型系统和并发访问用户不是很多场合下被普遍使用,Tomcat和Nginx、Apache(httpd)、lighttpd等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Nginx/Apache服务器。

       在Tomcat中,应用程序的部署很简单,你只需将你的WAR放到Tomcat的webapp目录下,Tomcat会自动检测到这个文件,并将其解压。

       你在浏览器中访问这个应用的Jsp时,通常第一次会很慢,因为Tomcat要将Jsp转化为Servlet文件,然后编译。编译以后,访问将会很快。另外Tomcat也提供了一个应用:manager,访问这个应用需要用户名和密码,用户名和密码存储在一个xml文件中。通过这个应用,辅助于Ftp,你可以在远程通过Web部署和撤销应用。当然本地也可以。

        Tomcat不仅仅是一个Servlet容器,它也具有传统的Web服务器的功能:处理Html页面。但是与Apache相比,它的处理静态Html的能力就不如Apache.可以将Tomcat和Apache集成到一块,让Apache处理静态Html,而Tomcat处理Jsp和Servlet.这种集成只需要修改一下Apache和Tomcat的配置文件即可。

        Tomcat提供Realm支持。Realm类似于Unix里面的group.在Unix中,一个group对应着系统的一定资源,某个group不能访问不属于它的资源。Tomcat用Realm来对不同的应用(类似系统资源)赋给不同的用户(类似group)。没有权限的用户则不能访问这个应用。

        Tomcat提供三种Realm,

        1:JDBCRealm,这个Realm将用户信息存在数据库里,通过JDBC获得用户信息来进行验证。

        2:JNDIRealm,用户信息存在基于LDAP的服务器里,通过JNDI获取用户信息。

        3:MemoryRealm,用户信息存在一个xml文件里面,上面讲的manager应用验证用户时即使用此种Realm.通过Realm可以方便地对访问某个应用的客户进行验证。

        在Tomcat4中,你还可以利用Servlet2.3提供的事件监听器功能,来对你的应用或者Session实行监听。Tomcat也提供其它的一些特征,如与SSL集成到一块,实现安全传输。还有Tomcat也提供JNDI支持,这与那些J2EE应用服务器提供的是一致的。

        说到这里要介绍一下通常所说的应用服务器(如WebLogic)与Tomcat有何区别。

        应用服务器提供更多的J2EE特征,如EJB,JMS,JAAS等,同时也支持Jsp和Servlet.而Tomcat则功能没有那么强大,它不提供EJB等支持。但如果与JBoss(一个开源的应用服务器)集成到一块,则可以实现J2EE的全部功能。既然应用服务器具有Tomcat的功能,那么Tomcat有没有存在的必要呢?

        事实上,的很多中小应用不需要采用EJB等技术,Jsp和Servlet已经足够,这时如果用应用服务器就有些浪费了。而Tomcat短小精悍,配置方便,能满足的需求,这种情况下自然会选择Tomcat。基于Tomcat的开发其实主要是Jsp和Servlet的开发,开发Jsp和Servlet非常简单,你可以用普通的文本编辑器或者IDE,然后将其打包成WAR即可。这里要提到另外一个工具Ant,Ant也是Jakarta中的一个子项目,它所实现的功能类似于Unix中的make。你需要写一个build.xml文件,然后运行Ant就可以完成xml文件中定义的工作,这个工具对于一个大的应用来说非常好,只需在xml中写很少的东西就可以将其编译并打包成WAR。在很多应用服务器的发布中都包含了Ant.另外,在Jsp1.2中,可以利用标签库实现Java代码与Html文件的分离,使Jsp的维护更方便。

        Tomcat也可以与其它一些软件集成起来实现更多的功能。如与上面提到的JBoss集成起来开发EJB,与Cocoon(Apache的另外一个项目)集成起来开发基于Xml的应用,与OpenJMS集成起来开发JMS应用,除了提到的这几种,可以与Tomcat集成的软件还有很多。

二、Tomcat软件安装

2.1.环境准备

[root@Tomcat ~]# cat /etc/redhat-release 
CentOS Linux release 7.1.1503 (Core) 
[root@Tomcat ~]# uname -r
3.10.0-229.el7.x86_64

2.2.软件包下载

JDK:      JDK下载 

~XI~93]]KBT9{2FRJ`YGMRV.jpg

Tomcat: apache-tomcat

因为jdkTomcat的版本对运维来说没什么区别,提供本文使用的软件下载地址:http://pan.baidu.com/s/1IpioA

2.3.部署java环境

[root@Tomcat src]# tar xf jdk-8u60-linux-x64.tar.gz -C /usr/local
[root@Tomcat src]# ln -s /usr/local/jdk1.8.0_60/ /usr/local/jdk
[root@Tomcat src]# sed -i.ori '$a export JAVA_HOME=/usr/local/jdk\nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH\nexport CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar' /etc/profile
[root@Tomcat src]# source /etc/profile

#-->检查java环境是否安装完成

[root@Tomcat src]# java -version
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)

2.4.Tomcat部署

创建项目目录:

[root@Tomcat src]# mkdir /data/project/ -p

解压tomcat软件包:

[root@Tomcat src]# tar xf /usr/local/src/apache-tomcat-8.0.27.tar.gz -C /data/project/
[root@Tomcat src]# mv /data/project/apache-tomcat-8.0.27 /data/project/apache-tomcat1
[root@Tomcat src]# tar xf /usr/local/src/apache-tomcat-8.0.27.tar.gz -C /data/project/
[root@Tomcat src]# mv /data/project/apache-tomcat-8.0.27 /data/project/apache-tomcat2

添加环境变量:

[root@Tomcat src]# echo 'export TOMCAT_HOME=/data/project/apache-tomcat1'>>/etc/profile
[root@Tomcat src]# echo 'export TOMCAT_HOME=/data/project/apache-tomcat2'>>/etc/profile
[root@Tomcat src]# source /etc/profile
[root@Tomcat src]# chown -R root.root /usr/local/jdk/ /data/project/apache-tomcat1
[root@Tomcat src]# chown -R root.root /usr/local/jdk/ /data/project/apache-tomcat2

注意:本次演示两个项目,因此上面创建了两个目录

2.5 Tomcat目录介绍

一级目录:

[root@Tomcat apache-tomcat1]# pwd
/data/project/apache-tomcat1
[root@Tomcat apache-tomcat1]# tree -L 1
.
├── bin             #→用以启动、关闭Tomcat或者其它功能的脚本(.bat文件和.sh文件)
├── conf            #→用以配置Tomcat的XML及DTD文件
├── lib             #→存放web应用能访问的JAR包
├── LICENSE    
├── logs            #→Catalina和其它Web应用程序的日志文件
├── NOTICE
├── RELEASE-NOTES
├── RUNNING.txt
├── temp            #→临时文件
├── webapps         #→Web应用程序根目录
└── work            #→用以产生有JSP编译出的Servlet的.java和.class文件

7 directories, 4 files

tomcat webapps目录

[root@Tomcat webapps]# pwd
/data/project/apache-tomcat1/webapps
[root@Tomcat webapps]# tree -L 1
.
├── docs           #→tomcat帮助文档
├── examples       #→web应用实例
├── host-manager   #→管理
├── manager        #→管理
└── ROOT           #→默认网站根目录

5 directories, 0 files

2.6启动Tomcat

注意:本次演示启动我们只启动tomcat1,因为默认端口是8080,如果两个都启动那么端口就会发生冲突,除非自行进行更改(下面有介绍相关更改操作)。

启动命令及关闭命令:

[root@Tomcat webapps]# /data/project/apache-tomcat1/bin/startup.sh 
[root@Tomcat webapps]# /data/project/apache-tomcat1/bin/shutdown.sh

启动程序及查看状态

[root@Tomcat webapps]# /data/project/apache-tomcat1/bin/startup.sh 
Using CATALINA_BASE:   /data/project/apache-tomcat1
Using CATALINA_HOME:   /data/project/apache-tomcat1
Using CATALINA_TMPDIR: /data/project/apache-tomcat1/temp
Using JRE_HOME:        /usr/local/jdk
Using CLASSPATH:       /data/project/apache-tomcat1/bin/bootstrap.jar:/data/project/apache-tomcat1/bin/tomcat-juli.jar
Tomcat started.
[root@Tomcat webapps]# netstat -lntup|grep jva
[root@Tomcat webapps]# netstat -lntup|grep java
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      4206/java           
tcp6       0      0 :::8009                 :::*                    LISTEN      4206/java           
tcp6       0      0 :::8080                 :::*                    LISTEN      4206/java

2.7 访问网站

#--> ip:port 

如:本次测试主机 192.168.56.6:8080

blob.png

2.8 查看Tomcat日志

[root@Tomcat logs]# tailf catalina.out 
14-Mar-2017 19:06:55.641 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory /data/project/apache-tomcat1/webapps/docs has finished in 38 ms
14-Mar-2017 19:06:55.641 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /data/project/apache-tomcat1/webapps/examples
14-Mar-2017 19:06:56.141 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory /data/project/apache-tomcat1/webapps/examples has finished in 500 ms
14-Mar-2017 19:06:56.142 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /data/project/apache-tomcat1/webapps/host-manager
14-Mar-2017 19:06:56.187 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory /data/project/apache-tomcat1/webapps/host-manager has finished in 45 ms
14-Mar-2017 19:06:56.188 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /data/project/apache-tomcat1/webapps/manager
14-Mar-2017 19:06:56.225 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory /data/project/apache-tomcat1/webapps/manager has finished in 37 ms
14-Mar-2017 19:06:56.233 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]

三、Tomcat配置文件

3.1 Tomcat配置文件:

[root@Tomcat conf]# pwd
/data/project/apache-tomcat1/conf
[root@Tomcat conf]# tree -L 1
.
├── Catalina
├── catalina.policy
├── catalina.properties
├── context.xml
├── logging.properties
├── server.xml            #→主配置文件
├── tomcat-users.xml      #→Tomcat管理用户配置文件
├── tomcat-users.xsd
└── web.xml

3.2 Tomcat管理:

注意:测试功能,生产环境不要用

        Tomcat管理功能用于对Tomcat自身以及部署在Tomcat上的应用进行管理的web应用。在默认情况下是处于禁用状态的。如果需要开启这个功能,就需要配置管理用户,即配置前面说过的tomcat-users.xml。

编辑tomcat-user.xml文件,添加一下内容

<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/>

blob.png

重启Tomcat服务。

[root@Tomcat conf]# /data/project/apache-tomcat1/bin/shutdown.sh 
[root@Tomcat conf]# /data/project/apache-tomcat1/bin/startup.sh

访问:http://192.168.56.6:8080/manager/status

blob.png

用户名及密码都是tomcat

blob.png

3.3 Tomcat主配置文件server.xml

1.server.xml组件类别

· 顶级组件:位于整个配置的顶层,如server。

· 容器类组件:可以包含其它组件的组件,如service、engine、host、context。

· 连接器组件:连接用户请求至tomcat,如connector。

· 被嵌套类组件:位于一个容器当中,不能包含其他组件,如Valve、logger。

<server>
     <service>
     <connector />
     <engine>
     <host>
     <context></context>
     </host>
     <host>
     <context></context>
     </host>
     </engine>
     </service>
</server>

2. 组件详解

·    engine:核心容器组件,catalina引擎,负责通过connector接收用户请求,并处理请求,将请求转至对应的虚拟主机host。

·    host:类似于httpd中的虚拟主机,一般而言支持基于FQDN的虚拟主机。

·    context:定义一个应用程序,是一个最内层的容器类组件(不能再嵌套)。配置context的主要目的指定对应对的webapp的根目录,类似于httpd的alias,其还能为webapp指定额外的属性,如部署方式等。

·    connector:接收用户请求,类似于httpd的listen配置监听端口的。

·    service(服务):将connector关联至engine,因此一个service内部可以有多个connector,但只能有一个引擎engine。service内部有两个connector,一个engine。因此,一般情况下一个server内部只有一个service,一个service内部只有一个engine,但一个service内部可以有多个connector。

·    server:表示一个运行于JVM中的tomcat实例。

·    Valve:阀门,拦截请求并在将其转至对应的webapp前进行某种处理操作,可以用于任何容器中,比如记录日志(access log valve)、基于IP做访问控制(remote address filter)

·    logger:日志记录器,用于记录组件内部的状态信息,可以用于除context外的任何容器中。

·    realm:可以用于任意容器类的组件中,关联一个用户认证库,实现认证和授权。可以关联的认证库有两种:UserDatabaseRealm、MemoryRealm和JDBCRealm。

·     UserDatabaseRealm:使用JNDI自定义的用户认证库。

·    MemoryRealm:认证信息定义在tomcat-users.xml中。

·    JDBCRealm:认证信息定义在数据库中,并通过JDBC连接至数据库中查找认证用户。

3. 配置文件注释

<?xml version='1.0' encoding='utf-8'?>
<!--
<Server>元素代表整个容器,是Tomcat实例的顶层元素.由org.apache.catalina.Server接口来定义.它包含一个<Service>元素.并且它不能做为任何元素的子元素.
    port指定Tomcat监听shutdown命令端口.终止服务器运行时,必须在Tomcat服务器所在的机器上发出shutdown命令.该属性是必须的.
    shutdown指定终止Tomcat服务器运行时,发给Tomcat服务器的shutdown监听端口的字符串.该属性必须设置
-->
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
  <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>
  <!--service服务组件-->
  <Service name="Catalina">
    <!--
    connector:接收用户请求,类似于httpd的listen配置监听端口.
        port指定服务器端要创建的端口号,并在这个端口监听来自客户端的请求。
        address:指定连接器监听的地址,默认为所有地址(即0.0.0.0)
        protocol连接器使用的协议,支持HTTP和AJP。AJP(Apache Jserv Protocol)专用于tomcat与apache建立通信的, 在httpd反向代理用户请求至tomcat时使用(可见Nginx反向代理时不可用AJP协议)。
        minProcessors服务器启动时创建的处理请求的线程数
        maxProcessors最大可以创建的处理请求的线程数
        enableLookups如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址
        redirectPort指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号
        acceptCount指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理
        connectionTimeout指定超时的时间数(以毫秒为单位)
    -->
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
 
    <!--engine,核心容器组件,catalina引擎,负责通过connector接收用户请求,并处理请求,将请求转至对应的虚拟主机host
        defaultHost指定缺省的处理请求的主机名,它至少与其中的一个host元素的name属性值是一样的
    -->
    <Engine name="Catalina" defaultHost="localhost">
      <!--Realm表示存放用户名,密码及role的数据库-->
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>
      <!--
      host表示一个虚拟主机
        name指定主机名
        appBase应用程序基本目录,即存放应用程序的目录.一般为appBase="webapps" ,相对于CATALINA_HOME而言的,也可以写绝对路径。
        unpackWARs如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接从WAR文件中运行应用程序
        autoDeploy:在tomcat启动时,是否自动部署。
        xmlValidation:是否启动xml的校验功能,一般xmlValidation="false"。
        xmlNamespaceAware:检测名称空间,一般xmlNamespaceAware="false"。
      -->
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <!--
        Context表示一个web应用程序,通常为WAR文件
            docBase应用程序的路径或者是WAR文件存放的路径,也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径。
            path表示此web应用程序的url的前缀,这样请求的url为http://localhost:8080/path/****
            reloadable这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化,自动装载新的应用程序,可以在不重启tomcat的情况下改变应用程序
        -->
        <Context path="" docBase="" debug=""/>
 
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t "%r" %s %b" />
      </Host>
    </Engine>
  </Service>
  </Server>

四、WEB站点部署

4.1 使用war包部署

[root@Tomcat webapps]# pwd
/data/project/apache-tomcat1/webapps
[root@tomcat webapps]# rz      #→上传memtest.war,此文件也在上面的百度网盘里
[root@tomcat webapps]# ls
docs  examples  host-manager  manager  memtest  memtest.war  ROOT

浏览器访问:http://192.168.56.6:8080/memtest/meminfo.jsp

blob.png

4.2 自定义默认站点目录

上面访问的地址是:http://192.168.56.6:8080/memtest/meminfo.jsp

我现在想访问:http://192.168.56.6:8080/meminfo.jsp

那么,我们应该怎么办?

方法一、

meminfo.jsp或其他程序放在tomcat/webapps/ROOT目录下即可。因为默认网站根目录tomcat/webapps/ROOT

[root@Tomcat webapps]# mv memtest/meminfo.jsp ROOT

blob.png

方法二、

[root@Tomcat webapps]# vim /data/project/apache-tomcat1/conf/server.xml

#---->添加:

<Context path="" docBase="/data/project/apache-tomcat1/webapps/memtest" debug="0" reloadable="false" crossContext="true"/>blob.png

blob.png

五、Tomcat多实例及集群

5.1 tomcat多实例

    之前我们创建了两个tomcat,上面测试只用了apache-tomcat1,那么下面我们来更改apache-tomcat2

5.2 修改配置文件

sed -i '22s#8005#8011#;69s#8080#8081#;123s#appBase=".*"# appBase="/data/www/www"#' /data/project/apache-tomcat1/conf/server.xml
sed -i '22s#8005#8012#;69s#8080#8082#;123s#appBase=".*"# appBase="/data/www/www"#' /data/project/apache-tomcat2/conf/server.xml

5.3 启动多实例

for i in {1..2};do /data/project/apache-tomcat$i/bin/startup.sh;done

浏览器访问

blob.png

5.4 Tomcat集群

使用Nginx+tomcat反向代理集群

nginx安装(略)

反向代理配置如下:

[root@Tomcat nginx]# cat  /etc/nginx/nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream web_pools{
    server 127.0.0.1:8081;  
    server 127.0.0.1:8082;
      
   }
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.jsp index.html index.htm;
        proxy_pass http://web_pools;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}


blob.png

到此,Tomcat部署完成.

神回复

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。