tomcat

tomcat


  • 简述

  • tomcat的结构

  • tomcat配置

  • 总结与问题


简述

什么是tomcat?

tomcat是一个java2ee的web容器的残缺实现,提供了serverlet,asp转换等组件。

tomcat的功能?

tomcat能够将asp文件通过转换,转换为serverlet格式,这样子就可以被java识别运行并将结果转为asp响应,并且tomcat其实也是内置了一个web服务器。

tomcat的结构

tomcat结构

server:服务器段,直接面向用户请求,tomcat的一个实例。
service:服务进程,deamon守护进程。
connect:连接器,用来连接server与service,当server接收请求后,通过连接器将请求传达给service。
engine:引擎,不同的引擎,提供了不同的方式处理serverlet,一个service中可以有多个engine,但是一般来说只有一个engine。
host:虚拟主机,可以有多个host,每个servername指向各自的host。
context:上下文,可以有多个,每一个context指向了不同的程序。
valve:阀门,用来定义一些独立的功能,如日志等,每一个host内可以有多个value,每一个value定义一个功能。
Realm:领域,用于用户的认证和授权。
Logger:用于记录组件内部的状态信息,可被用于除Context之外的任何容器中。

tomcat配置

tomcat的下载与安装

可通过yum源或者code包的方式使用,由于tomcat也是由java所编写的,所以tomcat其实也是运行在jvm上的一段代码,运行tomcat也只是将code放在java上运行。

1. yum install tomcat -y
2. tar xvf apache-tomcat-release.tar.gz -C /usr/local
    ln -sv /usr/local/apache-tomcat-release /usr/local/tomcat

环境变量的设置

# echo -e "export CATALINA_HOME=/usr/local/tomcat \nexport PATH=\$CATALINA_HOME/bin:\$PATH" > /etc/profile.d/tomcat.sh
# cat /etc/profile.d/tomcat.sh
    export CATALINA_HOME=/usr/local/tomcat 
    export PATH=$CATALINA_HOME/bin:$PATH

# . /etc/profile.d/tomcat.sh

由于tomcat是通过java编写的javaweb容器,所以在运行tomcat之前,需要准备好jdk环境,设置好JAVA_HOME和PATH环境变量。

以下的内容通过源码包方式。

tomcat的主要目录和文件。

bin/                  二进制文件目录。
    - catalina.sh
    - ...

conf/                  配置文件目录。
    - catalina.policy              Java相关的安全策略配置文件;
    - catalina.properties          Tomcat内部package的定义及访问相关的控制;
    - context.xml                  所有host的默认配置信息;
    - logging.properties          日志记录器相关;
    - server.xml                 Tomcat的主配置文件,包含Service, Connector, Engine, Realm, Valve, Hosts主组件的相关配置信息;
    - tomcat-users.xml              Realm认证时用到的相关角色、用户和密码等信息;
    - web.xml                    遵循Servlet规范标准的配置文件;

lib/                class类库文件目录。
    - catalina.jar
    - ...

logs/                  tomcat的日志目录。          
temp/                  临时文件目录。

webapps/              应用程序的默认存放目录。
    - docs  
    - examples  
    - host-manager  
    - manager 
    - ROOT                一般来说,当前版本所使用的APP会被通过ROOT来软链接。
    ├── images/            图片文件目录
    │    ├── void.gif
    │    └── ...
    ├── META-INF/        相当于一个信息包,用来配置应用程序、扩展程序、类加载器和服务manifest.mf文件,在用jar打包时自动生成。
    ├── index.jsp        JSP的默认文件,一般是默认主页。
    └── WEB-INF/
        ├──    classes/    包含了站点所有用的 class 文件,包括 servlet class 和非servlet class,他们不能包含在 .jar文件中,编译成class的类库。
        ├──    lib/        存放web应用需要的各种JAR文件,放置仅在这个应用中要求使用的jar文件,如数据库驱动jar文件。
        ├──    ...
        └── web.xml        Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则。

work/                tomcat的工作目录,存放了已经编译好了的文件等。

catalina.sh

[root@web1 bin]# catalina.sh --help                    catalina.sh是tomcat的主要管理脚本。
Using CATALINA_BASE:   /usr/local/tomcat            可以这边列出了CATALINA的一些ENV变量的值。
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/java/latest
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Usage: catalina.sh ( commands ... )                    以下就是catalina.sh的命令使用帮助。
commands:
  debug             Start Catalina in a debugger                        
  debug -security   Debug Catalina with a security manager
  jpda start        Start Catalina under JPDA debugger
  run               Start Catalina in the current window
  run -security     Start in the current window with security manager
  start             Start Catalina in a separate window
  start -security   Start in a separate window with security manager
  stop              Stop Catalina, waiting up to 5 seconds for the process to end
  stop n            Stop Catalina, waiting up to n seconds for the process to end
  stop -force       Stop Catalina, wait up to 5 seconds and then use kill -KILL if still running
  stop n -force     Stop Catalina, wait up to n seconds and then use kill -KILL if still running
  configtest        Run a basic syntax check on server.xml - check exit code for result
  version           What version of tomcat are you running?
