中间件产品介绍

​ 目前来说IBM的WebSphere. Oracle的Weblogic占据了市场上Java语言Web站点的部分份额。该两种软件由于无与伦比的性能及可靠性等优势被广泛应用于大型互联网公哥的Web场景中。但是其高昂的价格也使得中小型互联网公司对此望而却步。。

​ Tomcat自S.x版本以来,其性能上已经得到視大幅度的提升。加上其开放性的框架和二次开发等特性,已经完全可以用在访问量不是很大的生产环境下,目前大多数用于JSP技术开发的电子商务网站基本上都应用了Tomcat.。

​ 中间件产品RedHat JBom,Qracle Tuxed, cauthe Resin.。

tomcat软件介绍

​ 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应用场景

​ tomcat服务器是一个免费的开放源代码的web应用服务器,属于轻量级应用服务器,应用在中小系统和并发访问用户不是很多的场合,是开发和调试JSP页面的首选,tomcat也可以处理静态的HTML页面但是能力不及Apache或nginx,所以tomcat通常作为一个servlet和JSP容器,单独运行在后端

tomcat官网: http://tomcat.apache.org

JDK软件简介

​ 在安装tomcat之前必须安装JDK,JDK全称是 java Development Kit, 是SUN公司免费提供的Java语言软件开发工具包,其中包含java虚拟机(JVM),编写好的java源程序经过编译可产生java字节码,只要安装了JDK,就可以利用JVM解释这些字节码文件,从而保证了java的跨平台性。

​ 在平台兼容性方面,JDK作为解释字节码文件并根据此调用操作系统的API实现对应功能的java虚拟机,与操作系统位数密切相关,因此存在不同类型的版本,tomcat也具有上述特征,centos7系统中默认已经安装了jdk

用于java开发的组件
jar      打包工具,将先关的类文件打包成一个文件
jps     显示当前java程序运行的进程状态
jhat    java堆分析工具
jstack  栈跟踪程序
jstat   JVM检测统计工具
jstatd  jstat守护进程

JDK中还包括完整的JRE(java Runtime Environment),java运行环境,也被称为private runtime.包括了用于产品环境的各种库类,如基础类库rt.jar 以及给开发人员使用的补充库,如果国际化与本地化的类库,IDL库等等,JDK中还包括各种样例程序,用以展示java API中的个部分。

安装配置tomcat

所需要软件包

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.

tomcat配置目录及文件说明

tomcat主目录介绍

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)

webapps目录介绍

docs     //tomcat帮助文档
emamples    //web应用实例
host-manager //主机管理
manager     //管理
ROOT        //默认站点根目录

conf目录介绍

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等相关配置文件

tomcat主配置文件说明

server.xml主要配置文件,可修改启动端口,设置网站根目录,虚拟主机,开启https等功能

sercer.xml的结构构成
<Server><Service><Connector /><Engine><Host><Context></Context></Host></Engine></Service>
</Server><!--  -->  内的内容是注视信息

//tomcat关闭端口,默认只对本机地址开放,可以在本机通过 telnet 127.0.01 8005 访问,对tomcat进行操作

<Server port="8005" shutdown="SHUTDOWN">

//tomcat启动默认端口是8080,可以根据需要进行修改

<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" />

//tomcat启动AJP1.3连接器时默认的端口号,可以根据需要进行修改

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

//一下是tomcat定义虚拟主机是的配置及日志配置

      <Host name="localhost"  appBase="webapps"unpackWARs="true" autoDeploy="true"><Context docBase="/web/accp" path="" reloadable="false" ></Context><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>

自定义默认网站目录

首先在根目录下创建一个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

nginx+tomcat 负载均衡集群

​ 一台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;
}

nginx负载均衡算法

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负载均衡调度状态

在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连接数据库

环境:

一台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

Tomcat虚拟主机

​ 虚拟主机用于在一台物理机上搭建多个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 &quot;%r&quot; %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 &quot;%r&quot; %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 &quot;%r&quot; %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 &quot;%r&quot; %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多实例配置

应用程序需要部署在服务器上时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" ];thenmkdir $CATALINA_BASE/logs
fi#创建temp目录
if [ ! -d "$CATALINA_BASE/temp" ];thenmkdir $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" ];thenmkdir $CATALINA_BASE/logs
fi#创建temp目录
if [ ! -d "$CATALINA_BASE/temp" ];thenmkdir $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

基于多实例多应用做nginx负载均衡

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.confupstream 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自身以及部署在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

WEB站点部署

上线代码有两种方式

第一种方式是直接将程序目录放在webapps目录下面,这种方式大家已经明白了,就不用多说了。

第二种方式是使用开发者工具将程序打包成war包,然后上传到webapps目录下面

用war包部署站点

部署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)

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 并且输入数据库授权用户密码

监控tomcat状态

