阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Linux下Tomcat使用详解

142次阅读
没有评论

共计 10231 个字符,预计需要花费 26 分钟才能阅读完成。

Tomcat 简介

  • 官网:http://tomcat.apache.org/
  • Tomcat GitHub 地址:https://github.com/apache/tomcat

Tomcat 是 Apache 软件基金会(Apache Software Foundation)的 Jakarta 项目中的一个核心项目,由 Apache、Sun 和其他一些公司及个人共同开发而成。
Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选。
Tomcat 和 Nginx、Apache(httpd)、lighttpd 等 Web 服务器一样,具有处理 HTML 页面的功能,另外它还是一个 Servlet 和 JSP 容器,独立的 Servlet 容器是 Tomcat 的默认模式。不过,Tomcat 处理静态 HTML 的能力不如 Nginx/Apache 服务器

  • 最新版:http://apache.opencas.org/tomcat/tomcat-9/v9.0.0.M4/bin/apache-tomcat-9.0.0.M4.tar.gz,java 容器还有 resin,weblogic 等。

Tomcat 安装

# 安装 JDK
jdk:wget --no-check-certificate --no-cookies --header "Cookie: Oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u92-b14/jdk-8u92-linux-x64.rpm
# 下载 tomcat 源码包
tomcat:wget http://apache.opencas.org/tomcat/tomcat-7/v7.0.69/bin/apache-tomcat-7.0.69.tar.gz
# yum 安装 jdk
rpm -ivh jdk-8u92-linux-x64.rpm
# 配置 java 全局环境变量,可以直接写到 profile 里面
cat > /etc/profile.d/jdk.sh << 'EOF' 
#JDK options 
export JAVA_HOME=/usr/java/jdk1.7.0_79 
export JAVA_BIN=${JAVA_HOME}/bin 
export PATH=${JAVA_BIN}:$PATH 
export CLASS_PATH=.:${JAVA_HOME}/lib/tools.jar:${JAVA_HOME}/lib/dt.jar 
EOF 
# 赋权
chmod 755 /etc/profile.d/jdk.sh 
bash /etc/profile.d/jdk.sh &>/dev/null 
source /etc/profile &>/dev/null
# 确认 java 环境
java -version
# 配置 tomcat
tar zxvf apache-tomcat-7.0.69.tar.gz -C /usr/local/src
mv apache-tomcat-7.0.69 /data/tomcats/tomcat_8081 
#Tomcat options 
cat > /etc/profile.d/tomcat.sh << 'EOF' 
export CATALINA_BASE=/data/tomcats/tomcat 
export CATALINA_BIN=${CATALINA_BASE}/bin 
export PATH=${CATALINA_BIN}:$PATH 
EOF 
chmod 755 /etc/profile.d/tomcat.sh 
bash /etc/profile.d/tomcat.sh &>/dev/null 
source /etc/profile &>/dev/null 
bash /data/tomcats/tomcat/bin/startup.sh
netstat -nltp | grep 8080

Tomcat 目录介绍

# 移动到 tomcat 目录
[root@linuxidc conf]# cd /data/tomcats/tomcat_8081
[root@linuxidc tomcat_8081]# 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 文件
# 启动 Tomcat
/data/tomcats/tomcat_8081/bin/startup.sh
/data/tomcats/tomcat_8081/bin/shutdown.sh
tailf /data/tomcats/tomcat_8081/logs/catalina.out              # 实时日志
less /data/tomcats/tomcat_8081/logs/localhost.`date +%F`.log   #tomcat 启动记录日志

Tomcat 配置文件

[root@linuxidc conf]# cd /data/tomcats/tomcat_8081/conf
[root@linuxidc conf]# ll -h
total 212K
drwxr-xr-x 3 root root 4.0K Apr 26 10:48 Catalina
-rw------- 1 root root  12K Feb  9 04:29 catalina.policy
-rw------- 1 root root 6.2K Feb  9 04:29 catalina.properties
-rw------- 1 root root 1.4K Feb  9 04:29 context.xml
-rw------- 1 root root 3.3K Feb  9 04:29 logging.properties
-rw------- 1 root root 6.5K Apr 26 10:46 server.xml            # 主配置文件      
-rw------- 1 root root 1.5K Feb  9 04:29 tomcat-users.xml      #tomcat 管理用户配置文件
-rw------- 1 root root 165K Feb  9 04:29 web.xml

Tomcat 管理

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

[root@linuxidc conf]# vim /data/tomcats/tomcat_8081/conf/tomcat-users.xml
…………
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/>
</tomcat-users>  #→在此行前加入上面三行,并去掉注释
/data/tomcats/tomcat_8081/bin/startup.sh
/data/tomcats/tomcat_8081/bin/shutdown.sh

Tomcat 主配置文件 Server.xml 详解

  • 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>
  • 组件详解

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 valve)。
logger:日志记录器,用于记录组件内部的状态信息,可以用于除 context 外的任何容器中。
realm:可以用于任意容器类的组件中,关联一个用户认证库,实现认证和授权。可以关联的认证库有两种:UserDatabaseRealm、MemoryRealm 和 JDBCRealm。
UserDatabaseRealm:使用 JNDI 自定义的用户认证库。
MemoryRealm:认证信息定义在 tomcat-users.xml 中。
JDBCRealm:认证信息定义在数据库中,并通过 JDBC 连接至数据库中查找认证用户。

  • 配置文件注释
