nginx+tomcat实现Java负载均衡

  • 项目环境
系统类型 IP地址 主机名 所需软件
centos7.8 192.168.100.101 nginx.linux.cn nginx-1.22.0.tar.gz
centos7.8 192.168.100.102 tomcat1.linux.cn apache-tomcat-9.0.10.tar.gz jdk-8u171-linux-x64.tar.gz
centos7.8 192.168.100.103 tomcat2.linux.cn apache-tomcat-9.0.10.tar.gz jdk-8u171-linux-x64.tar.gz
centos7.8 192.168.100.104 mysql.linux.cn mariadb-server、mysql
  • 安装并配置Nginx程序
[root@nginx ~]# yum -y install pcre-devel zlib-devel
[root@nginx ~]# useradd -M -s /sbin/nologin nginx
[root@nginx ~]# tar xf nginx-1.22.0.tar.gz -C /usr/src/
[root@nginx ~]# cd /usr/src/nginx-1.22.0/
[root@nginx nginx-1.22.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
[root@nginx nginx-1.22.0]# make && make install
[root@nginx nginx-1.22.0]# cd 
[root@nginx ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@nginx ~]# cat <<END >>/usr/lib/systemd/system/nginx.service
[Unit]
Description=nginxapi
After=network.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=kill -s HUP \$(cat /usr/local/nginx/logs/nginx.pid)
ExecStop=kill -s QUIT \$(cat /usr/local/nginx/logs/nginx.pid)
PrivateTmp=Flase

[Install]
WantedBy=multi-user.target
END
[root@nginx ~]# systemctl start nginx
[root@nginx ~]# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
[root@nginx ~]# netstat -utpln |grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      6005/nginx: master

  • 安装并配置tomcat程序,并且自定义页面(两个tomcat节点配置一致,在此列举tomcat1)
    [root@tomcat1 ~]# tar xf jdk-8u171-linux-x64.tar.gz 
    [root@tomcat1 ~]# mv jdk1.8.0_171/ /usr/local/java
    [root@tomcat1 ~]# tar xf apache-tomcat-9.0.10.tar.gz 
    [root@tomcat1 ~]# mv apache-tomcat-9.0.10 /usr/local/tomcat
    [root@tomcat1 ~]# vi /usr/local/tomcat/bin/catalina.sh
    #!/bin/sh
    JAVA_OPTS="-Xms512m -Xmx1024m -Xss1024K -XX:PermSize=512m -XX:MaxPermSize=1024m"
    export CATALINA_HOME=/usr/local/tomcat
    export JRE_HOME=/usr/local/java/jre
    export JAVA_HOME=/usr/local/java/jdk1.8.0_171
    export TOMCAT_HOME=/usr/local/tomcat
    [root@tomcat1 ~]#  /usr/local/tomcat/bin/startup.sh
    [root@tomcat1 ~]# netstat -utpln |grep 8080
    tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      1192/java

[root@tomcat1 ~]# vi /usr/local/tomcat/conf/server.xml
150         <Context docBase="/web/webapp" path="" reloadable="false"></Context>    #在150行左右位置添加
[root@tomcat1 ~]# mkdir -p /web/webapp
[root@tomcat1 ~]# cat <<END >>/web/webapp/index.jsp
192.168.100.102
END
[root@tomcat1 ~]# /usr/local/tomcat/bin/shutdown.sh
[root@tomcat1 ~]#  /usr/local/tomcat/bin/startup.sh


  • 配置Nginx服务的反向代理
[root@nginx ~]# vi /usr/local/nginx/conf/nginx.conf
     34     upstream tomserver {
     35         server 192.168.100.102:8080 weight=1;
     36         server 192.168.100.103:8080 weight=2;
     37     }
     52     location ~\.(jsp|do|js|css|png|jpg|jpeg)$ {
     53         proxy_pass      http://tomserver;
     54     }
[root@nginx ~]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
  • 访问测试Nginx验证页面切换


  • 安装部署MySQL程序

[root@mysql ~]# yum -y install mariadb-server mysql
[root@mysql ~]# systemctl start mariadb
[root@mysql ~]# systemctl enable mariadb
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.
[root@mysql ~]# netstat -utpln |grep 3306
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      1423/mysqld 
[root@mysql ~]# mysqladmin -u root password 123123
[root@mysql ~]# mysql -uroot -p123123
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>exit

[root@mysql ~]# ls
smbms_db.sql
[root@mysql ~]# mysql -uroot -p123123 <smbms_db.sql 
[root@mysql ~]# mysql -uroot -p123123
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| smbms              |
| test               |
+--------------------+
5 rows in set (0.00 sec)
MariaDB [(none)]> use smbms;
MariaDB [smbms]> show tables;
+-----------------+
| Tables_in_smbms |
+-----------------+
| smbms_address   |
| smbms_bill      |
| smbms_provider  |
| smbms_role      |
| smbms_user      |
+-----------------+
5 rows in set (0.00 sec)
MariaDB [smbms]> grant all on smbms.* to 'linux'@'192.168.100.102' identified by '123123';
MariaDB [smbms]> grant all on smbms.* to 'linux'@'192.168.100.103' identified by '123123';
MariaDB [smbms]>  flush privileges;
MariaDB [smbms]> exit
  • 将测试项目的文件部署到Tocmat节点(两个tomcat节点配置一致,在此列举tomcat1)
[root@tomcat1 webapp]# ls 
WebRoot
[root@tomcat1 webapp]# vi /web/webapp/WebRoot/WEB-INF/classes/database.properties
driver=com.mysql.jdbc.Driver
#在和mysql传递数据的过程中,使用unicode编码格式,并且字符集设置为utf-8
url=jdbc:mysql://192.168.100.104:3306/smbms?useUnicode=true&characterEncoding=utf-8
user=linux
password=123123
[root@tomcat1 webapp]#  vi /usr/local/tomcat/conf/server.xml
150         <Context docBase="/web/webapp/WebRoot/" path="" reloadable="false"></Context>
root@tomcat1 webapp]# /usr/local/tomcat/bin/shutdown.sh
[root@tomcat1 webapp]# /usr/local/tomcat/bin/startup.sh
  • 测试访问tomcat单点,登录超时管理系统

  • 修改Nginx配置,实现会话保持,避免登录错误

