目前来说IBM的WebSphere. Oracle的Weblogic占据了市场上Java语言Web站点的部分份额。该两种软件由于无与伦比的性能及可靠性等优势被广泛应用于大型互联网公哥的Web场景中。但是其高昂的价格也使得中小型互联网公司对此望而却步。。
Tomcat自S.x版本以来,其性能上已经得到視大幅度的提升。加上其开放性的框架和二次开发等特性,已经完全可以用在访问量不是很大的生产环境下,目前大多数用于JSP技术开发的电子商务网站基本上都应用了Tomcat.。
中间件产品RedHat JBom,Qracle Tuxed, cauthe Resin.。
Tomcat是Apache软件基金会(Apache Software Foundation) 的Jakarta项目中的一一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。Tomcat 最初是由Sun的软件构架师詹姆斯.邓肯戴维森开发的。后来他将其变为开源项目,并由Sun贡献给Apache软件基金会。由于大部分开源项目O’Reilly 都会出一本相关的书,并且将其封面设计成某个动物的素描,因此他希望将此项目以一个动物的名字命名。因为他希望这种动物能够自己照顾自己,最终,他将其命名为Tomcat (公猫)。而O’Reilly出版的介绍Tomcat的书籍的封面也被设计成了一个公猫的形象。而Tomcat的Logo兼吉祥物也被设计成了一只公猫。。
其实Tomcat最早在开始研发的时候并不叫这个名字,早期的Tomcat的Logo项目的名字叫Catalina,所以当我们安装完Tomcat后会发现安装路径下有很多Catalina 有关的目录和文件。这些文件是我们配置或使用Tomcat的重要文件所在。
tomcat服务器是一个免费的开放源代码的web应用服务器,属于轻量级应用服务器,应用在中小系统和并发访问用户不是很多的场合,是开发和调试JSP页面的首选,tomcat也可以处理静态的HTML页面但是能力不及Apache或nginx,所以tomcat通常作为一个servlet和JSP容器,单独运行在后端
tomcat官网: http://tomcat.apache.org
在安装tomcat之前必须安装JDK,JDK全称是 java Development Kit, 是SUN公司免费提供的Java语言软件开发工具包,其中包含java虚拟机(JVM),编写好的java源程序经过编译可产生java字节码,只要安装了JDK,就可以利用JVM解释这些字节码文件,从而保证了java的跨平台性。
在平台兼容性方面,JDK作为解释字节码文件并根据此调用操作系统的API实现对应功能的java虚拟机,与操作系统位数密切相关,因此存在不同类型的版本,tomcat也具有上述特征,centos7系统中默认已经安装了jdk
jar 打包工具,将先关的类文件打包成一个文件
jps 显示当前java程序运行的进程状态
jhat java堆分析工具
jstack 栈跟踪程序
jstat JVM检测统计工具
jstatd jstat守护进程
JDK中还包括完整的JRE(java Runtime Environment),java运行环境,也被称为private runtime.包括了用于产品环境的各种库类,如基础类库rt.jar 以及给开发人员使用的补充库,如果国际化与本地化的类库,IDL库等等,JDK中还包括各种样例程序,用以展示java API中的个部分。
所需要软件包
apache-tomcat-8.5.16.tar.gzf
jdk-8u91-linux-x64.tar.gz
安装时悬着tomcat软件版本要与程序开发使用的版本一致。jdk版本要与tomcat保持一致
1,所有主机关闭防火墙和selinux:
[root@localhost ~]# iptables -F
[root@localhost ~]# setenforce 0
setenforce: SELinux is disabled
[root@localhost ~]# systemctl stop firewalld
2,查看JDK是否安装
[root@localhost ~]# java -version
openjdk version "1.8.0_181" //这是系统带rpm方式安装
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
3,卸载rpm方式安装jdk
方法一
[root@localhost ~]#which java
/usr/bin/java
[root@localhost ~]#rm -rf /usr/bin/java
方法二
[root@localhost ~]# rpm -qa | grep -i openjdk
java-1.8.0-openjdk-1.8.0.181-7.b13.el7.x86_64
java-1.8.0-openjdk-headless-1.8.0.181-7.b13.el7.x86_64
[root@localhost ~]# rpm -e java-1.8.0-openjdk --nodeps
[root@localhost ~]# rpm -e java-1.8.0-openjdk-headless
4,JDK安装
[root@localhost ~]# tar xf jdk-8u91-linux-x64.tar.gz
[root@localhost ~]# mv jdk1.8.0_91/ /usr/local/java
[root@localhost ~]# vim /etc/profile //最后一行添加
export JAVA_HOME=/usr/local/java #设置java根目录
export PATH=$PATH:$JAVA_HOME/bin #在path环境变量中添加java根目录的bin子目录
[root@localhost ~]# source /etc/profile
[root@localhost ~]# java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
5,解压apache-tomcat-8.5.16.tar.gz包
[root@localhost ~]# tar xf apache-tomcat-8.5.16.tar.gz
[root@localhost ~]# mv apache-tomcat-8.5.16 /usr/local/tomcat8
6,启动tomcat
[root@localhost ~]# /usr/local/tomcat8/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat8
Using CATALINA_HOME: /usr/local/tomcat8
Using CATALINA_TMPDIR: /usr/local/tomcat8/temp
Using JRE_HOME: /usr/local/java
Using CLASSPATH: /usr/local/tomcat8/bin/bootstrap.jar:/usr/local/tomcat8/bin/tomcat-juli.jar
Tomcat started.
bin //存放windows或Linux平台上启动或关闭tomcat的脚本文件
conf //存放tomcat的各种全局配置文件,其中最主要的是server.xml和web.xml
lib //存房tomcat需要的库文件(JARS)
logs //存放tomcat执行时的LOG文件
webapps //tomcat的主要web发布目录,类似于nginx的html
work //存放jsp编译后产生的.class文件
temp //存放临时文件
windows .ddl
linux .so
java .jar
ldd 查看命令所需要的库文件
[root@localhost ~]# which ifconfig
/usr/sbin/ifconfig
[root@localhost ~]# ldd /usr/sbin/ifconfig
linux-vdso.so.1 => (0x00007ffd5cdb3000)
libc.so.6 => /lib64/libc.so.6 (0x00007fcbb5b19000)
/lib64/ld-linux-x86-64.so.2 (0x00007fcbb60fa000)
docs //tomcat帮助文档
emamples //web应用实例
host-manager //主机管理
manager //管理
ROOT //默认站点根目录
catalina.policy
//权限控制配置文件
catalina.properties //tomcat属性配置文件
context.xml //context用于指定额外的web目录
logging.properties //日志log相关配置文件
server.xml //主配置文件
tomcat-users.xml //manager-gui管理用户配置文件
web.xml //tomcat的servlet,servlet-mapping,filter,MIME等相关配置文件
server.xml主要配置文件,可修改启动端口,设置网站根目录,虚拟主机,开启https等功能
sercer.xml的结构构成
内的内容是注视信息
//tomcat关闭端口,默认只对本机地址开放,可以在本机通过 telnet 127.0.01 8005 访问,对tomcat进行操作
//tomcat启动默认端口是8080,可以根据需要进行修改
//tomcat启动AJP1.3连接器时默认的端口号,可以根据需要进行修改
//一下是tomcat定义虚拟主机是的配置及日志配置
首先在根目录下创建一个web目录,并且在里面建立一个webapp目录,用于存放网站文件
[root@localhost ~]# mkdir -pv /web/webapp
mkdir: 已创建目录 "/web"
mkdir: 已创建目录 "/web/webapp"shell
在webapp下面建立一个index.jsp测试页面
[root@localhost ~]#vim /web/webapp/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP A page</title>
</head>
<body>
<% out.println("welcome to test sizi,http://www.a.com");%>
</body>
</html>
修改tomcat的server.xml文件
定义一个虚拟主机,并将网站文件路径指向已经站立的/web/webapp.在host端增减context段
[root@localhost ~]#cp /usr/local/tomcat8/conf/server.xml{,.date+%F}
[root@localhost ~]#vim /usr/local/tomcat8/conf/server.xml
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context docBase="/web/webapp" path="" reloadable="flase" />
验证
192.168.6.13:8080
一台tomcat站点由于可能出现点单故障及无法应付过多客户复杂多样的请求等问题,不等单独应用于生产环境下,所以需要一套可靠的解决方案来完善web站点架构。
nginx是一款非常优秀的http服务器软件,他能够支持高达50000个并发连接数的响应,拥有强大的静态资源处理能力,运行稳定,并且内存,cpu等系统资源消耗非常低,目前很多大型网站都用nginx服务器做后端网站程勋的反向代理及负载均衡及负载均衡器,来提升整个站点的负载并发能力
nginx服务器 192.168.6.10 nginx
tomcat服务器2 192.168.6.11 jdk tomcat
tomcat服务器2 192.168.6.12 jdk tomcat
两台tomcat服务器见上文 注意测试页面不同
nginx服务器配置
[root@localhost ~]#yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
[root@localhost ~]# useradd -M -s /sbin/nologin nginx
[root@localhost ~]# tar xf nginx-1.6.0.tar.gz
[root@localhost ~]# cd nginx-1.6.0/
[root@localhost nginx-1.6.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_ssl_module --with-pcre && make && make install
[root@localhost nginx-1.6.0]#ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/
[root@localhost ~]# nginx
配置nginx.conf
[root@localhost ~]#vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name localhost;
charset utf-8;
location / {
root html;
index index.html index.htm;
}
location ~* \.jsp$ {
proxy_pass http://tomcat_server;
}
}
upstream tomcat_server {
server 192.168.6.11:8080 weight=1;
server 192.168.6.12:8080 weight=1;
}
lvs: 4层 10种算法
haproxy: 4 7层 8种算法
nginx:4 7层 5种算法
1,轮询(默认)
每个请求按时间顺序逐一匹配到不同的后端服务,如果后端某台服务武器司机,自动剔除故障系统
upstream tomcat_server {
server 192.168.6.11:8080 weight=1;
server 192.168.6.12:8080 weight=1;
}
weight(轮询权值)
weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或者仅仅为在主从的情况下设置不同的权值,达到合理有效的利用主机资源。
upstream tomcat_server {
server 192.168.6.11:8080 weight=1;
server 192.168.6.12:8080 weight=2;
}
2,lesat_conn(最小连接数)
least_connected方式可以更公平的将负载分配到多个机器上面。使用least_connected,nginx不会将请求发到频繁的机器上面。并且将新的请求分到较清闲的机器上面。
upstream tomcat_server {
least_conn;
server 192.168.6.11:8080 weight=1;
server 192.168.6.12:8080 weight=1;
}
3,ip_hash
每个请求按访问ip的哈希结果分配,使来自同一个ip的访客固定访问一台后端服务器 并且可以有效的解决动态网页存在的session共享问题
upstream tomcat_server {
ip_hash;
server 192.168.6.11:8080 weight=1;
server 192.168.6.12:8080 weight=1;
}
4,fair
比weight,ip_hash更加智能的负载均衡算法,fair算法可以根须页面大小和加载时间长短智能的进行负载均衡,也就是根据后端服务器的相应来分配请求,响应时间短的优先分配,nginx本身不支持fair,如果需要这种调度算法,则必须安装upstream_fair
模块。
upstream tomcat_server {
fair;
server 192.168.6.11:8080 weight=1;
server 192.168.6.12:8080 weight=1;
}
5,url_hash
按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可以进一步提高后端缓存服务器的效率,nginx本身不支持url_hash,如果需要这种调度算法,则必须安装nginx的hash软件包。
upstream tomcat_server {
hash $request_uri;
hash_method crc32;
server 192.168.6.11:8080 weight=1;
server 192.168.6.12:8080 weight=1;
}
在Nginx upstream模块中,可以设定每台后端服务器在负载均衡调度中的状态,常用的状态有:
down: 表示当前的 server 暂时不参与负载均衡。
**backup:**预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的访问压力最低。。
max_fails: 允许请求失败的次数,默认为1,当超过最大次数时,返回proxy_next_upstream模块定义的错误。。
fail_timeout: 请求失败超时时间,在经历了max_fails 次失败后,暂停服务的时间。max _fails和fail_timeout可以一起使用。
down(用于网站维护)
upstream tomcat_server {
server 192.168.6.11:8080 weight=1 down;
server 192.168.6.12:8080 weight=1;
}
backup(13是备用的 只有11和12荡机13才启动)
upstream tomcat_server {
server 192.168.6.11:8080 weight=1;
server 192.168.6.12:8080 weight=1;
server 192.168.6.13:8080 weight=1 backup;
}
max_fails和fail_timeout(节点的检查 3秒超时 2次断开)
upstream tomcat_server {
server 192.168.6.11:8080 weight=1 max_fails=2 fail_timeout=3;
server 192.168.6.12:8080 weight=1 max_fails=2 fail_timeout=3;
}
环境:
一台tomcat+mysql服务器
所需要软件包:
slsaledb-2014-4-10.sql
SLSaleSystem.tar.gz
1,部署sls压缩包
[root@localhost ~]# tar xf SLSaleSystem.tar.gz
[root@localhost ~]# mv SLSaleSystem /web/webapp/
[root@localhost ~]# cd /web/webapp/SLSaleSystem/
[root@localhost SLSaleSystem]# vim /usr/local/tomcat/conf/server.xml
150 <Context docBase="/web/webapp/SLSaleSystem" path="" reloadable="false" >
</Context>
[root@localhost SLSaleSystem]# /usr/local/tomcat/bin/shutdown.sh
[root@localhost SLSaleSystem]# /usr/local/tomcat/bin/startup.sh
浏览器访问 http://192.168.6.13:8080
2,结合数据库
[root@localhost ~]#yum -y install mariadb mariadb-server
[root@localhost ~]#systemctkl start mariadb
MariaDB [(none)]> create database slsaledb;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> grant all on slsaledb.* to admin@'%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
[root@localhost ~]# vim /web/webapp/SLSaleSystem/WEB-INF/classes/jdbc.properties
driverClassName=com.mysql.jdbc.Driverurl=jdbc\:mysql\://192.168.6.13\:3306/slsaledb?useUnicode\=true&characterEncoding\=UTF-8
uname=admin
password=123456
minIdle=10
maxIdle=50
initialSize=5
maxActive=100
maxWait=100
removeAbandonedTimeout=180
removeAbandoned=true
[root@localhost ~]# mysql -uroot < slsaledb-2014-4-10.sql
[root@localhost ~]# /usr/local/tomcat/bin/shut down.sh
[root@localhost ~]# /usr/local/tomcat/bin/startup.sh
3,验证:
http://192.168.6.13:8080 并且输入admin 123456
虚拟主机用于在一台物理机上搭建多个web站点,每个web站点独立运行,互不干扰,这些站点就是“虚拟主机”。
多个域名解析到同一个ip地址,在WEB服务器里添加多个站点,每个站点设定一个主机名。HTTP协议请求里包含了主机名信息,当WEB服务器收到访问请求时,就可以根据不同的主机名来访问不同的网站。
[root@localhost ~]# tar xf apache-tomcat-8.5.16.tar.gz
[root@localhost ~]# mv apache-tomcat-8.5.16 /usr/local/tomcat8
配置域名与ip的映射管理
对于本地局域网我们使用在host文件中添加。对于大型网络或者外网网络则需要配置DNS服务器中ip地址与域名的映射关系。
[root@localhost ~]# tail -2 /etc/hosts
192.168.6.12 www.a.com
192.168.6.12 www.b.com
修改server.xml
[root@localhost conf]# cp server.xml server.xml_$(date +%F)
[root@localhost conf]# vim server.xml
<Host name="www.a.com" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context docBase="/web/a" path="" reloadable="flase" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
<Host name="www.b.com" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context docBase="/web/b" path="" reloadable="flase" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
创建网页根目录
[root@localhost conf]# mkdir -pv /web/{a,b}
mkdir: 已创建目录 "/web/a"
mkdir: 已创建目录 "/web/b"
[root@localhost conf]# vim /web/a/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP A page</title>
</head>
<body>
<% out.println("welcome to test sizi,http://www.a.com");%>
</body>
</html>
[root@localhost conf]# vim /web/b/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP B page</title>
</head>
<body>
<% out.println("welcome to test sizi,http://www.b.com");%>
</body>
</html>
重启
[root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh
[root@localhost ~]# /usr/local/tomcat/bin/startup.sh
验证:
www.a.com:8080
www.b.com:8080
主机只拥有一个ip地址,通过不同的端口实现不同的WEB站点的访问。在server.xml中设置两个service组件
注意配置hosts文件
[root@localhost ~]# tail -1 /etc/hosts
192.168.6.12 www.a.com
server.xml配置文件
[root@localhost ~]# vim /usr/local/tomcat8/conf/server.xml
<Service name="Catalina1">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="www.a.com" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context docBase="/web/a" path="" reloadable="flase" />
<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>
<Service name="Catalina2">
<Connector port="8090" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="www.a.com" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context docBase="/web/b" path="" reloadable="flase" />
<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>
网页根目录
[root@localhost conf]# mkdir -pv /web/{a,b}
mkdir: 已创建目录 "/web/a"
mkdir: 已创建目录 "/web/b"
[root@localhost conf]# vim /web/a/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP A page</title>
</head>
<body>
<% out.println("welcome to test sizi,http://www.a.com");%>
</body>
</html>
[root@localhost conf]# vim /web/b/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP B page</title>
</head>
<body>
<% out.println("welcome to test sizi,http://www.b.com");%>
</body>
</html>
重启
[root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh
[root@localhost ~]# /usr/local/tomcat/bin/startup.sh
验证
www.a.com:8080
www.b.com:8090
应用程序需要部署在服务器上时tomcat软件的部署方式可以分为以下几种:
单实例单应用 (webapps/a)
单实例多应用(webapps/{a,b})
多实例多应用
多实例多应用
实例的概念可以先理解为一个tomcat目录中的一个工作子目录
单实例单应用:比较常用的一种方式,只需要把做好的war包丢在webapps目录下,执行启动tomcat脚本就行了。
单实例多应用:有两个不同的web项目的war包,还是只需要丢在webapps目录下,执行气筒tomcat脚本,访问不同的项目会加载不同的WEB虚拟目录,这种方式在生产环境中要慎用,因为重启或挂掉tomcat程序后会影响另外一个应用的访问。
多实例单应用:多个tomcat实例部署同一个项目,端口号不同,可以利用nginx做负载均衡。
多实例多应用:多个tomcat实例部署多个不同的项目,这种模式在服务器资源有限,或者对服务器资源要求并不是很高的情况下,可以实现多个不同项目部署在同一个服务器上要求,来实现资源使用的最大化。
1,解压并部署tomcat程序
[root@localhost ~]# tar xf apache-tomcat-8.5.16.tar.gz
[root@localhost ~]# mv apache-tomcat-8.5.16 /usr/local/
2,创建2个实例的工作目录
[root@localhost ~]# mkdir -p /usr/local/tomcat_instance/tomcat1
[root@localhost ~]# mkdir -p /usr/local/tomcat_instance/tomcat2
3,拷贝tomcat程序目录下的conf目录分别放入2个实例目录中
[root@localhost ~]# cp -R /usr/local/apache-tomcat-8.5.16/conf/ /usr/local/tomcat_instance/tomcat1
[root@localhost ~]# cp -R /usr/local/apache-tomcat-8.5.16/conf/ /usr/local/tomcat_instance/tomcat2
4,在tomcat实例目录下的bin目录中创建实例启动和停止脚本
启动脚本
[root@localhost ~]# mkdir /usr/local/tomcat_instance/{tomcat1,tomcat2}/bin
[root@localhost ~]# touch /usr/local/tomcat_instance/{tomcat1,tomcat2}/bin/startup.sh
[root@localhost ~]# chmod +x /usr/local/tomcat_instance/{tomcat1,tomcat2}/bin/startup.sh
注意CATALINA_BASE
所指向的tomcat实例目录路径:
[root@localhost ~]# vim /usr/local/tomcat_instance/tomcat1/bin/startup.s
#!/bin/bash
export CATALINA_HOME="/usr/local/apache-tomcat-8.5.16"
export CATALINA_BASE="/usr/local/tomcat_instance/tomcat1"
export CATALINA_TMPDIR="$CATALINA_BASE/temp"
export CATALINA_PID="$CATALINA_BASE/bin/tomcat.pid"
export JAVA_OPTS="-server -Xms1024m -Xmx1024m -Djava.awt.headless=true -Dtomcat.name=tomcat1"
#创建logs目录
if [ ! -d "$CATALINA_BASE/logs" ];then
mkdir $CATALINA_BASE/logs
fi
#创建temp目录
if [ ! -d "$CATALINA_BASE/temp" ];then
mkdir $CATALINA_BASE/temp
fi
#调用tomcat启动脚本
bash $CATALINA_HOME/bin/startup.sh "$@"
[root@localhost ~]# vim /usr/local/tomcat_instance/tomcat2/bin/startup.sh
#!/bin/bash
export CATALINA_HOME="/usr/local/apache-tomcat-8.5.16"
export CATALINA_BASE="/usr/local/tomcat_instance/tomcat2"
export CATALINA_TMPDIR="$CATALINA_BASE/temp"
export CATALINA_PID="$CATALINA_BASE/bin/tomcat.pid"
export JAVA_OPTS="-server -Xms1024m -Xmx1024m -Djava.awt.headless=true -Dtomcat.name=tomcat2"
#创建logs目录
if [ ! -d "$CATALINA_BASE/logs" ];then
mkdir $CATALINA_BASE/logs
fi
#创建temp目录
if [ ! -d "$CATALINA_BASE/temp" ];then
mkdir $CATALINA_BASE/temp
fi
#调用tomcat启动脚本
bash $CATALINA_HOME/bin/startup.sh "$@"
停止脚本
[root@localhost ~]# touch /usr/local/tomcat_instance/{tomcat1,tomcat2}/bin/shutdown.sh
[root@localhost ~]# chmod +x /usr/local/tomcat_instance/{tomcat1,tomcat2}/bin/shutdown.sh
[root@localhost ~]# vim /usr/local/tomcat_instance/tomcat1/bin/shutdown.sh
#!/bin/bash
export CATALINA_HOME="/usr/local/apache-tomcat-8.5.16"
export CATALINA_BASE="/usr/local/tomcat_instance/tomcat1"
export CATALINA_TMPDIR="$CATALINA_BASE/temp"
export CATALINA_PID="$CATALINA_BASE/bin/tomcat.pid"
bash $CATALINA_HOME/bin/shutdown.sh "$@"
[root@localhost ~]# vim /usr/local/tomcat_instance/tomcat2/bin/shutdown.sh
#!/bin/bash
export CATALINA_HOME="/usr/local/apache-tomcat-8.5.16"
export CATALINA_BASE="/usr/local/tomcat_instance/tomcat2"
export CATALINA_TMPDIR="$CATALINA_BASE/temp"
export CATALINA_PID="$CATALINA_BASE/bin/tomcat.pid"
bash $CATALINA_HOME/bin/shutdown.sh "$@"
5,修改每个tomcat实例中server.xml中的端口(分别修改以上三个端口(server port .connector port .JAP)不要和其他实例的端口或系统以及系统已经占用的端口发生冲突)。
修改tomcat2.的这几个端口
[root@localhost ~]# vim /usr/local/tomcat_instance/tomcat2/conf/server.xml
<Server port="8006" shutdown="SHUTDOWN">
<Connector port="8090" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
:q
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
6,创建测试页面
[root@localhost ~]# mkdir -p /usr/local/tomcat_instance/{tomcat1,tomcat2}/webapps/ROOT/
[root@localhost ~]# vim /usr/local/tomcat_instance/tomcat1/webapps/ROOT/index.jsp
<html>
<title>Tomcat-1</title>
<body>
Hellp This is Tomcat-1
</body>
</html>
[root@localhost ~]# vim /usr/local/tomcat_instance/tomcat2/webapps/ROOT/index.jsp
<html>
<title>Tomcat-2</title>
<body>
Hellp This is Tomcat-2
</body>
</html>
启动服务 查看端口
[root@localhost ~]#/usr/local/tomcat_instance/tomcat1/bin/startup.sh
[root@localhost ~]#/usr/local/tomcat_instance/tomcat2/bin/startup.sh
tcp6 0 0 :::8009 :::* LISTEN 17855/java
tcp6 0 0 :::8010 :::* LISTEN 18156/java
tcp6 0 0 :::8080 :::* LISTEN 17855/java
tcp6 0 0 :::8090 :::* LISTEN 18156/java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 17855/java
tcp6 0 0 127.0.0.1:8006 :::* LISTEN 18156/java
验证
192.168.6.12:8080
192.168.6.12:8090
tomcat服务器 :192.168.6.11
nginx服务器:192.168.6.10
再添加一个实例一个应用
[root@localhost ~]# cp -r /usr/local/tomcat_instance/tomcat1 /usr/local/tomcat_instance/tomcat3
更改startup.sh,shutdown.sh脚本 删除tomcat.pid文件 更改server.xml主配置文件三个端口 修改webapps/ROOT/index.jsp网页根目录 并启动
nginx安装
[root@localhost ~]#yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
[root@localhost ~]# useradd -M -s /sbin/nologin nginx
[root@localhost ~]# tar xf nginx-1.6.0.tar.gz
[root@localhost ~]# cd nginx-1.6.0/
[root@localhost nginx-1.6.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_ssl_module --with-pcre && make && make install
[root@localhost nginx-1.6.0]#ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/
nginx配置负载均衡
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
upstream tomcat-server {
server 192.168.6.11:8070;
server 192.168.6.11:8080;
server 192.168.6.11:8090;
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
proxy_pass http://tomcat-server;
}
[root@localhost ~]#nginx -t
[root@localhost ~]# killall -HUP nginx
验证
192.168.6.10 三个网页轮询
注意:测试功能,生产环境不要用
tomcat管理功能对于tomcat自身以及部署在tomcat上的应用进行管理的web应用。在默认情况下是出于禁用状态的。如果需要开启这个功能,就需要配置管理用户,及配置tomcat-users.xml文件。
直接访问http://192.168.6.12:8080/manager/status会有401和403报错
[root@localhost ~]# vim /usr/local/tomcat8/conf/tomcat-users.xml
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/>
</tomcat-users> #在此行上面加三行
[root@localhost ~]# vim /usr/local/tomcat8/webapps/manager/META-INF/context.xml
<!-- <Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> --> #注释地址限制[root@localhost ~]# /usr/local/tomcat8/bin/shutdown.sh
[root@localhost ~]# /usr/local/tomcat8/bin/startup.sh
验证
http://192.168.6.12:8080/manager/status 并且输入 用户tomcat密码tomcat
上线代码有两种方式
第一种方式是直接将程序目录放在webapps目录下面,这种方式大家已经明白了,就不用多说了。
第二种方式是使用开发者工具将程序打包成war包,然后上传到webapps目录下面
部署tomcat内存检测包
上传meminfo.war包到/usr/local/tomcat8/webapps目录中
[root@localhost webapps]# ls
docs examples host-manager manager meminfo.war ROOT
站点主动解压部署
[root@localhost webapps]# ls
docs examples host-manager manager meminfo meminfo.war ROOT
浏览器访问:
192.168.6.12:8080/meminfo/meminfo.jsp
jpress官网 http://jpress.io
下载地址:https:/github.com/JpressProjects/jpress
安装配置数据库
[root@localhost ~]#yum -y install mariadb mariadb-server
[root@localhost ~]# systemctl start mariadb
配置数据库
[root@localhost ~]# mysql
MariaDB [(none)]> create database jpress DEFAULT CHARACTER SET utf8;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> grant all on jpress.* to jpress@'localhost' identified by '123456';
Query OK, 0 rows affected (0.01 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
jpress站点上线
[root@localhost webapps]# ls
docs host-manager jpress.war manager meminfo.war
examples jpress jpress-web-newest meminfo ROOT
访问
192.168.6.12:8080/jpress/admin/index 并且输入数据库授权用户密码
方法一,开发java监控页面
[root@localhost ~]# mkdir /usr/local/tomcat8/webapps/memtest/
[root@localhost ~]# vim /usr/local/tomcat8/webapps/memtest/meminfo.jsp
<%
Runtime rtm = Runtime.getRuntime();
long mm = rtm.maxMemory()/1024/1024;
long tm = rtm.totalMemory()/1024/1024;
long fm = rtm.freeMemory()/1024/1024;
out.println("JVM memory detail info:
");
out.println("MAX memory:"+mm+"MB"+"
");
out.println("Total memory:"+tm+"MB"+"
");
out.println("Free memory :"+fm+"MB"+"
");
out.println("Available memory can be used is :"+(mm+tm+fm)+"MB"+"
");
%>
验证
http://192.168.6.12:8080/memtest/meminfo.jsp
方法二,使用jps命令进行监控
[root@localhost ~]# jps -lvm
17681 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/usr/local/tomcat8/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dcatalina.base=/usr/local/tomcat8 -Dcatalina.home=/usr/local/tomcat8 -Djava.io.tmpdir=/usr/local/tomcat8/temp
18825 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/usr/local/tomcat8/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dcatalina.base=/usr/local/tomcat8 -Dcatalina.home=/usr/local/tomcat8 -Djava.io.tmpdir=/usr/local/tomcat8/temp
19114 sun.tools.jps.Jps -lvm -Dapplication.home=/usr/local/java -Xms8m
方法三,toncat远程监控功能
修改配置文件开启远程控制
[root@localhost ~]# vim /usr/local/tomcat8/bin/catalina.sh
#!/bin/sh
CATALINA_OPTS="$CATALINA_OPTS
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=12345
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=192.168.6.12"
[root@localhost ~]# /usr/local/tomcat8/bin/shutdown.sh
[root@localhost ~]# /usr/local/tomcat8/bin/startup.sh
[root@localhost ~]# netstat -lnpt | grep 12345
tcp6 0 0 :::12345 :::* LISTEN 19449/java
在windows上监控tomcat
注意:windows需要安装jdk环境
下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html
将jdk解压到C:\java\中, 双击运行C:\java\jdk-12\bin\jconsole.exe
添加ip:端口号
a.查看catalina.out
b.使用 sh show-busy-java-threads.sh
脚本下载地址
https://files.cnblogs.com/files/clsn/show-busy-java-threads.sh
1,telnet管理端口保护(强制)
配置内容及说明:
1,修改默认的8005管理端口为不易猜测的端口(大于1024)
2,修改SHUTDOWN指令为其他字符串;
标准配置
备注
以上配置项的配置内容只是建议配置,可以按照服务实际情况进行合理匹配,但要求端口配置在8000~8999之间;
2,ajp连接端口保护(推荐)(nginx集群的话直接注释)
配置内容及说明
1,修改默认的ajp8009端口为不易冲突的大于1024端口
2,通过iptables规则限制ajp端口访问的权限仅为线上机器
标准配置
备注
以上配置项的配置内容仅为建议配置,请按照服务实际情况进行合理配置,但要求端口配置在8000~8999之间。保护此端口的目的在于防止线下的测试流量被mod_jk转发至线上tomcat服务器;
3,禁用管理端(强制)
配置内容及说明
1,删除默认的(Tomcat安装目录)/conf/tomcat-user.xml文件,重启tomcat后将会自动生成新的文件
2,删除(tomcat安装目录)/webapps下默认的所有目录和文件
3,将tomcat应用根目录配置为tomcat安装目录以外的目录
标准配置
备注
对于前段web模块,Tomcat管理端属于tomcat的高危安全隐患,一旦被攻破,黑客通过上传web shell方式将会直接取得服务器的控制权,后果极其严重
4,降权启动(强制)
配置内容及说明
1、tomcat启动用户权限必须为非root权限,尽量降低tomcat启动用户的目录访问权限;
2、如需直接对外使用80端口,可通过普通账号启动后,配置iptables规则进行转发
标准配置
useradd tomcat
cp -a /usr/local/tomcat /home/tomcat/
chown -R tomcat.tomcat /home/tomcat/
su -c '/home/tomcat/bin/startup.sh' tomcat
ps -ef | grep tomcat
注:su -c 使用tomcat用户 执行startup脚本
备注
避免一旦tomcat服务被入侵,黑客直接获取高级用户权限危害整个server安全
5,文件列表访问控制(强制)(类似于nginx的自动索引c)
配置内容及说明
conf/web.xml文件中default部分listings的配置必须为false
标准配置
listings
false
备注
false为不列出目录文件,(默认)
true为允许列出。
6,版本信息隐藏(强制)
配置内容及说明
1、修改conf/web.xml,重定向403、40以及500等错误到指定的错误页面
2、也可以通过修改应用程序目录下的WEB-INF/web.xml下的配置进行错误页面的重定向
标准配置
403 /fordidden.jsp
404 /notfound.jsp
500 /systembusy.jsp
备注
在配置中对一些常见错误进行重定向,避免当前出现错误是tomcat默认显示的错误页面暴露服务器的版本信息;必须确保程序根目录下的错误页面已经存在
7,Server header重写
配置内容及说明
在HTTP Connector配置中加入server的配置
标准配置
server="webserver"
8,访问限制(可选)
配置内容及说明
通过配置限定访问的ip来源 server.xml
标准配置
备注
通过配置信任ip的白名单,拒绝非白名单ip的访问,此配置主要是针对高保密级别的系统,一般产品线不需要
9,启停脚本权限回收(推荐)
配置内容及说明
去除其他用户对Tomcat的bin目录下shutdown.sh、startup.sh、catalina.sh的可执行权限
标准配置
chmod -R 744 tomcat/bin/*
10,访问日志格式规范(推荐)
配置内容及说明
开启Tomcat默认访问日志中的Referer和User-Agent记录
标准配置或操作
备注
开启Referer和User-Agent是为了单一出现安全问题能够更好的根据日志进行问题排查;
11,禁止列出目录
vim /usr/local/tomcat/conf/web.xml
110
111 listings
112 false
113
12,页面超时
581
582 30
583
13,默认页面
4679
4680 index.html
4681 index.htm
4682 index.jsp
4683
14,配置网页传输压缩
注:如若有apache、nginx等做代理,tomcat则不必配置传输压缩
vim /usr/local/tomcat/conf/server.xml
69
72 compression="on" #开启压缩
73 compressionMinSize="50" #指定最小的压缩文件,单位是字节
74 noCompressionUserAgents="gozilla,Traviata" #此浏览器类型不进行压缩
75 compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" /> #文件的格式
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
1,同步概念:
同步: 自己亲自出马持银行卡到银行取钱(使用同步IO时,java自己处理IO读写)。
异步: 委托一小弟拿银行卡到银行取钱,然后给你(使用异步IO事,java将IO读写委托给OS处理,需要将数据缓冲区地址大小传给OS(银行卡和密码),OS需要支持异步IO操作API)
阻塞: ATM排队取款,你只能等待(使用阻塞IO时,java调用会一直阻塞到读写完成才返回)。
非阻塞: 柜台取款,取个号,然后坐在椅子上做其它事,等号广播会通知你办理,没到号你就不能去,你可以不断问大堂经理排到了没有,大堂经理如果说还没到你就不能去(使用非阻塞IO时,如果不能读写java调用会马上返回,当IO事件分发器会通知可读写时再继续进行读写)
2,java对BIO,NIO,AIO的支持
java BIO: 同步并阻塞,服务器实现模式为一个连接一个线程,既客户端有链接请求时服务器端就需要启动一个线程进行处理,如果这个链接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善
java NIO: 同步非阻塞,服务器实现模式为一个请求一个线程,机客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接I/O请求时才启动一个线程进行处理。
**java AIO(NIO.2): **异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。
3,BIO NIO AIO 适用场景分析:
BIO
BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前唯一的选择,但程序只管简单易理,性能非常低下,没有经过任何优化处理。
NIO
nio(new I/O)是java SE1.4及后续版本提供的一种新的I/O操作方式(既java.nio包及其子包)。java nio 是一个基于缓存区,并能提供非阻塞I/O操作的java API,因此NIO也被看成是non-blocking I/O的缩写,他拥有比传统I/O操作(bio)更好的并发运行性能,适用于连接数目多且连接比较短(轻操作)的架构。比如聊天服务器,并发局限与应用中
ARP
安装起来最困难,但是从操作系统级别来解决异步的IO问题,大幅度的提高了性能。
配置方法
BIO
没经过任何优化和处理,几百并发性能极低下。配置server.xml
NIO
**利用java的异步io护理技术,no blocking IO技术。**配置server.xml
[root@localhost ~]# tail -3 /usr/local/tomcat_instance/tomcat1/logs/catalina.out
04-Nov-2019 04:56:20.308 信息 [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
[root@localhost ~]# vim /usr/local/tomcat/conf/server.xml
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"/>
APR
**安装最困难,操作系统级别的控制,但也是在Tomcat上运行高并发应用的首选模式。**配置server.xml
[root@localhost ~]# rpm -e apr --nodeps
[root@localhost ~]# yum -y install apr apr-devel
[root@localhost ~]# cp /usr/local/tomcat8/bin/tomcat-native.tar.gz /root/
[root@localhost ~]# tar xf tomcat-native.tar.gz
[root@localhost ~]# cd tomcat-native-1.2.12-src/native/
[root@localhost native]# ./configure --with-apr=/usr/bin/apr-1-config --with-java-home=/usr/local/java && make && make install
root@localhost native]# vim /usr/local/tomcat8/bin/catalina.sh
CATALINA_OPTS="-Djava.library.path=/usr/local/apr/lib" //最后一行添加
[root@localhost native]# vim /usr/local/tomcat8/conf/server.xml
<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"/>
[root@localhost native]# vim /etc/profile
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib
[root@localhost native]#source /etc/profile
[root@localhost native]# /usr/local/tomcat8/bin/shutdown.sh
[root@localhost nativ/usr/local/tomcat8/bin/startup.sh
[root@localhost native]# netstat -anpt | grep java
tcp6 0 0 :::8009 :::* LISTEN 10656/java
tcp6 0 0 :::8080 :::* LISTEN 10656/java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 10656/java
验证
可以开启管理功能验证
[root@localhost native]# tail -3 /usr/local/tomcat8/logs/catalina.out
04-Nov-2019 06:32:35.726 信息 [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-apr-8080"]
04-Nov-2019 06:32:35.745 信息 [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"]
04-Nov-2019 06:32:35.753 信息 [main] org.apache.catalina.startup.Catalina.start Server startup in 2673 ms
解决重启tomcat服务后,8005端口延迟启动的问题;
[root@localhost ~]# vim /usr/local/java/jre/lib/security/java.security
117 securerandom.source=file:/dev/urandom
在tomcat服务中每一个用户请求都是一个线程,所有可以使用线程池(也叫连接器)来提高性能。
线程池是什么?
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后创建线程后自动启动这些任务,线程池线程都是后台线程。每个线程都使用默认的堆栈大小。
它由线程池管理器,工作线程,任务接口,任务队列组成。
在什么情况下使用线程池?
单个任务处理的时间短。
将需处理的任务的数量大
有什么好处?
1,减少在创建和摧毁线程上花的事件以及系统资源的开销
2,如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及“过度切换”
开启并使用
[root@localhost ~]# vim /usr/local/tomcat8/conf/server.xml
57 <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
58 maxThreads="500" minSpareThreads="100" prestartminSpareThreads="true"/>
[root@localhost ~]# /usr/local/tomcat8/bin/shutdown.sh
[root@localhost ~]# /usr/local/tomcat8/bin/startup.sh
参数说明
maxThreads(最大线程数) | 默认值是200(可以适当调整)如果配置了一个Executor,则该属性的任何值将被正确记录,但是它将被显示为-1 |
---|---|
minSpareThreads(最小活跃线程数) | 默认是25(调整活跃线程数的时候必须开启下面的参数) |
prestartminSpareThreads(是否在启动时就生成minSpareThreads个线程) | 默认是flase,改为true开启 |
MaxQueueSize(最大的等待队列数,超过则请求拒绝) | 基本是无上限,假如你超过最大线程数,就可以给你设置的100的等待队列数 |
dler [“ajp-nio-8009”]
04-Nov-2019 06:32:35.753 信息 [main] org.apache.catalina.startup.Catalina.start Server startup in 2673 ms
**解决重启tomcat服务后,8005端口延迟启动的问题;**
```shell
[root@localhost ~]# vim /usr/local/java/jre/lib/security/java.security
117 securerandom.source=file:/dev/urandom
在tomcat服务中每一个用户请求都是一个线程,所有可以使用线程池(也叫连接器)来提高性能。
线程池是什么?
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后创建线程后自动启动这些任务,线程池线程都是后台线程。每个线程都使用默认的堆栈大小。
它由线程池管理器,工作线程,任务接口,任务队列组成。
在什么情况下使用线程池?
单个任务处理的时间短。
将需处理的任务的数量大
有什么好处?
1,减少在创建和摧毁线程上花的事件以及系统资源的开销
2,如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及“过度切换”
开启并使用
[root@localhost ~]# vim /usr/local/tomcat8/conf/server.xml
57 <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
58 maxThreads="500" minSpareThreads="100" prestartminSpareThreads="true"/>
[root@localhost ~]# /usr/local/tomcat8/bin/shutdown.sh
[root@localhost ~]# /usr/local/tomcat8/bin/startup.sh
参数说明
maxThreads(最大线程数) | 默认值是200(可以适当调整)如果配置了一个Executor,则该属性的任何值将被正确记录,但是它将被显示为-1 |
---|---|
minSpareThreads(最小活跃线程数) | 默认是25(调整活跃线程数的时候必须开启下面的参数) |
prestartminSpareThreads(是否在启动时就生成minSpareThreads个线程) | 默认是flase,改为true开启 |
MaxQueueSize(最大的等待队列数,超过则请求拒绝) | 基本是无上限,假如你超过最大线程数,就可以给你设置的100的等待队列数 |