方法一,开发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:<br>");
out.println("MAX memory:"+mm+"MB"+"<br>");
out.println("Total memory:"+tm+"MB"+"<br>");
out.println("Free memory :"+fm+"MB"+"<br>");
out.println("Available memory can be used is :"+(mm+tm+fm)+"MB"+"<br>");
%>

验证

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:端口号

Tomcat故障排查步骤

a.查看catalina.out

b.使用 sh show-busy-java-threads.sh

脚本下载地址

https://files.cnblogs.com/files/clsn/show-busy-java-threads.sh

Tomcat安全优化

1,telnet管理端口保护(强制)

配置内容及说明

1,修改默认的8005管理端口为不易猜测的端口(大于1024)

2,修改SHUTDOWN指令为其他字符串;

标准配置

<Server       port="8527"
shutdown="crushlinux">

备注

以上配置项的配置内容只是建议配置,可以按照服务实际情况进行合理匹配,但要求端口配置在8000~8999之间;

2,ajp连接端口保护(推荐)(nginx集群的话直接注释)

配置内容及说明

1,修改默认的ajp8009端口为不易冲突的大于1024端口

2,通过iptables规则限制ajp端口访问的权限仅为线上机器

标准配置

<Connector        port="8528"
protocol="AJP/1.3/" />

备注

以上配置项的配置内容仅为建议配置,请按照服务实际情况进行合理配置,但要求端口配置在8000~8999之间。保护此端口的目的在于防止线下的测试流量被mod_jk转发至线上tomcat服务器;

3,禁用管理端(强制)

配置内容及说明

1,删除默认的(Tomcat安装目录)/conf/tomcat-user.xml文件,重启tomcat后将会自动生成新的文件

2,删除(tomcat安装目录)/webapps下默认的所有目录和文件

3,将tomcat应用根目录配置为tomcat安装目录以外的目录

标准配置

<Context path="" docBase="/web/webapps" debug="0" reloadable="false" crossContext="true"/>

备注

对于前段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

标准配置

<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>

备注

false为不列出目录文件,(默认)

true为允许列出。

6,版本信息隐藏(强制)

配置内容及说明

1、修改conf/web.xml,重定向403、40以及500等错误到指定的错误页面

2、也可以通过修改应用程序目录下的WEB-INF/web.xml下的配置进行错误页面的重定向

标准配置

<error-pag>
<error-code>403</error-code><location>/fordidden.jsp</location>
</error-pag>  <error-pag><error-code>404</error-code><location>/notfound.jsp</location>
</error-pag>  <error-pag><error-code>500</error-code><location>/systembusy.jsp</location>
</error-pag>

备注

在配置中对一些常见错误进行重定向,避免当前出现错误是tomcat默认显示的错误页面暴露服务器的版本信息;必须确保程序根目录下的错误页面已经存在

7,Server header重写

配置内容及说明

在HTTP Connector配置中加入server的配置

标准配置

server="webserver"

8,访问限制(可选)

配置内容及说明

通过配置限定访问的ip来源 server.xml

标准配置

<Context path="" docBase="/web/webapps" debug="0" reloadable="false" crossContext="ture"><Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192.168.1.3,192.168.2.*" deny="*.*.*.*"/>
</Context>

备注

通过配置信任ip的白名单,拒绝非白名单ip的访问,此配置主要是针对高保密级别的系统,一般产品线不需要

9,启停脚本权限回收(推荐)

配置内容及说明

去除其他用户对Tomcat的bin目录下shutdown.sh、startup.sh、catalina.sh的可执行权限

标准配置