Note: Waiting for the process to end and use of the -force option require that $CATALINA_PID is defined

由于java编写的程序,实际上通过给java传递参数来实现运行的,也就是说要将代码传递给java程序来运行,所以,实际上catalina.sh这个脚本就是专门用来管理tomcat并实现简易化传递参数的,并整合了tomcat的bin/目录下的其他脚本。

server.xml

server.xml的基本结构:
<server>
  <service>
    <connect />
    <connect />
      <engine>
        <host>
          <context />
          <Logger />
          <valve />
          <Realm />
        </host>
      </engine>
    </service>
  </server>

----------------------------------------------------------------------------------------
文件具体的解析:
<?xml version='1.0' encoding='utf-8'?>                    定义了xml的版本和采用的编码。
<Server port="8005" shutdown="SHUTDOWN">                定义在tomcat关闭时,传递给shutdown监听端口8005的字符串"SHUTDOWN".
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />        类库的调用和参数传递。
  <Listener className="org.apache.catalina.security.SecurityListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JasperListener" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

    <GlobalNamingResources>                                GlobalNamingResources定义了服务器的全局JNDI资源来调用java API结构。                        
    <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 name="Catalina">                            定义了service的name。                
    <Connector port="8080" protocol="HTTP/1.1"            http的连接器; 每一个连接器类似于定义了不同的端口,不同的协议来接收用户请求。
               connectionTimeout="20000"
               redirectPort="8443" />
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />    ajp的连接器。

    <!-- 
    <Connector executor="tomcatThreadPool"                tomcat的线程池关联的连接器。
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"        https的连接器相关。
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" />
    -->


    <Engine name="Catalina" defaultHost="web1">            engine段,定义了engine name和访问/时,默认指向的虚拟主机。

          <Realm className="org.apache.catalina.realm.LockOutRealm">     安全上下文,基于UserDatabase文件(通常是tomcat-user.xml)实现用户认证。
               <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
          </Realm>

          <Host name="localhost"  appBase="webapps"        默认的虚拟主机localhost,指向了tomcat的默认页面。
                unpackWARs="true" autoDeploy="true">    name虚拟主机名称,appbase程序的目录,unpackWARs自动展开WAR文件,autoDeploy热部署。

            <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/web/log"    valve定义了日志相关。
                   prefix="localhost_access_log." suffix=".txt"
                   pattern="%h %l %u %t &quot;%r&quot; %s %b" />
          </Host>

          <Host name='web1' appBase='/web/data' unpackWARs='ture' autoDeploy='false'>        第二个虚拟主机web1。

             <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/web/log"        
                   prefix="web1_access_log." suffix=".txt"
                   pattern="%h %l %u %t &quot;%r&quot; %s %b" />

             <Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="127\.0\.0\.1"/>        
                    <!-- 此处通过valve中的类RemoteAddrValve定义了基于ip的访问控制,拒绝了本地访问,类RemoteHostValve则是基于主机名的访问控制 
                            当然其实此处的访问控制仅为演示,实际上并没有什么特殊意义!-->

             <Context path='/' docBase='/web/data/hp' />        定义了一个访问路径,如果访问/,相对应的路径为/web/data/hp
          </Host>
      </Engine>
      </Service>
    </Server>

valve等内嵌段如果没有什么其他配置,可以通过/>的方式直接闭合;

此处只是列出了一部分的常用配置,更加详细的配置请参考官方文档或者google来自行扩展设置;

还有非常多的classname能够实现各种各样的功能,认证等,请自行查阅官方文档。

tomcat.conf (rpm) 或 /etc/sysconfig/tomcat (code)

JAVA_OPS=''        传递给java的额外参数,例如: JAVA_OPS='-XMX30m -XMS20m -XX:MaxNewSize=20m'

设定tomcat默认页上的管理认证

vim tomcat/conf/tomcat-users.xml
    <role rolename="manager-gui"/>                定义角色;manager-gui
    <role rolename="manager-script"/>            
    <role rolename="standard"/>
    <role rolename="admin-gui"/>                admin-gui;
    <user username="tomcat" password="secret" roles="admin-gui,manager-script,standard,admin-gui"/>        定义认证用户以及属于的角色。
    <user username="" pa... />                    可定义多个用户。