<?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 &quot;%r&quot; %s %b" />
      </Host>
    </Engine>
  </Service>
</Server>

web 站点部署

上线的代码有两种方式,第一种方式是直接将程序目录放在 webapps 目录下面,这种方式大家已经明白了,就不多说了。第二种方式是使用开发工具将程序打包成 war 包,然后上传到 webapps 目录下面。

Tomcat 多实例及集群架构

  • 复制 Tomcat 目录
cp -a apache-tomcat-7.0.69 tomcat_8081
cp -a apache-tomcat-7.0.69 tomcat_8082
cp -a apache-tomcat-7.0.69 tomcat_8083
  • 修改每个 tomcat 配置文件 server.xml
22 <Server port="8006" shutdown="SHUTDOWN">
71     <Connector port="8081" protocol="HTTP/1.1"
72                connectionTimeout="20000"
73                redirectPort="8443" />

22 <Server port="8007" shutdown="SHUTDOWN">
71     <Connector port="8082" protocol="HTTP/1.1"
72                connectionTimeout="20000"
73                redirectPort="8443" />

22 <Server port="8008" shutdown="SHUTDOWN">
71     <Connector port="8082" protocol="HTTP/1.1"
72                connectionTimeout="20000"
73                redirectPort="8443" />
<!-- <Connector port="8010" protocol="AJP/1.3" redirectPort="8443" /> --> #此行注释
  • 启动多实例
for i in {808180828083};do /data/tomcats/tomcat_$i/bin/startup.sh;done
netstat -tunlp|grep java

Tomcat 集群

  • 使用 nginx+Tomcat 反向代理集群
[root@linuxidc ~]# vim /opt/nginx/conf/nginx.conf
    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;
        }
     }

Tomcat 安全优化和性能优化

  • 安全优化

降权启动、telnet 管理端口保护、ajp 连接端口保护、禁用管理端

  • 性能优化

屏蔽 dns 查询 enableLookups=”false”

<Connector  port="8081" protocol="HTTP/1.1"
               connectionTimeout="6000" enableLookups="false" acceptCount="800"
               redirectPort="8443" />

 

  • jvm 调优

 

Tomcat 比较消耗内存,内存足够,tomcat 运行就快,系统资源有限的情况下,需要进行调优,提高资源利用率。

优化 catalina.sh 配置文件。在 catalina.sh 配置文件中添加以下代码:JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m"
server: 一定要作为第一个参数,在多个 CPU 时性能佳
-Xms:初始堆内存 Heap 大小,使用的最小内存,cpu 性能高时此值应设的大一些
-Xmx:初始堆内存 heap 最大值,使用的最大内存
上面两个值是分配 JVM 的最小和最大内存,取决于硬件物理内存的大小,建议均设为物理内存的一半。-XX:PermSize:设定内存的永久保存区域
-XX:MaxPermSize:设定最大内存的永久保存区域
-XX:MaxNewSize:
-Xss 15120 这使得 JBoss 每增加一个线程(thread)就会立即消耗15 M 内存,而最佳值应该是128K, 默认值好像是512k.
+XX:AggressiveHeap 会使得 Xms 没有意义。这个参数让 jvm 忽略 Xmx 参数, 疯狂地吃完一个 G 物理内存, 再吃尽一个 G 的 swap。-Xss:每个线程的 Stack 大小
-verbose:gc 现实垃圾收集信息
-Xloggc:gc.log 指定垃圾收集日志文件
-Xmn:young generation 的 heap 大小,一般设置为 Xmx34分之一
-XX:+UseParNewGC:缩短 minor 收集的时间
-XX:+UseConcMarkSweepGC:缩短 major 收集的时间
  • 常规设置:vim catalina.sh
[root@linuxidc ~]# vim /data/tomcats/tomcat_8081/bin/catalina.sh
# OS specific support.  $var _must_ be set to either true or false.
JAVA_OPTS="-server -Xms1G -Xmx2G -Xss256K -Djava.awt.headless=true -Dfile.encoding=utf-8 -XX:PermSize=64M -XX:MaxPermSize=128M"

 

更多 Tomcat 相关教程见以下内容

CentOS 6.6 下安装配置 Tomcat 环境  http://www.linuxidc.com/Linux/2015-08/122234.htm

RedHat Linux 5.5 安装 JDK+Tomcat 并部署 Java 项目  http://www.linuxidc.com/Linux/2015-02/113528.htm 

Tomcat 权威指南(第二版)(中英高清 PDF 版 + 带书签)  http://www.linuxidc.com/Linux/2015-02/113062.htm 

Tomcat 安全配置与性能优化 http://www.linuxidc.com/Linux/2015-02/113060.htm 

Linux 下使用 Xshell 查看 Tomcat 实时日志中文乱码解决方案 http://www.linuxidc.com/Linux/2015-01/112395.htm 

CentOS 64-bit 下安装 JDK 和 Tomcat 并设置 Tomcat 开机启动操作步骤 http://www.linuxidc.com/Linux/2015-01/111485.htm 

CentOS 6.5 下安装 Tomcat  http://www.linuxidc.com/Linux/2015-01/111415.htm 

Tomcat 中 session 的管理机制  http://www.linuxidc.com/Linux/2016-09/135072.htm

Tomcat 的详细介绍:请点这里
Tomcat 的下载地址:请点这里

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-11/137247.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计10231字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中