[root@nginx ~]# vi /usr/local/nginx/conf/nginx.conf
     34     upstream tomserver {
     35         ip_hash;
     36         server 192.168.100.102:8080 weight=1;
     37         server 192.168.100.103:8080 weight=2;
     38     }

  • 修改Nginx的配置,实现访问url的优化
[root@nginx ~]# vi /usr/local/nginx/conf/nginx.conf
     56         location /shopping {
     57                 rewrite ^/(.*) http://192.168.100.101/login.jsp permanent;
     58         }
[root@nginx ~]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@nginx ~]# /usr/local/nginx/sbin/nginx -s reload


李泽信 发布于 2022-8-23 20:02

Tomcat优化

  • 定义默认页面、页面超时、禁止列出目录
[root@localhost ~]# vi /usr/local/tomcat/conf/web.xml
115         <init-param>
116             <param-name>listings</param-name>
117             <param-value>false</param-value>
118         </init-param>
##禁止列出目录
606     <session-config>
607         <session-timeout>30</session-timeout>
608     </session-config>
## 页面超时
4704     <welcome-file-list>
4705         <welcome-file>index.html</welcome-file>
4706         <welcome-file>index.htm</welcome-file>
4707         <welcome-file>index.jsp</welcome-file>
4708     </welcome-file-list>
  • 禁用AJP协议连接器
    概述:AJP13是定向包协议,通常用于代理或者防火墙重定向