设定tomcat的默认页

vim tomcat/conf/web.xml
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>        第一顺位
        <welcome-file>index.html</welcome-file>        第二
        <welcome-file>index.htm</welcome-file>        第三
    </welcome-file-list>

总结和问题

问题

1.访问文件404,可以看看是不是你的appbase定义错了,并且查看docbase是否有错误,有些时候可以尝试增减’/web/data/hp/’最后这个/来实验一下。 
2.推荐使用绝对路径,因为有些时候使用相对路径会产生一些冲突,比如果你在host中定义了appbase为app,如果在docbase中定义为web,并且path也是web,就会产生冲突,认为你去访问了app/web/web路径。 
3.访问不到,可以检查一下是否设定好了selinux和iptables,并且url有没有指定你设定的端口,不同的连接器,端口也是不一样的。 
4.ss -tnlp看一下端口是否启动了。

总结和其他

1.tomcat是一个可以选择运行为单进程模式或者是master/slave的process模式的,但是官方推荐还是使用单进程减少故障的出错率。 
2.其实我们在使用tomcat时,不会让tomcat直接面相用户,也就是说不会让用户直接访问8080,也不改动端口为80,而是在本机上加一个httpd或者nginx代理,将所有80端口的访问转到8080来处理,这样子前端的web服务就可以用来专门建立连接。 
3.所以其实tomcat有两种运行方式,一种方式就是直接面向请求,另外一种就是使用代理来面向请求。 
4.至于整合tomcat和nginx或者httpd又或者haporxy放到后面的博客中会仔细阐述实现方式,已经常用的架构。

原创文章,作者:Net18_肖肖,如若转载,请注明出处:http://www.178linux.com/19869

(0)
Net18_肖肖Net18_肖肖
上一篇 2016-06-24 12:47
下一篇 2016-06-24

相关推荐

  • 分布式文件系统之fastDFS部署

    fastDFS下载地址:https://github.com/happyfish100/fastdfs部署参考文档:http://joelhy.github.io/2015/01/27/FastDFS-v5-06-deploy/ 我们接下来来部署fastDFS 部署结构: 192.168.42.150 node1 [Tracker]192.168.42.15…

    Linux干货 2017-06-16
  • mysql-yum安装多实例

    1.安装包 yum install mariadb-server 2.创建文件 3 分别生成3306,3307,3308数库文件 4.复制主配置文件并分别修改端口路径 5.准备一个启动脚本并开启服务 /mysqldb/3307/mysqld start 6.用mysql -S 命令进入    

    2018-01-28
  • zabbix+grafana ——小于初始,大于勤拙@时雨扰扰,几多怅惘,几多忧思

    前边一点小总结,纯属回顾启动大脑所用,毕竟we are no computer! 一个监控系统必须包括4个功能 1)采集数据 2)存储数据 3)故障报警 4)数据可视化显示 zabbix作为一个监控系统,当让也就包含了以上四种zabbix-server-mysql,zabbix-agent,zabbix-get,zabbix-sender,zabbix-we…

    2017-10-09
  • 基于Cobbler实现多版本操作系统自动部署

    前言     在生产环境中,当需要批量部署几十甚至上百台服务器时,实现自动化安装操作系统尤为重要,按照传统的光盘引导安装是不可想象的;此前我们通过pxe+kickstart简单实现了自动化安装,但只能实现单一版本安装,当需要部署不同版本或不同引导模式(BIOS、EFI)时,此种方式就不够灵活。而Cobbler正是为了解…

    Linux干货 2015-08-11
  • 系统启动流程相关概念

    前言: 了解系统内核基本知识 内核功能:进程管理、内存管理、网络协议栈、文件系统、驱动程序、安全功能等  用户空间:应用程序其中有进程或者线程 运行中的系统可分为两层:内核空间、用户空间  内核设计流派:  单内核设计:把每种功能集成于一个程序中;例如:linux 微内核设计:每种功能使用一个单独的子系统实现;例如:Window…

    Linux干货 2016-09-19
  • 天神之剑Vim编辑器

    一.概述和基本用法及一些描述 vi:Visual Interface 文本编辑器 文本ASCII , Unicode 文本编辑种类: 行编辑器:sed 全屏编辑器:nano,vi vim – Vi Improved 其他编辑器: gedit 一个简单的图形编辑器 gvim 一个vim编辑器的图形版本 基本用法  vim [OPTION]…

    Linux干货 2016-08-15