chmod -R 744 tomcat/bin/*

10,访问日志格式规范(推荐)

配置内容及说明

开启Tomcat默认访问日志中的Referer和User-Agent记录

标准配置或操作

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"    prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t %r %s %b %{Referer}i
%{UserAgent}i %D" resolveHosts="false"/>

备注

开启Referer和User-Agent是为了单一出现安全问题能够更好的根据日志进行问题排查;

11,禁止列出目录

vim /usr/local/tomcat/conf/web.xml
110         <init-param>
111             <param-name>listings</param-name>
112             <param-value>false</param-value>
113         </init-param>

12,页面超时

 581     <session-config>582         <session-timeout>30</session-timeout>583     </session-config>

13,默认页面

 4679     <welcome-file-list>4680         <welcome-file>index.html</welcome-file>4681         <welcome-file>index.htm</welcome-file>4682         <welcome-file>index.jsp</welcome-file>4683     </welcome-file-list>

14,配置网页传输压缩

注:如若有apache、nginx等做代理,tomcat则不必配置传输压缩

vim /usr/local/tomcat/conf/server.xml69     <Connector port="8080" protocol="HTTP/1.1"70                connectionTimeout="20000"71                redirectPort="8443" />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

Tomcat运行模式

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

<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443"
URIEncoding="UTF-8"/>

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执行器

​ 在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执行器

​ 在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的等待队列数

tomcat服务部署与nginx负载均衡相关推荐

  1. 面试宝典六-- 项目部署(linux环境搭建,springboot项目部署 ,vue项目部署,nginx负载均衡)

    环境准备 实际开发中,项目肯定是部署在一个个的linux系统服务器中的,学习过程中,可以在自己电脑上安装虚 拟机然后配置linux操作系统进行模拟项目部署,当然也可以花费较小费用使用各种平台提供的云服 ...

  2. Django项目部署 uwsgi+nginx 负载均衡

    部署示意图 uwsig 第一步:安装uwsig pip install uwsgi 第二步:配置uwsgi 手动在项目根目录下新建文件uwsgi.ini [uwsgi]# 使用nginx连接时使用 # ...

  3. Nginx以及通过Nginx实现tomcat集群配置与负载均衡

    Nginx简介 启动,停止,和重新加载配置文件命令 Nginx功能 正向代理和反向代理的区别 反向代理 负载均衡 1.RR(默认) 2.权重 3.ip_hash 4.fair(第三方) 5.url_h ...

  4. Tomcat集群快速入门:Nginx负载均衡配置,常用策略,场景及特点

    Nginx负载均衡的配置,常用策略,场景,以及特点,放到这里是需要更细化的讲解,毕竟一期还没有做集群,而我们这一期做集群的时候,很多点要单独拿出来深入讲解,第一个轮询,默认的一个配置,简单也好理解,第 ...

  5. Centos7+Nginx+Keepalived实现Apache服务的高可用负载均衡

    Centos7+Nginx+Keepalived实现Apache服务的高可用&负载均衡 今天是2017年的第一天,昨天也就是2016年的最后一天,我尝试部署了Centos7+Nginx+Kee ...

  6. 关于Tomcat+Nginx负载均衡与Jmeter服务器测压的日记

    Jmeter测压 1.Jmeter-5.1.1下载:http://mirror.bit.edu.cn/apache//jmeter/binaries/apache-jmeter-5.1.1.zip 2 ...

  7. Nginx 负载均衡服务失败场景

    nginx可以配置负载均衡,我们可以通过配置实现nginx负载均衡.这里部署了两个服务producter-one和producter-one2. upstream proxyproducter-one ...

  8. Haproxy群集+Nginx负载均衡+Tomcat架构搭建

    文章目录 Haproxy群集+Nginx负载均衡+Tomcat 一.Nginx+Tomcat 1.tomcat1搭建 1)准备工作 2)安装JDK,配置tomcat环境变量 ①rpm安装JDK ②配置 ...

  9. docker初体验:docker部署nginx负载均衡集群

    Docker 是一个用于开发,交付和运行应用程序的开放平台.Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件.今天来为大家演示一下docker部署nginx负载均衡集群 环境 ce ...

最新文章

  1. Android UI SurfaceView的使用-绘制组合图型,并使其移动
  2. iOS webview 点击按钮返回上一页面或者返回首页
  3. 数据中心网络架构 — 云数据中心网络 — 新型叶脊二层网络架构
  4. 结构型模式之Adapter模式
  5. python核心编程-第六章-个人笔记(一)
  6. VLC播放器web插件接口(Part2)
  7. Kubernetes 会不会“杀死” DevOps?
  8. 如何修改snmp的监听端口
  9. android 当中taskAffinity属性与launchMode相关
  10. php空间限制磁盘限额,ORA-01536:超出表空间XXXX的空间限额
  11. 为什么Facebook的API以一个循环作为开头?
  12. 什么舱位_把“订舱位”说成book warehouse position,外企不会要你
  13. .net core精彩实例分享 -- 字符串处理
  14. 修改yum源的资源路径baseurl
  15. 中台架构与实现:基于ddd和微服务 下载_为什么在做微服务设计的时候需要DDD?...
  16. 细思极恐:网传某软件可一键监控员工是否要“跑路”,争议发生后,监控系统研发商悄悄下架相关服务...
  17. USACO Section 1.1 : Greedy Gift Givers
  18. jav中什么是组织java程序_在Java中,开发图形用户界面的程序需要使用一个系统提供的类库,这个类库就是以下的______包。A.jav...
  19. 计算机再带word打不开,电脑word文档打不开怎么办(附:4种解决办法)
  20. 秋季吃哪些食物可以改善心情?

热门文章

  1. 专家:滴滴优步合并存大数据垄断隐忧
  2. js电影票预订座位网页js特效
  3. c# HJ212协议组包
  4. 【Three Fire】核心知识基本放大电路——模电学习笔记2.1
  5. 龙族幻想导入数据id_龙族幻想:一键捏脸数据ID 快速捏脸数据ID汇总分享
  6. java计算机毕业设计线上旅行信息管理系统源代码+数据库+系统+lw文档
  7. Java中的集合List - 入门篇
  8. Windows API CreateFile WriteFile 操作文件追加写入 解决中文乱码
  9. 在线编辑php文件的代码
  10. 软件测试基础知识面试题目(25题英文题目)