[root@localhost ~]# vi /usr/local/tomcat/conf/server.xml
115     <!-- Define an AJP 1.3 Connector on port 8009
116     <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
117         -->
[root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh
[root@localhost ~]# /usr/local/tomcat/bin/startup.sh
[root@localhost ~]# netstat -utpln |grep java
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      2354/java           
tcp        0      0 127.0.0.1:8005          0.0.0.0:*               LISTEN      2354/java 
  • 配置网页传输压缩
注:如若有apache、nginx等做代理,tomcat则不必配置传输压缩;
[root@localhost ~]# vi /usr/local/tomcat/conf/server.xml
69     <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" />      ##压缩文件的格式
  • tomcat的三种模式切换

    • 先了解四个概念

      • 同步:自己亲自出马持银行卡到银行取钱(使用同步IO时,Java自己处理IO读写)。
      • 异步:委托一小弟拿银行卡到银行取钱,然后给你(使用异步IO时,Java将IO读写委托给OS处理,需要将数据缓冲区地址和大小传给OS(银行卡和密码),OS需要支持异步IO操作API)。
      • 阻塞:ATM排队取款,你只能等待(使用阻塞IO时,Java调用会一直阻塞到读写完成才返回)。
      • 非阻塞:柜台取款,取个号,然后坐在椅子上做其它事,等号广播会通知你办理,没到号你就不能去,你可以不断问大堂经理排到了没有,大堂经理如果说还没到你就不能去(使用非阻塞IO时,如果不能读写Java调用会马上返回,当IO事件分发器会通知可读写时再继续进行读写,不断循环直到读写完成。
    • Java对BIO、NIO、AIO的支持

      • Java BIO:同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
      • Java NIO:同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
      • Java AIO(NIO.2):异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。
    • BIO、NIO、AIO适用场景分析:

      • BIO方式:更适合处理简单流程,如程序处理较快可以立即返回结果。连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。
      • NIO方式:更适合后台需要耗时完成请求的操作,如程序接到了请求后需要比较耗时的处理这已请求,所以无法立即返回结果,这样如果采用BIO就会占用一个连接,而使用NIO后就可以将此连接转让给其他请求,直至程序处理完成返回为止。
      • APR方式:可以大大提升Tomcat对静态文件的处理性能,同时如果你使用了HTTPS方式传输的话,也可以提升SSL的处理性能。
  • 配置

    • 模式一 Bio:tomcat 7.0版本以前默认是Bio
    • 模式二Nio:tomcat 8.0版本以后默认是Nio,废弃Bio
    [root@localhost ~]# vi /usr/local/tomcat/conf/server.xml
        <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"        ##更改位置
               connectionTimeout="20000"
               redirectPort="8443"
               compression="on"
               compressionMinSize="50"
               noCompressionUserAgents="gozilla, traviata"
               compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" />
    [root@localhost bin]# tail -f ../logs/catalina.out
    ...
    22-Aug-2022 22:51:26.479 信息 [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
    • 模式三Apr
    [root@localhost ~]# rpm -e apr --nodeps
    [root@localhost ~]# yum -y install apr  apr-devel
    [root@localhost ~]# cp /usr/local/tomcat/bin/tomcat-native.tar.gz /root/
    [root@localhost ~]# tar xf tomcat-native.tar.gz 
    [root@localhost ~]# cd tomcat-native-1.2.17-src/native/
    [root@localhost native]# ./configure --with-apr=/usr/bin/apr-1-config --with-java-home=/usr/local/java/
    [root@localhost native]# make && make install
    Libraries have been installed in:                           ##安装成功的提示
    /usr/local/apr/lib
    [root@localhost ~]#  vi /usr/local/tomcat/bin/catalina.sh       ##添加或追加
    #!/bin/sh
    CATALINA_OPTS="-Djava.library.path=/usr/local/apr/lib"
    [root@localhost ~]# vi /usr/local/tomcat/conf/server.xml    ##注意需要将https的8443端口配置项删除,不然会导致http端口8080无法启动
    <Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
               connectionTimeout="20000"
               compression="on"
               compressionMinSize="50"
               noCompressionUserAgents="gozilla, traviata"
               compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" />
    [root@localhost ~]# vi /usr/local/tomcat/bin/catalina.sh
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib
    [root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh
    [root@localhost ~]# /usr/local/tomcat/bin/startup.sh
    [root@localhost ~]# netstat -utpln |grep java
    tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      4859/java           
    tcp        0      0 127.0.0.1:8005          0.0.0.0:*               LISTEN      4859/java
    [root@localhost ~]# tail -f ../logs/catalina.out
    ...
    22-Aug-2022 23:10:16.286 信息 [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-apr-8080"]
  • 解决重启tomcat服务后,8005端口延迟启动的问题

[root@localhost ~]#  vi /usr/local/java/jre/lib/security/java.security
      17 securerandom.source=file:/dev/urandom
或   117 securerandom.source=file:/dev/./random
[root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh
[root@localhost ~]# /usr/local/tomcat/bin/startup.sh 
  • 生产环境tomcat配置
[root@localhost ~]# vi /usr/local/tomcat/conf/server.xml
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
        URIEncoding="UTF-8"                     ##设置编码
        maxThreads="300"                            ##接收客户请求最大线程数,也就是同时处理请求的最大数目,默认值为“200”,并不是配置的越大越好,事实上你即使配置成999999也是没有用的,因为这个最大值是受操作系统及相关硬件所制约的,并且最大值并不一定是最优值,所以我们追寻的应该是最优值而不是最大值。建议值为1000;
        QPS(Query Per Second):每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。我们常常使用 QPS值来衡量一个服务器的性能。
        QPS = 并发数 / 平均响应时间      或者      并发数 = QPS * 平均响应时间
        一个系统吞吐量通常由QPS、并发数两个因素决定,每套系统的这两个值都有一个相对极限值,在应用场景访问压力下,只要某一项达到系统最高值,系统的吞吐量就上不去了,如果压力继续增大,系统的吞吐量反而会下降,原因是系统超负荷工作,上下文切换、内存等等其它消耗导致系统性能下降。所谓吞吐量这里可以理解为每秒能处理请求的次数。
       所以选择一个合理的 maxThreads值,其实并不是那么容易的事。因为过多的线程只会造成,更多的内存开销,更多的CPU开销,但是对提升QPS确毫无帮助;找到最佳线程数后通过简单的设置,可以让web系统更加稳定,得到最高,最稳定的QPS输出。
   通过以下几种方式来获取 maxThreads的最佳值:
        (1)通过线上系统不断使用和用户的不断增长来进行性能测试,观察QPS,响应时间,这种方式会在爆发式增长时系统崩溃,如双12等。
        (2)根据公式计算,服务器端最佳线程数量=((线程等待时间+线程cpu时间)/线程cpu时间) * cpu数量,这种方式有时会被误导,因为某些系统处理环节可能会耗时比较长,从而影响公式的结果。
        (3)单、多用户压力测试,查看CPU的消耗,然后直接乘以百分比,再进行压测,一般这个值的附近应该就是最佳线程数量,这种方式理想场景比较适用,实际情况会比这个复杂的多。
        (4)根据系统的自身情况调整,如硬件限制,系统限制,程序处理能力限制等。
        (5)定期修改为不同的 maxThreads值,看服务器响应结果及用户反应。
       QPS和线程数的关系:
        (1)在最佳线程数量之前,QPS和线程是互相递增的关系,线程数量到了最佳线程之后,QPS持平,不在上升,甚至略有下降,同时相应时间持续上升。
        (2)同一个系统而言,支持的线程数越多(最佳线程数越多而不是配置的线程数越多),QPS越高。
       QPS和响应时间的关系:
        (1)对于一般的web系统,响应时间一般有CPU执行时间+IO等待时间组成。
        (2)CPU的执行时间减少,对QPS有实质的提升,IO时间的减少,对QPS提升不明显。如果要想明显提升QPS,优化系统的时候要着重优化CPU消耗大户。

        minSpareThreads="25"                        ##最小空闲的线程数,Tomcat初始化时创建的 socket线程数,默认为10
        maxSpareThreads="75"                        ##最大空闲线程数,一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。默认值50
        enableLookups="false"                       ##关闭DNS反向查询
        disableUploadTimeout="true"                 ##该标志位表明当执行servlet时,是否允许servlet容器使用一个不同的、更长的连接超时。启用该标志位将导致在上传数据时,要么使用更长的时间完成上传,要么出现更长的超时。如果不指定,该属性为“false”。
        connectionTimeout="20000"                   ##当请求已经被接受,但未被处理,也就是等待中的超时时间。单位为毫秒,默认值为60000。通常情况下设置为30000。
        acceptCount="300"                           ##容许的最大连接的队列长度,一般设置为maxProcessors是其参数的1.5倍即可,默认值为100。此值设置的过大会导致排队的请求超时而未被处理。所以这个值应该是主要根据应用的访问峰值与平均值来权衡配置。
        tcpNoDelay="true"                           ##如果为true,服务器socket会设置TCP_NO_DELAY选项,在大多数情况下可以提高性能。缺省情况下设为true。
        maxProcessors="1000"                        ##并发处理的最大请求数,默认值为75,一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程
        <!--   前端使用nginx作为反向代理,不需要启用tomcat压缩功能。
        compression="on"
        compressionMinSize="2048"
        compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
        -->
        redirectPort="8443"                     ##开启安全通道ssl
/>
  • JVM内存优化管理;

    • JVM内存管理
      JVM管理的内存可以总体划分为两部分:堆内存Heap Memory和非堆内存Native Memory。堆内存Heap Memory:供Java应用的代码使用的;
      非堆内存Native Memory:也称为C-Heap,是供JVM自身进程使用的;
      Heap Memory及其内部各组成的大小可以通过JVM的一系列命令行参数来控制;
      Native Memory没有相应的参数来控制大小,其大小依赖于操作系统进程的最大值;
    • 为什么会内存溢出:
      简单理解java process memory = java heap + native memory。因此内存溢出时,首先要区分是堆内存溢出还是非堆内存溢出;
      非堆内存Native Memory本质上就是因为耗尽了进程地址空间。对于HotSpot JVM来说,不断的分配直接内存,会导致如下错误信息:Allocated 1953546760 bytes of native memory before running out;
    • 调优JVM分配内存数据:

      • 堆内存分配:
        JVM初始分配的堆内存由-Xms指定,默认是物理内存的1/64;
        JVM最大分配的堆内存由-Xmx指定,默认是物理内存的1/4;
        默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;
        空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制;
        因此服务器一般设置-Xms、-Xmx 相等以避免在每次GC 后调整堆的大小;
        说明:如果-Xmx 不指定或者指定偏小,应用可能会导致java.lang.OutOfMemoryError: Heap space错误;
      • 非堆内存分配:
        JVM使用-XX:PermSize= 设置非堆内存初始值,默认是物理内存的1/64;
        JVM使用-XX:MaxPermSize= 设置最大非堆内存的大小,默认是物理内存的1/4;
        说明:-XX:MaxPermSize= 设置过小会导致java.lang.OutOfMemoryError: PermGen space 就是内存溢出;
      [root@localhost ~]# vi /usr/local/tomcat/bin/catalina.sh
      #!/bin/sh
      JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx2048m -XX:NewSize=512m -XX:MaxNewSize=512m"
      
      注解:
      -Xms初始堆内存Heap大小,使用的最小内存,cpu性能高时此值应设的大一些;
      -Xmx初始堆内存heap最大值,使用的最大内存;
      -XX:PermSize= 设定非堆内存的初始内存大小;
      -XX:MaxPermSize= 设定非堆内存最大值内存大小;
      -XX:NewSize= 设置Yong Generation的初始值大小;
      -XX:MaxNewSize=设置Yong Generation的最大值大小;
      -Xss15120这使得Tomcat每增加一个线程(thread)就会立即消耗15M内存,而最佳值应该是128K,默认值好像是512k;
  • Executor线程池优化管理

    • 概述:Executor代表了一个线程池,可以在Tomcat组件之间共享。使用线程池的好处在于减少了创建销毁线程的相关消耗,而且可以提高线程的使用效率。
    • 配置管理线程池:
    [root@localhost ~]# vi /usr/local/tomcat/conf/server.xml
    53   <Service name="Catalina">
    54         <Executor name="tomcatThreadPool"
    55          namePrefix="catalina-exec-"
    56          maxThreads="1000"
    57          minSpareThreads="100"
    58          maxIdleTime="60000"
    59          maxQueueSize="Integer.MAX_VALUE"
    60          prestartminSpareThreads="false"
    61          threadPriority="5"
    62          className="org.apache.catalina.core.StandardThreadExecutor"/>
    [root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh
    [root@localhost ~]# /usr/local/tomcat/bin/startup.sh
    
    #注解:
    
    name:线程池名称,用于 Connector中指定。
    namePrefix:所创建的每个线程的名称前缀,单独的线程名称为 namePrefix+threadNumber。
    maxThreads:池中最大线程数。
    minSpareThreads:活跃线程数,也就是核心池线程数,这些线程不会被销毁,会一直存在。
    maxIdleTime:线程空闲时间,超过该时间后,空闲线程会被销毁,默认值为6000(1分钟),单位毫秒。
    maxQueueSize:在被执行前最大线程排队数目,默认为Int的最大值,也就是广义的无限。除非特殊情况,这个值不需要更改,否则会有请求不会被处理的情况发生。
    prestartminSpareThreads:启动线程池时是否启动。
    minSpareThreads部分线程。默认值为false,即不启动。
    threadPriority:线程池中线程优先级,默认值为5,值从1到10。
    className:线程池实现类,未指定情况下,默认实现类为org.apache.catalina.core.StandardThreadExecutor。如果想使用自定义线程池首先需要实现 org.apache.catalina.Executor接口。

李泽信 发布于 2022-8-22 22:31

Tomcat讲解及安装

一、认识Tomcat

  • 概述
    Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器,按照Sun Microsystems提供的技术规范,实现了对Servlet和JavaServer Page(JSP)的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全域管理和Tomcat阀等。由于Tomcat本身也内含了一个HTTP服务器,它也可以被视作一个单独的Web服务器。

  • Java程序开发流程
    开发人员windows主机--jdk--开发工具--开发代码--开发程序
    后缀是.java的代码文件--java命令来编译(jdk提供的,环境)--.class文件---
    刚才.java文件和.class文件 后端文件
    被用户所访问的是前端文件.jsp文件(html文件)--调用后端的.class文件--
    开发人员呈献给运维人员的文件.jsp和.class文件
    运维人员将上述文件传到tomcat服务器
    客户端http协议访问--.jsp文件
    .jar包(由来:是由.java文件编译而来,编译的同时,将.java文件--.class文件--打包成.jar包)
    比如说在一个.jsp文件里需要使用当前系统时间十次
    输出时间的代码得写十遍--.java--.clss(十行)--十遍--一百行--麻烦
    输出时间的代码得写十遍--调用输出时间的.jar包--十次--即可
    .war包--压缩包--将开发人员最后的项目(.jsp文件、.class文件、.jar包)--打包成为.war包
    .war包--运维人员无需解压--直接传到tomcat的网站路径下--tomcat自动识别war包--自动解压

  • 便于理解:Apache和Tomcat的比较

    • 相同点

      • 两者都是Apache住址开发的
      • 两者都有HTTP服务功能
      • 两者都是免费的
    • 不同点

      • Apache是专门用了提供HTTP服务的,以及相关配置的(例如虚拟主机、URL转发等等),而Tomcat是Apache组织在符合Java EE的JSP、Servlet标准下开发的一个JSP服务器
      • Apache是一个Web服务器环境程序,启用他可以作为Web服务器使用,不过只支持静态网页。如果要在Apache环境下运行JSP的话就需要一个解释器来执行JSP网页,而这个JSP解释器就是Tomcat。
      • Apache侧重于HTTPServer ,Tomcat侧重于Servlet引擎,如果以Standalone方式运行,功能上与Apache等效,支持JSP,但对静态网页不太理想
      • Apache是Web服务器,Tomcat是应用(Java)服务器,它只是一个Servlet(JSP也翻译成Servlet)容器,可以认为是Apache的扩展,但是可以独立于Apache运行
  • Tomcat同类产品

    • Resin 服务器
      Resin是Caucho公司的产品,是一个非常流行的支持Servlet和JSP的服务器,速度非常快。Resin本身包含了一个支持HTML的Web服务器,这使它不仅可以显示动态内容,而且显示静态内容的能力也毫不逊色,因此许多网站都是使用Resin服务器构建。
    • Jetty 服务器
      Jetty是一个纯粹的基于Java的网页服务器和Java Servlet容器。尽管网页服务器通常用来为人们呈现文档,但是Jetty通常在较大的软件框架中用于计算机与计算机之间的通信。Jetty作为Eclipse基金会的一部分,是一个自由和开源项目。
    • JBoss服务器
      JBoss是一个种遵从JavaEE规范的、开放源代码的、纯Java的EJB服务器,对于J2EE有很好的支持。JBoss采用JML API实现软件模块的集成与管理,其核心服务又是提供EJB服务器,不包含Servlet和JSP的Web容器,不过它可以和Tomcat完美结合。
    • WebSphere 服务器
      WebSphere是IBM公司的产品,可进一步细分为 WebSphere Performance Pack、Cache Manager 和WebSphere Application Server等系列,其中WebSphere Application Server 是基于Java 的应用环境,可以运行于 Sun Solaris、Windows NT 等多种操作系统平台,用于建立、部署和管理Internet和Intranet Web应用程序。
    • WebLogic 服务器
      WebLogic 是ORACLE公司的产品,可进一步细分为 WebLogic Server、WebLogic Enterprise 和 WebLogic Portal 等系列,其中 WebLogic Server 的功能特别强大。WebLogic 支持企业级的、多层次的和完全分布式的Web应用,并且服务器的配置简单、界面友好。对于那些正在寻求能够提供Java平台所拥有的一切应用服务器的用户来说,WebLogic是一个十分理想的选择。

二、Tomcat与jdk的关系


解析:
JDK是开发人员开发使用,jre是用来运行java程序,就是java程序的运行环境,jvm是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行;
JDK中包含JRE,在JDK的安装目录下有一个名为jre的目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre。jdk是java语言编写的,用来给java程序调用的,jvm因为与平台进行交互,是用c/c++和汇编语言编写的;
jdk是java运行和编译的,tomcat是web项目的运行容器,java没有jdk没办法编译运行,java运行必须依赖jdk的环境,所以安装tomcat前必须要安装jdk环境;

注解:
1. Java SE(Java Platform,Standard Edition):Java SE 是做电脑上运行的软件;
2. Java EE(Java Platform,Enterprise Edition):Java EE 是用来做网站的(我们常见的JSP技术);
3. Java ME(Java Platform,Micro Edition):Java ME 是做手机软件的;
  • 对应关系

三、Tomcat内部工作原理

  • tomcat整体架构

  • 组件关系

    • Tomcat 的心脏是两个组件:Connector 和 Container,Connector 组件是可以被替换,这样显得更加灵活,一个 Container 可以选择对应多个 Connector。多个 Connector 和一个 Container 就形成了一个 Service,有了 Service 就可以对外提供服务了,但是 Service 还要一个生存的环境,必须要有人能够给她生命、掌握其生死大权,那就非 Server 莫属了。所以整个 Tomcat 的生命周期由 Server 控制。
    • 我们将 Tomcat 中 Connector、Container 作为一个整体比作一对情侣的话,Connector 主要负责对外交流,可以比作为 Boy,Container 主要处理 Connector 接受的请求,主要是处理内部事务,可以比作为 Girl。那么这个 Service 就是连接这对男女的结婚证了。是Service 将它们连接在一起,共同组成一个家庭。当然要组成一个家庭还要很多其它的元素说白了,Service 只是在 Connector 和 Container 外面多包一层,把它们组装在一起,向外面提供服务,一个 Service 可以设置多个 Connector,但是只能有一个 Container 容器。
  • Container组件详解

    • Engine:负责处理所有请求,处理后,将结果返回给service,而connector是作为service与engine的中间媒介出现的。 作为交流者;一个engine下可以配置一个默认主机,每个虚拟主机都有一个域名。当engine获得一个请求时,它把该请求匹配到虚拟主机host上,然后把请求交给该主机来处理。 Engine有一个默认主机,当请求无法匹配到任何一个虚拟主机时,将交给默认host来处理。Engine以线程的方式启动Host。
    • Host:代表一个虚拟主机,每个虚拟主机和某个网络域名(Domain Name)相匹配。 每个虚拟主机下都可以部署一个或多个web应用,每个web应用对应于一个context,有一个context path。 当Host获得一个请求时,将把该请求匹配到某个Context上;
      -Wrapper: 代表一个 Servlet,它负责管理一个 Servlet,包括的 Servlet 的装载、初始化、执行以及资源回收。Wrapper 是最底层的容器,它没有子容器了;

四、Tomcat配置文件详解


tomcat配置文件

server.xml: Tomcat的主配置文件,包含Service, Connector, Engine, Realm, Valve, Hosts主组件的相关配置信息;
web.xml:遵循Servlet规范标准的配置文件,用于配置servlet,并为所有的Web应用程序提供包括MIME映射等默认配置信息;
tomcat-user.xml:Realm认证时用到的相关角色、用户和密码等信息;Tomcat自带的manager默认情况下会用到此文件;在Tomcat中添加/删除用户,为用户  指定角色等将通过编辑此文件实现;
catalina.policy:Java相关的安全策略配置文件,在系统资源级别上提供访问控制的能力;
catalina.properties:Tomcat内部package的定义及访问相关控制,也包括对通过类装载器装载的内容的控制;Tomcat在启动时会事先读取此文件的相关设置;
logging.properties: Tomcat6通过自己内部实现的JAVA日志记录器来记录操作相关的日志,此文件即为日志记录器相关的配置信息,可以用来定义日志记录的组  件级别以及日志文件的存在位置等;
context.xml:所有host的默认配置信息;



tomcat中支持两种协议的连接器:HTTP/1.1与AJP/1.3
HTTP/1.1协议负责建立HTTP连接,web应用通过浏览器访问tomcat服务器用的就是这个连接器,默认监听的是8080端口;
AJP/1.3协议负责和其他HTTP服务器建立连接,监听的是8009端口,比如tomcat和apache或者iis集成时需要用到这个连接器。

五、Tomcat安装

系统类型 IP 主机名 所需软件
centos7.8 192.168.100.101 localhost apache-tomcat-9.0.10.tar.gz、 jdk-8u171-linux-x64.tar.gz
  • 安装jdk,部署java环境
[root@localhost ~]# tar xf jdk-8u171-linux-x64.tar.gz 
[root@localhost ~]# mv jdk1.8.0_171/ /usr/local/java
[root@localhost ~]# ls /usr/local/java
bin  COPYRIGHT  db  include  javafx-src.zip  jre  lib  LICENSE  man  README.html  release  src.zip  THIRDPARTYLICENSEREADME-JAVAFX.txt  THIRDPARTYLICENSEREADME.txt
  • 安装tomcat
[root@localhost ~]# tar xf apache-tomcat-9.0.10.tar.gz 
[root@localhost ~]# mv apache-tomcat-9.0.10 /usr/local/tomcat
[root@localhost ~]# ls /usr/local/tomcat
bin  conf  lib  LICENSE  logs  NOTICE  RELEASE-NOTES  RUNNING.txt  temp  webapps  work
[root@localhost ~]# vi /usr/local/tomcat/bin/catalina.sh
#!/bin/sh
JAVA_OPTS="-Xms512m -Xmx1024m -Xss1024K -XX:PermSize=512m -XX:MaxPermSize=1024m"
export CATALINA_HOME=/usr/local/tomcat
export JRE_HOME=/usr/local/java/jre
export JAVA_HOME=/usr/local/java/jdk1.8.0_171
export TOMCAT_HOME=/usr/local/tomcat
[root@localhost ~]# /usr/local/tomcat/bin/startup.sh 
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/java
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@localhost bin]# netstat -utpln |grep 80
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      1617/java           
tcp        0      0 127.0.0.1:8005          0.0.0.0:*               LISTEN      1617/java           
tcp        0      0 0.0.0.0:8009            0.0.0.0:*               LISTEN      1617/java

  • 自定义jsp页面,并测试访问
[root@localhost bin]# mkdir  -p /web/webapp/
[root@localhost bin]#  vi /web/webapp/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
  <head>
     <title>JSP TEST PAGE1 </title>
  </head>
  <body>
     <% out.println("Welcome to test site;http://www.linux1.com");%>
  </body>
</html>
[root@localhost bin]# vi  /usr/local/tomcat/conf/server.xml
 148       <Host name="localhost"  appBase="webapps"
 149             unpackWARs="true" autoDeploy="true">
 150         <Context docBase="/web/webapp" path="" reloadable="false"></Context>

注解:             
unpackWARs="true"                   ##设置自动识别war包
autoDeploy="true"                       ##开启自动部署
Context docBase="/web/webapp"       ##设置项目存放位置
path=""                                 ## tomcat把web应用程序映射为root URI路径reloadable="true"                     ## tomcat服务器在运行状态下会监视在WEB-INF/classes和WEB-INF/lib目录下class文件的改动,如果监测到代码中有class文件被更新的,服务器会自动重新加载Web应用,但是开启会加重服务器负荷,建议设置为false选项为关闭,有可能会出现内存溢出,tomcat服务不正常等异常,建议还是false掉,更新完代码脚本重启tomcat才是王道。;

[root@localhost bin]# /usr/local/tomcat/bin/shutdown.sh
[root@localhost bin]# /usr/local/tomcat/bin/startup.sh


李泽信 发布于 2022-8-22 21:11

个人资料

搜索

日历

时间进度

    今日剩余 59.6%
    本周剩余 37.1%
    本月剩余 22.0%
    本年剩余 52.2%

访问统计