Web 进阶——Tomcat

Posted 愿许浪尽天涯

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Web 进阶——Tomcat相关的知识,希望对你有一定的参考价值。

一、Tomcat 优化

Tomcat 常见日志:

日志作用
localhost.log存放当天项目运行的详细日志信息。
catalina.out存放所有的日志信息。
localhost_access_log.txt存放用户的 IP 地址、请求的地址、请求的接口、请求的协议、返回的状态码等信息。
manager.logwebapps/manager 项目生成的日志文件。
host-manager.logwebapps/host-manager 项目生成的日志文件。
  • 注意:Tomcat7 版本以上默认会自动进行分割。

1.配置默认页面、页面超时、禁止列出目录

禁止列出目录(Tomcat 默认是拒绝的)

[root@Tomcat ~]# vim /usr/local/tomcat/conf/web.xml
<init-param>
    <param-name>listings</param-name>
    <param-value>false</param-value>
</init-param>
  • 当网页存放路径下,没有默认页面时,不会将其网页存放目录下的内容展示出来。

页面超时

[root@Tomcat ~]# vim /usr/local/tomcat/conf/web.xml
<session-config>
    <session-timeout>30</session-timeout>
</session-config>

默认页面(如果访问的不是默认页面的话,访问时就需要完整路径。如:www.baidu.com/test.html

[root@Tomcat ~]# vim /usr/local/tomcat/conf/web.xml
<welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>
  • Tomcat 的默认根目录为:/usr/local/tomcat/webapps/ROOT

2.禁用 AJP 协议连接器

  • AJP 是一个二进制的 TCP 传输协议,相比 HTTP 这种纯文本的协议来说,效率和性能更高。
  • 但是浏览器并不能直接支持 AJP 协议,只支持 HTTP 协议。
  • 为什么要禁用 AJP 协议:因为支持 AJP 代理的服务器非常少,除了 Apache 之外的 HTTP Server 几乎都不能反代 AJP 协议。
[root@Tomcat ~]# vim /usr/local/tomcat/conf/server.xml
<!-- Define an AJP 1.3 Connector on port 8009 
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
-->
  • 只需要将 Tomcat 主配置文件里的 8009 端口注释即可。

3.配置网页传输压缩

[root@Tomcat ~]# vim /usr/local/tomcat/conf/server.xml
<Connector port="8080" protocol="HTTP/1.1">
    connectionTimeout="20000"
    redirectPort="8443"
    compression="on"								# 开启压缩
    compressionMinSize="10"							# 指定最小压缩文件. 单位是字节
    noCompressionUserAgents="gozilla,traviata"		# 此浏览器类型不进行压缩
    compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"/>			# 压缩文件的格式
[root@Tomcat ROOT]# /usr/local/tomcat/bin/shutdown.sh					# 关闭 Tomcat 服务
[root@Tomcat ROOT]# /usr/local/tomcat/bin/start.sh						# 开启 Tomcat 服务
  • 注意:如果客户端是通过代理来访问后端服务器时,则没有必要配置页面传输压缩。

验证:
在这里插入图片描述

4.Tomcat 的三种模式切换

Java 对 BIO、NIO、APR 的支持:

模式默认运行版本作用
BIO(同步阻塞)Tomcat7 版本以下一个线程处理一个请求;缺点:并发量高时,线程数较多,浪费资源。
NIO(同步非阻塞)Tomcat7 版本以上利用 Java 的异步请求 IO 处理,可以通过少量的线程处理大量的请求。
APR(异步非阻塞)需手动更改从操作系统层面解决 IO 阻塞问题;从而大大地提高 Tomcat 对静态文件的处理性能。

在这里插入图片描述
1)BIO、NIO、APR 适用场景分析

  • BIO:适用于连接数目比较少且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4 以前的唯一选择。
  • NIO:适用于连接数目多且比较短的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4 开始支持。
  • APR:适用于连接数目多且连接比较长的架构,比如相册服务器,充分调用 OS 参与并发操作,编程比较复杂,JDK1.7 开始支持。

2)配置

  • 注意:因为 Tomcat7 版本以上默认使用的是 NIO 模式,所以不再进行配置。

Apr 模式配置:

[root@Tomcat ~]# yum -y install apr apr-devel
[root@Tomcat ~]# cp /usr/local/tomcat/bin/tomcat-native.tar.gz /root/
[root@Tomcat ~]# tar zxf tomcat-native.tar.gz
[root@Tomcat ~]# ls
...    tomcat-native.tar.gz    tomcat-native-1.2.17-src
[root@Tomcat ~]# cd tomcat-native-1.2.17-src/native/
[root@Tomcat native]# ./configure \\
--with-apr=/usr/bin/apr-1-config && make && make install

安装成功会提示如下:

Libraries have been installed in:
   /usr/local/apr/lib
...
[root@Tomcat ~]# cat <<END >> /usr/local/tomcat/bin/catalina.sh 
CATALINA_OPTS="-Djava.library.path=/usr/local/apr/lib"
END
[root@Tomcat ~]# vim /usr/local/tomcat/conf/server.xml						#修改主配置文件
将:
<Connector port="8080" protocol="HTTP/1.1"
修改为:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
  • 注意:当修改为其它模式时,只需要将 Http11AprProtocol 中的 Apr 替换为其它模式即可。
