[TOC]
描述:Apache Tomcat是美国Apache软件基金会的一款轻量级Web应用服务器,该程序实现了对Servlet和JSP的支持。 Tomcat是在Sun公司推出的小型Servlet/JSP调试工具的基础上发展起来的一个优秀的Servlet容器,已成为目前开发企业JavaWeb应用的最佳Servlet容器选择之一。 Tomcat本身完全用java语言编写,所以tomcat的运行需要java的支持,所以要先安装JDK才能运行;
目前是Apache开源软件组织的一个软件项目它的官网 :http://tomcat.apache.org
使用范围:在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选
用途:
特点:
Tomcat的组成结构:
Tomcat本身由一系列可配置的组件构成
,其中核心组件是Servlet容器组件,它是所有其他Tomcat组件的顶层容器。
每个组件都可以在Tomcat安装目录/conf/server.xml文件中进行配置,且每个Tomcat组件在该文件中对应一种配置元素。 下面用XML的形式展示各种Tomcat组件之间的关系
<Server>代表整个Servlet容器组件,是最顶层元素,可以包含一个或多个元素<Service>
<Service>包含一个<Engine>元素以及一个或多个<Connector>元素,这些<Connector>共享一个<Engine>
<Connector/>代表和客户程序实际交互的组件,负责接收客户请求,以及向客户返回响应
<Engine>每个<Service>元素只能包含一个<Engine>元素,它处理在同一个<Service>中所有<Connector>接收到的客户请求
<Host>在一个<Engine>中可以包含多个<Host>,它代表一个虚拟主机(即一个服务器程序可以部署在多个有不同IP的服务器主机上),它可以包含一个或多个应用
<Context>使用最频繁的元素,代表了运行在虚拟主机上的单个web应用
</Host>
</Engine>
</Service>
</Server>
Tomcat体系结构图
WeiyiGeek.体系结构图
JavaWeb应用的发布方式:
常常使用场景:
WeiyiGeek.
补充:
安装环境:
Centos7.x 3.10.0-957.12.2.el7.x86_64
JDK 1.8
Tomcat 8.x
安装操作步骤:
#1.卸载系统自带的openjdk并安装jdk
rm -rf $(which java)
tar xf jdk-7u80-linux-x64.tar
mv jdk1.7.0_80/ /usr/local/java
#2.解压安装Tomcat
tar xf apache-tomcat-8.5.20.tar.gz
mv apache-tomcat-8.5.20 /usr/local/tomcat8
#3.设置JAVA与TOMCAT环境变量
$cat >> /etc/profile.d/javaEnv.sh<<END
#设置java根目录
export JAVA_HOME=/opt/tomcat/jdk8
export JRE_HOME=/opt/tomcat/jdk8/jre
export CLASSPATH=.:\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar:\$CATALINA_HOME/lib/servlet-api.jar
#Tomcat路径设置
export TOMCAT_HOME=/opt/tomcat/apache-tomcat-8.5.45
export CATALINA_HOME=/opt/tomcat//apache-tomcat-8.5.45
#在PATH环境变量中添加java跟目录的bin子目录
export PATH=\$PATH:\$JAVA_HOME/bin:\$TOMCAT_HOME/bin
END
$. /etc/profile #将java.sh 脚本导入到环境变量,使其生效
#4.运行 java -version 或者 javac -version 命令查看java版本
$java -version
java version "1.7.0_65"
Java(TM) SE Runtime Environment (build 1.7.0_65-b17)
Java HotSpot(TM) 64-Bit Server VM (build 24.65-b04, mixed mode)
#5.查看tomcat的安装情况
catalina.sh version
Using CATALINA_BASE: /opt/tomcat//apache-tomcat-8.5.45
Using CATALINA_HOME: /opt/tomcat//apache-tomcat-8.5.45
Using CATALINA_TMPDIR: /opt/tomcat//apache-tomcat-8.5.45/temp
Using JRE_HOME: /opt/tomcat/jdk8/jre
Using CLASSPATH: /opt/tomcat//apache-tomcat-8.5.45/bin/bootstrap.jar:/opt/tomcat//apache-tomcat-8.5.45/bin/tomcat-juli.jar
Server version: Apache Tomcat/8.5.45
Server built: Aug 14 2019 22:21:25 UTC
Server number: 8.5.45.0
OS Name: Linux
OS Version: 3.10.0-957.12.2.el7.x86_64
Architecture: amd64
JVM Version: 1.8.0_211-b12
JVM Vendor: Oracle Corporation
#6.启动Tomcat
$/usr/local/tomcat7/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat7
Using CATALINA_HOME: /usr/local/tomcat7
Using CATALINA_TMPDIR: /usr/local/tomcat7/temp
Using JRE_HOME: /usr/local/java
Using CLASSPATH: /usr/local/tomcat7/bin/bootstrap.jar:/usr/local/tomcat7/bin/tomcat-juli.jar
Tomcat started.
Tomcat 默认运行在8080端口
$netstat -anpt |grep :8080
tcp 0 0 :::8080 :::* LISTEN 3318/java
#7.关闭Tomcat浏览器访问测试 http://IP:端口
/usr/local/tomcat7/bin/shutdown.sh
WeiyiGeek.
Docker 方式安装运行 描述:tomcat映像有多种样式,每一种都是针对特定的用例设计的。
tomcat:<version>
: 基础镜像基于Debiantomcat:<version>-slim
: 此映像不包含默认标记中包含的公共包,只包含运行tomcat所需的最小包。除非您工作的环境中只部署tomcat映像,并且您有空间限制,否则我们强烈建议使用此存储库的默认映像。此处以 tomcat:8.5.57-jdk8-openjdk-slim 为例进行安装使用:
$ docker pull tomcat:8.5.57-jdk8-openjdk-slim
# 在实际有上传或者存储其它文件的应用情况下不建议采用直接挂载单个War包
$ docker run -it -v /apps/webapps/Hello.war:/usr/local/tomcat/webapps/Hello.war --rm -p 8888:8080 tomcat:8.5.57-jdk8-openjdk-slim
# Run the default Tomcat server (CMD ["catalina.sh", "run"]):
Tomcat 8.x 镜像中文与时区支持
# 版本修改情况:
# 1.镜像源以及中文字符集和东八区时区设置
FROM tomcat:8.5.64-jdk8
MAINTAINER weiyigeek - <master@weiyigeek.top> - Tomcat env Support zh_CN UTF-8
RUN curl -s http://192.168.12.107:8080/sources.list -o /etc/apt/sources.list && \
apt-get update && \
apt-get install -y locales && \
localedef -i zh_CN -c -f UTF-8 zh_CN.UTF-8 && \
export LANG=zh_CN.UTF-8 && \
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/shanghai" > /etc/timezone
CMD ["catalina.sh", "run"]
$ tree /opt/tomcat/apache-tomcat-8.5.45/bin
├── bootstrap.jar
├── catalina.bat #windows下的启动停止文件
├── catalina.sh #Linux下启动停止文件
├── catalina-tasks.xml
├── ciphers.bat
├── ciphers.sh
├── commons-daemon.jar
├── commons-daemon-native.tar.gz
├── configtest.bat
├── configtest.sh
├── daemon.sh #守护进程方式
├── digest.bat
├── digest.sh
├── setclasspath.bat
├── setclasspath.sh
├── shutdown.bat #停止tomcat
├── shutdown.sh
├── startup.bat #启动tomcat
├── startup.sh
├── tomcat-juli.jar
├── tomcat-native.tar.gz
├── tool-wrapper.bat
├── tool-wrapper.sh
├── version.bat
└── version.sh #版本信息
描述: 自定义构建Tomcat镜像能更好的适应实际应用环境。
描述: 自定义构建TomEE镜像能更好的适应实际应用环境。
FROM openjdk:8-slim-buster
LABEL MAINTAINER=WeiyiGeek \
EMAIL=master@weiyigeek.top \
DESC=Build Debian+OpenJDK+Tomee container images
ENV CATALINA_HOME=/usr/local/tomee \
PATH=/usr/local/tomee/bin:$PATH \
TOMEE_VER=8.0.6 \
TOMEE_BUILD=webprofile \
TZ=Asia/Shanghai \
LANG=zh_CN.UTF-8
RUN set -ex \
&& mkdir -p "$CATALINA_HOME" \
&& ulimit -HSn 65535 \
&& sed -i "/# End/i * soft nproc 65535" /etc/security/limits.conf \
&& sed -i "/# End/i * hard nproc 65535" /etc/security/limits.conf \
&& sed -i -e 's#http://deb.debian.org#https://mirrors.huaweicloud.com#g' -e 's|deb http:|#deb http:|g' /etc/apt/sources.list \
&& apt-get update \
&& apt-get install -y curl apt-transport-https locales \
&& localedef -i zh_CN -c -f UTF-8 -A /usr/share/locale/locale.alias zh_CN.UTF-8 \
&& cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& apt-get clean && apt-get autoclean && apt-get -y autoremove \
&& rm -rf /var/lib/apt/lists/*
WORKDIR $CATALINA_HOME
# curl -fsSL 'https://www.apache.org/dist/tomee/KEYS' | awk -F ' = ' '$1 ~ /^ +Key fingerprint$/ { gsub(" ", "", $2); print $2 }' | sort -u
RUN set -x \
# for key in \
# 223D3A74B068ECA354DC385CE126833F9CF64915 \
# 7A2744A8A9AAF063C23EB7868EBE7DBE8D050EEF \
# 82D8419BA697F0E7FB85916EE91287822FDB81B1 \
# 9056B710F1E332780DE7AF34CBAEBE39A46C4CA1 \
# A57DAF81C1B69921F4BA8723A8DE0A4DB863A7C1 \
# B7574789F5018690043E6DD9C212662E12F3E1DD \
# B8B301E6105DF628076BD92C5483E55897ABD9B9 \
# DBCCD103B8B24F86FFAAB025C8BB472CD297D428 \
# F067B8140F5DD80E1D3B5D92318242FE9A0B1183 \
# FAA603D58B1BA4EDF65896D0ED340E0E6D545F97 \
# ; do \
# gpg --batch --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys "$key" || \
# gpg --batch --keyserver hkp://ipv4.pool.sks-keyservers.net --recv-keys "$key" || \
# gpg --batch --keyserver hkp://pgp.mit.edu:80 --recv-keys "$key" ; \
# done \
&& curl -fSL https://mirrors.aliyun.com/apache/tomee/tomee-${TOMEE_VER}/apache-tomee-${TOMEE_VER}-${TOMEE_BUILD}.tar.gz -o tomee.tar.gz \
# && curl -fSL https://dist.apache.org/repos/dist/release/tomee/tomee-${TOMEE_VER}/apache-tomee-${TOMEE_VER}-${TOMEE_BUILD}.tar.gz.asc -o tomee.tar.gz.asc \
# && gpg --batch --verify tomee.tar.gz.asc tomee.tar.gz \
&& tar -zxf tomee.tar.gz \
&& mv apache-tomee-${TOMEE_BUILD}-${TOMEE_VER}/* /usr/local/tomee \
&& mv ${CATALINA_HOME}/webapps/ROOT ${CATALINA_HOME}/webapps/Demo \
&& cp ${CATALINA_HOME}/conf/web.xml ${CATALINA_HOME}/conf/web.xml.bak \
&& cp ${CATALINA_HOME}/conf/server.xml ${CATALINA_HOME}/conf/server.xml.bak \
&& curl http://soft.weiyigeek.top:8000/web.xml -o ${CATALINA_HOME}/conf/web.xml \
&& curl http://soft.weiyigeek.top:8000/server.xml -o ${CATALINA_HOME}/conf/server.xml \
&& rm tomee.tar.gz \
&& rm bin/*.bat \
&& rm bin/*.exe \
&& rm -rf apache-tomee-${TOMEE_BUILD}-${TOMEE_VER} \
&& rm -rf ${CATALINA_HOME}/webapps/manager ${CATALINA_HOME}/webapps/docs ${CATALINA_HOME}/webapps/host-manager \
&& rm -rf /var/lib/apt/lists/* /var/cache/apt/archives/* \
&& find /var/log/ -type f -exec truncate -s 0 {} \; \
&& find ${CATALINA_HOME}/ -maxdepth 1 -type f -delete \
&& useradd -g root tomee \
&& chown -R tomee:root /usr/local/tomee \
&& chmod -R g=u /usr/local/tomee
USER tomee
EXPOSE 8080
CMD ["catalina.sh", "run"]
执行docker build构建镜像,然后使用该镜像进行创建容器。
$ docker build -t weiyigeek/tomee-8.0.6:latest -f Dockerfile .
$ docker run -d --name hello-world -p 8080:8080 \
-v /app/hello-world.war:/usr/local/tomee/webapps/ROOT.war \
weiyigeek/tomee-8.0.6:latest
Tips : 自定义的安装软件时,当从远程http服务器中拉取时推荐采用自定义域名的方式。
(1)虚拟目录的映射方式
从Tomcat6开始支持自动映射,即tomcat服务器会自动管理webapps目录下的所有web应用,并把它映射成虚拟目录,换句话说只需把web应用放在webapps目录下,不需要配置Context,外界可以直接访问
。
#如果是放入非webapps目录下是放在其他地方,还是需要配置Context
#比如我的tomcat在C盘,我的项目在D盘,则需要在Host下增加如下虚拟目录映射语句。
<Context path="/myapp" docBase="D:/work/myapp"></Context>
(2)Context元素配置
tomcat在加载一个web应用时,会一次按照以下五种方式查找web应用中的元素,优先级异常降低直到找到为止
1.到Tomcat安装目录/conf/Context.xml文件中查找元素。
到Tomcat安装录/conf/[enginename]/[hostname]/context.xml.default文件中查找元素。
[enginename]:表示的name属性
[hostname]:表示d的那么属性
3.到Tomcat安装目录/conf/[enginename]/[hostname]/[contextpath].xml文件中查找元素
[contextpath]:表示单个Web应用的URL入口
4.到Web应用的META-INF/context.xml文件中查找元素
5.到Tomcat安装目录/conf/server.xml文件中查找元素。只适用于单个Web应用
(3)web.xml文件 该文件必须放在/WEB-INF目录下,但是从7.0版本开始Tomcat可以不使用web.xml文件,而是使用注解方式。
(4)将项目部署为Tomcat默认应用 即访问 http://localhost:8080 时出来的是tomcat自带的欢迎页面,改为登录到自己的项目主页。
方法一: 在Tomcat默认安装后,tomcat的主目录是webapps/root目录,所以如果想改变tomcat的主目录的话可以如下所做:
在/conf/server.xml文件的之间加入代码
<Context path="" docBase="C:\tomcat7\webapps\myapp" reloadable="true" debug="0"></Context>
<!--
docBase改为自己需要的项目路径
如果建立了Apache和tomcat集群,Apache server 的默认端口是80 ,IE访问的方法只需输入:http://localhost,就可以自动定位到xx工程下面去
-->
方法二: 将tomcat安装目录下的ROOT下的所有文件删除,换成自己项目的文件,此法有点暴力。
方法三:
Tomcat5.0以下版本在C:/Tomcat/conf/Catalina/localhost
目录下会自动生成了一个ROOT.Xml,但是5.0以上版本不再生成此文件。
所以可以新建个ROOT.xml,在里面加入如下代码:
<!--但是我自己在7.0版本上测试好像未成功,推荐方式1-->
<?Xml version='1.0' encoding='utf-8'?>
<Context crossContext="true" docBase="C:\tomcat7\webapps\myapp" path="" reloadable="true">
</Context>
Context元素的属性解释
描述:开启 JMX 远程连接以后,就可以通过 jconsole 和 jvisualvm 两个 JDK 内置工具连接 JMX 从而查看当前主机的 JVM 相关信息。
JMX(Java Management Extensions,即Java管理扩展)
是一个为应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。
$ cd /usr/local/tomcat/bin/
#默认情况下,$CATALINA_HOME/bin 目录下是没有 setenv.sh,可以自己新建此文件
$ vim setenv.sh
CATALINA_OPTS="-Djava.rmi.server.hostname=10.100.4.169
-Dcom.sun.management.jmxremote.port=8686
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false"
:wq
#重新设置setenv.sh进行认证
CATALINA_OPTS="-Djava.rmi.server.hostname=10.10.107.222 -Dcom.sun.management.jmxremote.port=8686 -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.access='admin' -Dcom.sun.management.jmxremote.password='weiyigeek' -Dcom.sun.management.jmxremote.ssl=false"
JMX 配置说明:
-Dcom.sun.management.jmxremote
# 通过哪个 IP 访问本机的 JMX
-Djava.rmi.server.hostname=10.100.4.169
# JMX 监听的端口,默认 8686
-Dcom.sun.management.jmxremote.port=8686
# 是否需要用户名密码认证,默认 false这里进行认证
-Dcom.sun.management.jmxremote.authenticate=true
#密码
-Dcom.sun.management.jmxremote.password.file=/opt/…/jmxremote.password
#登录用户
-Dcom.sun.management.jmxremote.access.file=/opt/…/jmxremote.access
# 是否启用 SSL
-Dcom.sun.management.jmxremote.ssl=false
#jmxremote.password模板:
[用户名] [密码]
mtct ct.meituan
test test
#jmxremote.access模板:
[用户名] [权限]
mtct readwrite
test readonly
注意事项:
chmod 600 jmxremote.password & jmxremote.access
使用 jconsole 工具连接 JMX 配置 JMX 的时候没有启用 SSL 所以会提示不安全,点击『不安全的连接』
$jconsole
WeiyiGeek.
展现效果:
WeiyiGeek.
使用 jvisualvm 工具连接 JMX 描述:远程 –> 添加主机 –> 添加 JMX 连接
WeiyiGeek.
展示效果:
WeiyiGeek.
描述:jmap 可以输出 Java 进程 内存中对象的工具。 jmap 一般和 jhat 或者 MAT 配合使用,以图像的形式直观的展示当前内存是否有问题。
参数说明:
-dump:[live,]format=b,file=<filename>
以hprof二进制格式转储Java堆到指定filename的文件中。
live子选项是可选的,如果指定了live子选项,堆中只有活动的对象会被转储。
想要浏览heap dump,你可以使用 jhat(Java堆分析工具) 或者 MAT 读取生成的文件。
-finalizerinfo 打印等待终结的对象信息。
-heap 打印一个堆的摘要信息,包括使用的GC算法、堆配置信息和generation wise heap usage。
-histo[:live] 打印每个Java类、对象数量、内存大小(单位:字节)、完全限定的类名。
打印的虚拟机内部的类名称将会带有一个'*'前缀。
如果指定了live子选项,则只计算活动的对象。
-permstat 打印Java堆内存的永久保存区域的类加载器的智能统计信息。
对于每个类加载器而言,它的名称、活跃度、地址、父类加载器、它所加载的类的数量和大小都会被打印。
此外,包含的字符串数量和大小也会被打印。
-F 强制模式。如果指定的pid没有响应,请使用jmap -dump或jmap -histo选项。此模式下,不支持live子选项。
-h | -help 打印帮助信息。
-J<flag> 指定传递给运行jmap的JVM的参数。
示例1.jmap-histo 打印每个Java类、对象数量、内存大小(单位:字节)、完全限定的类名。
$jmap -histo 14110
num #instances #bytes class name
----------------------------------------------
1: 50994 7789848 [C
2: 22160 6263680 [B
3: 8527 1437176 [I
4: 49099 1178376 java.lang.String
5: 63 936248 [J
6: 19118 611776 java.util.HashMap$Node
7: 6243 549384 java.lang.reflect.Method
8: 8948 509464 [Ljava.lang.Object;
9: 10588 423520 java.util.TreeMap$Entry
10: 3696 417952 java.lang.Class
11: 1372 230544 [Ljava.util.HashMap$Node;
12: 4760 228480 java.util.HashMap
13: 4789 191560 java.util.HashMap$ValueIterator
14: 5851 187232 java.io.File
#表示含义
B byte
C char
D double
F float
I int
J long
Z boolean
[ 数组,如[I表示int[]
[L+类名 其他对象
示例2.jmap-heap 查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况
$jmap -heap 14110
Attaching to process ID 14110, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.121-b13
示例 3.jmap-dump:format=b,file= 用jmap把进程内存使用情况dump到文件中
$ jmap -dump:format=b,file=/tmp/123.hprof 14110
Dumping heap to /tmp/123.hprof ...
Heap dump file created
描述:jhat 可以对 dump 出来的堆信息进行处理,以 html 页面的形式展示出来。 执行 jhat/tmp/123.hprof即可,默认端口是 7000,访问 http://localhost:7000 即可查看结果,通过 -port 指定端口。
WeiyiGeek.
Tomcat的3种运行状态:
(1)安装 apr 和 apr-util Apache Portable Runtime 是一个高度可移植的库,是 Apache HTTP Server 2.x 的核心。APR 有许多用途,包括访问高级 IO 功能(如sendfile,epoll 和 OpenSSL),操作系统级功能(随机数生成,系统状态等)和本机进程处理(共享内存,NT 管道和 Unix 套接字)。
$ cd /usr/local/src/
$ wget http://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-1.6.5.tar.gz
$ wget http://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-util-1.6.1.tar.gz
$ tar xf apr-1.6.5.tar.gz
$ cd apr-1.6.5
$ /configure --prefix=/usr/local/apr
$ make -j 2 && make install
$ cd ../
$ tar xf apr-util-1.6.1.tar.gz
$ cd apr-util-1.6.1
$ ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/
(2)安装 tomcat-native 描述:tomcat-native 不用单独下载,解压缩 tomcat 程序包后再 bin/ 目录下存在该程序的源码包。
$ tar xf apache-tomcat-8.5.38.tar.gz -C /usr/local/
$ ln -sv /usr/local/apache-tomcat-8.5.38/ /usr/local/tomcat
$ cp /usr/local/tomcat/bin/tomcat-native.tar.gz /usr/local/src/
$ tar xf tomcat-native.tar.gz
$ cd tomcat-native-1.2.21-src/
$ cd native/
$ ./configure --prefix=/usr/local/apr --with-java-home=/usr/local/jdk1.8.0_121/
$ make -j 2 && make install
$ vim /etc/profile
export LD_LIBRARY_PATH=/usr/local/apr/lib ##添加apr path
$ source /etc/profile
(3) 修改 Tomcat 配置文件 修改 protocol 值 Tomcat 默认是 “HTTP/1.1” ,如果运行 apr 模式需要把 protocol 值修改成 apr 模式: org.apache.coyote.http11.Http11AprProtocol
#1.修改为apr模式
$ cd /usr/local/tomcat/conf/
$ vim server.xml
<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
connectionTimeout="20000"
redirectPort="8443" />
#2.修改 SSLEngine
启动 Tomcat 验证查看 catalina.out 日志中最下面三行
补充说明:
描述:LVS负载均衡是提高应用负载量和容错的有效手段,可以结合Nginx与Tomcat实现Nginx是一款性能优异的反向代理服务器。
(1)负载均衡配置实现 反向代理原理示意图
WeiyiGeek.反向代理原理示意图
负载均衡示意图:
WeiyiGeek.
负载均衡策略:
(2)负载均衡时Session的处理策略 描述:Session是Tomcat服务器上的内存空间,如果一个用户发出多个请求,却发到了多个tomcat服务器中,那么就会出现Session不同步的问题;
解决方案1
解决方案2
解决方案3
(3)memcached缓存共享方案基本原理 粘性Session与非粘性Session方式:需要一些工具jar包,官网有目录和下载连接在/conf/context.xml中进行配置,全局有效。
WeiyiGeek.
注意事项:
答:需要首先查看Tomcat日志和/var/log/message
日志,需要注意交换分区空间是否分配以及分配大小;
解决办法: 给TOMCAT服务器启用虚拟空间,还可以降低 Apache 的最大连接数 MaxClients、最大内存 ServerLimit
问题描述:INFO: Maximum number of threads (200) created for connector with address null and port 8080 问题说明:最大线程数设置错误,超出配置文件中MaxThreads访问请求; 解决方案:使用线程池用较少的线程处理较多的访问,可以提高tomcat处理请求的能力。
使用方法:
#(1) 打开/conf/server.xml增加
#最大线程500(一般服务器足够),最小空闲线程数20,线程最大空闲时间60秒(这里根据需求更改)。接着修改<Connector>节点,增加executor属性。
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="500" minSpareThreads="20" maxIdleTime="60000" />
<Connector executor="tomcatThreadPool"
port="80" protocol="HTTP/1.1"
connectionTimeout="60000"
keepAliveTimeout="15000"
maxKeepAliveRequests="1"
redirectPort="443" />
#(2) 当tomcat并发用户量大的时候,单个jvm进程确实可能打开过多的文件句柄(java.net.SocketException: Too many open files)。
ps -ef |grep tomcat #查看tomcat的进程ID,记录ID号,假设进程ID为10001
lsof -p 10001 | wc -l #查看文件操作数
ulimit -a #查看每个用户允许打开的最大文件数默认是1024
ulimit -n 65536 #将允许的最大文件数调整为65536 (重启后失效)
WeiyiGeek.
问题描述: 设置Context的Path路径以及docBase目录设置。
<Service name="passport">
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Engine name="passport" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<!-- This Realm uses the UserDatabase configured in the global JNDI
resources under the key "UserDatabase". Any edits
that are performed against this UserDatabase are immediately
available for use by the Realm. -->
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="passport" unpackWARs="true" autoDeploy="true">
<Context path="" docBase="E:/Development/APP/"> </Context>
<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>