[root@Tomcat ~]# cat <<END >> /etc/profile									#设置环境变量
export LD_LIBRARY_PATH=:/usr/local/apr/lib
END
[root@Tomcat ~]# source /etc/profile										#使其生效
[root@Tomcat ~]# /usr/local/tomcat/bin/shutdown.sh							#关闭 Tomcat 服务
[root@Tomcat ~]# /usr/local/tomcat/bin/start.sh								#开启 Tomcat 服务

3)查看 Tomcat 服务状态

[root@Tomcat ~]# vim /usr/local/tomcat/conf/tomcat-users.xml
在最后一行 </tomcat-users> 前面添加:
<role rolename="admin-gui"/>
<role rolename="manager-gui"/>
<role rolename="manager-jmx"/> 
<role rolename="manager-script"/> 
<role rolename="manager-status"/> 
# 如上五条命令只是设置角色
<user username="admin" password="123123" roles="admin-gui,manager-gui,manager-jmx,manager-script,manager-status"/>

默认 Tomcat 的管理页面只能通过 Tomcat 服务器上的浏览器才可以访问,设置其可以在其他主机访问

[root@Tomcat ~]# vim /usr/local/tomcat/webapps/manager/META-INF/context.xml
<Context antiResourceLocking="false" privileged="true" >   
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$"/>
</Context>

访问验证:http://192.168.1.1:8080/manager/status
在这里插入图片描述

5.生产环境 Tomcat 配置

[root@Tomcat ~]# vim /usr/local/tomcat/conf/server.xml
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"		# 工作模式为 Nio
        URIEncoding="UTF-8"			# 设置编码
        minSpareThreads="25"		# 初始化时创建的 socket 线程数
        maxSpareThreads="75"		# 连接器的最大空闲 socket 线程数. 一旦创建的线程超过这个值. Tomcat就会关闭不再需要的 socket 线程
        enableLookups="false"		# 屏蔽 DNS 查询
		disableUploadTimeout="true"			# 开启 上传数据时. 要么使用更长的时间完成上传. 要么出现更长的超时
        connectionTimeout="20000"			# 网络超时时间. 单位:毫秒
        acceptCount="300"					# 允许的最大连接数. 一般设置为 maxProcessors  1.5 倍即可. 超出后客户端请求将被拒绝
        maxThreads="300"					# 客户端请求最大线程数. 默认值为 "200"
        maxProcessors="1000"				# 最大连接线程数. 并发处理的最大请求数. 默认值为75
        minProcessors="5"					# 最小空闲连接线程数. 用于提高系统处理性能. 默认值为10
        compression="on"					# 开启压缩功能
        compressionMinSize="2048"			# 指定最小的压缩文件. 单位是字节
        compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"		# 压缩文件的格式
        redirectPort="8443"					# 开启安全通道 SSL
/>

6.JVM 内存管理机制

1)堆和非堆内存

JVM 主要管理两种类型的内存:

  • :简单来说堆就是 Java 代码可及的内存,是留给开发人员使用的。
  • 非堆:非堆就是 JVM 留给自己用的,所以方法区、JVM 内部处理或优化所需的内存(如 JIT 编译后的代码缓存);
  • 每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。

内存分配:

  • JVM 堆和非堆的初始值默认都是物理内存的 1/64,最大分配内存为 1/4

2)修改内存等 JVM 相关配置

[root@Tomcat ~]# vim /usr/local/tomcat/bin/catalina.sh
 CLASSPATH= 下面添加:
JAVA_OPTS="-Xms2048M -Xmx2048M -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M"
  • -Xms:设置堆最小内存。
  • -Xmx:设置堆最大内存。
  • -XX:MetaspaceSize:设置非堆最小内存。
  • -XX:MaxMetaspaceSize:设置非堆最大内存。

3)验证

设置成功后我们可以利用 JDK 自动的工具进行验证:

  • jps:用来显示本地的 Java 进程,以及进程号,进程启动的路径等。
  • jmap:能够查看运行中的 JVM 物理内存的占用情况。
[root@Tomcat ~]# jps								# 查看本地 Java 进程号
15703 Jps
15576 Bootstrap
[root@Tomcat ~]# jmap -heap 15576					# 查看 JVM 物理内存占用情况

在这里插入图片描述
如果 JVM 内存超出会报以下错误:

严重: Exception invoking periodic operation: java.lang.OutOfMemoryError: Java heap space

严重: Error processing request java.lang.OutOfMemoryError: GC overhead limit exceeded
  • 说明 Tomcat 已经无力支持访问处理,内部 GC 也已经"无能无力"。所以一般情况下我们需要重新配置 Tomcat 的相关内存大小。

以上是关于Web 进阶——Tomcat的主要内容,如果未能解决你的问题,请参考以下文章

Web应用的组件化进阶篇

Java进阶:Tomcat干货笔记

tomcat进阶操作

Web开发进阶之Servlet理解

我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情

Atom编辑器入门到精通 Atom使用进阶