• tomcat的部署以及优化


    tomcat的介绍

    Tomcat的简介 

      Tomcat 是 Java 语言开发的,Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,是 Apache 软件基金会的 Jakarta 项目中的一个核心项目,由 Apache、Sun 和其他一些公司及个人共同开发而成。


    Tomcat 属于轻量级应用服务器,在中小型系统和并发访问用户(据了解tomcat的并发量处理能力是nginx的六分之一)不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选。一般来说,Tomcat 虽然和 Apache 或者 Nginx 这些 Web 服务器一样,具有处理 HTML 页面的功能,然而由于其处理静态 HTML 的能力远不及 Apache 或者 Nginx,所以 Tomcat 通常是作为一个 Servlet 和 JSP 容器,单独运行在后端。
     

     tomcat的功能

    1.处理动态页面(http的请求)

    2.处理后端请求(调用数据库服务器)

    3.易部署:tomcat会自动部署配置文件,自动部署允许

    4.轻量级的服务软件,处理中小架构的网站可以满足,大型的交互需求,tomcat就不太行了。(python node,js容器化来处理。在容器化部署的项目架构中是不是要tomcat的,都是用jar包直接运行,包括k8s)

    tomcat的核心组件

    1.web容器:完成web功能 处理请求也是Nginx转发的http(s)请求,处理动态页面(java代理编译的页面)

    处理后端的请求(转发到数据库的请求)

    2.servlet:Catalina 是整个tomcat处理的底层逻辑。处理web请求的动态页面,也处理后端请求(数据库)

    3.jsp:jsp会把动态翻译成serlvet的代码。用编译后的规则,显示代码的静态页面

    静态页面:html

    动态页面:php index.php

    jsp index.jsp ---- Java格式写成的代码,靠jsp翻译,servlet执行编译后的代码,最后展示结果

    servlet主要作用:

    1.处理http请求

    2.生成动态内容与客户端之间的交互 前端交互 后端数据库服务器交互 和redis缓存交互。

    3.会话管理:处理用户会话,跟踪用户在不同请求之间的状态。servlet可以在用户访问不同页面时,保持用户的状态信息(购物车同步等)

    JSP:java server pages 动态网页的开发技术,使用jsp的标签在HTML的网页中插入Java代码。以 <% 开头,以%> 结尾

    实现Java web应用程序的访问界面。用户界面,或者访问数据库,生成页面内容。

    tomcat的核心功能

    功能部分由两块组成:

    1.接受和响应外部请求的连接器 connector 默认端口8080。

    2.负载处理请求的 container

    其中连接器和容器相辅相成,一起构成了基本的 web 服务 Service。每个 Tomcat 服务器可以管理多个 Service

    Service:对外提供的 Web 服务。主要包含 Connector 和 Container 两个核心组件,以及其他功能组件。Tomcat 可以管理多个 Service,且各 Service 之间相互独立。  

    Connector:负责对外接收和响应请求。它是Tomcat与外界的交通枢纽,监听端口接收外界请求,并将请求处理后传递给容器做业务处理,最后将容器处理后的结果响应给外界。


    Container:负责对内处理业务逻辑。其内部由 Engine、Host、Context和Wrapper 四个容器组成,用于管理和调用 Servlet 相关逻辑。

    Container 结构分析:
    每个 Service 会包含一个 Container 容器。在 Container 内部包含了 4 个子容器,4个子容器的作用分别是:

    1.   engine 引擎:管理多个虚拟主机,一个tomcat里面只有一个engine

    2.   host:代表站点,也就是虚拟主机,一个engine可以有多个host

    3.   context :一个context执行一个web应用。

    4.   wrapper:最底层,处理和编译代码,运行结果。

     Engine、Host、Context 和 Wrapper这四个容器之间属于层层递进的父子关系

    容器   通常指的是一种虚拟化的技术,允许在当前的操作系统当中虚拟化的运行多个独立的环境。独立运行的环境就是我们说的容器。彼此之间相互隔离,拥有自己的一套系统。宿主,容器寄生在宿主上,实际使用的是宿主的资源。

    tomcat的部署

    JDK介绍

    开发工具包,开发Java的应用程序,jdk包括:编译器,调试器等

    开发者用来用来创建,编译 运行 Java程序的重要组件

    安装环境JDK

    1. 将安装包拖入/opt
    2. rmp -ivh jdk-8u201-linux-x64.rpm
    3. //看后缀名
    4. java -version
    5. //查看版本
    6. vim /etc/profile.d/java.sh
    7. export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
    8. #设置java_home的环境变量,指向JDK,也就是Java的工作目录
    9. export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
    10. #指定Java类的搜索路径
    11. export PATH=$JAVA_HOME/bin:$PATH
    12. #把Java的可执行文件添加到系统的环境变量当中
    13. [root@hj opt]# source /etc/profile.d/java.sh
    14. //刷新
    15. [root@hj opt]# java -version
    16. java version "1.8.0_201"
    17. Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
    18. Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
    19. [root@hj opt]# vim /etc/profile.d/java.sh
    20. [root@hj opt]#

    安装tomcat

    1. [root@hj opt]# tar -xf apache-tomcat-9.0.16.tar.gz
    2. [root@hj opt]# ls
    3. apache-tomcat-9.0.16.tar.gz apache-tomcat-9.0.16
    4. jdk-8u201-linux-x64.rpm
    5. [root@hj opt]# mv apache-tomcat-9.0.16 /usr/local/tomcat
    6. [root@hj opt]# ls
    7. apache-tomcat-9.0.16.tar.gz jdk-8u201-linux-x64.rpm
    8. [root@hj opt]# cd /usr/local/tomcat
    9. [root@hj tomcat]#

    tomcat的主要目录

    bin:存放启动或者关闭tomcat的脚本文件 startup.sh shoutdown.sh

    conf 存放配置文件 server.xml就是 tomcat的主配置文件

    webapps:tomcat默认的web应用的部署是目录

    work:tomcat的工作目录,存放 JSP编译之后产生的class文件,清理缓存会用到

    tomcat配置虚拟主机

    tomcat配置虚拟主机的作用

    在公司当中会运行多个项目,一台部署tomcat太多会浪费资源,所以会在tomcat中配置多个主机

    以此来节约资源,提高性能

    首先关闭防火墙和sylinux机制

    1. systemctl stop firewalld
    2. setenforce 0

    配置工作目录

    1. cd /usr/local/tomcat/webapps
    2. mkdir kfc bennet
    3. cd kfc
    4. vim index.jsp
    5. this is kfc\!
    6. wq!
    7. //工作目录配置完毕(bennet同理)
    8. cd /usr/local/tomcat/conf
    9. vim server.xml
    10. 148删除
    11. 在末尾添加配置
    12. <Host name="www.kfc.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
    13. <Context docBase="/usr/local/tomcat/webapps/kfc" path="" reloadable="true" />
    14. docBase="/usr/local/tomcat/webapps/kfc">
    15. <Host name="www.benet.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
    16. <Context docBase="/usr/local/tomcat/webapps/benet" path="" reloadable="true" />
    1. <Host name="www.kfc.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
    2. Host name="www.kgc.com"
    3. //指定站点(虚拟机的域名)
    4. appBase="webapps"
    5. //站点工作目录在webapps存放web应用目录
    6. unpackWARs="true"
    7. //启动webapps,对war包进行展开
    8. autoDeploy="true"
    9. //放置在应用目录的程序文件会自动进行部署。
    10. xmlValidation="false"
    11. //是否验证xml文件执行的有效性标准
    12. xmlNamespaceAware="false"
    13. //是否启用xml的命令
    14. <Context docBase="/usr/local/tomcat/webapps/kfc" path="" reloadable="true" />
    15. //web应用程序的具体部署位置,也就是context所属的host中的具体的工作目录。
    16. path=""
    17. //这里为空,默认就是webapps
    18. reloadable="true"
    19. //允许重新加载,context相关的web应用程序的类

    因为涉及到域名,所以一定要做端口映射

    echo "20.0.0.10 www.kfc.com www.bennet.com" >> /etc/hosts
    1. cd /usr/local/tomcat/bin
    2. ./shutdown.sh
    3. ./startup.sh
    4. 启动服务

    启动之后一定要检查端口

    netstat -antp | grep 8080

    一切配置完毕即可访问:    20.0.0.10:8080

    tomcat 的优化

    tomcat优化的目的:

    默认配置并不适合生产环境,会频繁出现假死。

    需要通过压力测试,不断优化,提高稳定。

    tomcat优化的三个方面:

    1.配置文件优化

    1. vim server.xml
    2. <Connector .......>
    3. maxThread="200"
    4. //tomcat使用线程来处理接受的每个请求,可以创建的最大线程数,支持的最大并发连接数200
    5. minSpareThreads
    6. //最小空闲线程数,tomcat启动时的初始化的线程数,表示没人请求,也要打开这些空的线程等待请求10
    7. maxSpareThreads
    8. //最大备用线程数,创建线程超过这个值,tomcat会关闭不再需要线程,默认是-1
    9. connectionTimeout 网络连接超时,设置为20000毫秒
    10. enableLookups="flase"
    11. //是否反向解析域名。不解析,提高处理效率
    12. disableUploadTimeout="true"
    13. //上传文件时,是否启用超时限制
    14. connectionUploadTimeout="15000"
    15. //上传下载要耗时,根据需求自定义。
    16. acceptCount="100"
    17. //如果所有的可以使用的线程都被占用,可以传入的队列长度的最大值
    18. compression="on" off force # 所有情况下都进行压缩 on 压缩之后的页面可以减少三分之一
    19. //是否对响应的数据进行gzip压缩
    20. noCompressionUserAgents="gozilla chrom"
    21. //对指定访问的浏览器不进行压缩
    22. />

    2.jvm优化

    1. JAVA_OPTS="$JAVA_OPTS -server -Xms2048m -Xmx2048m -Xmn768m -XX:ParallelGCThreads=2 -XX:PermSize=1024m -XX:MaxPermSize=1024m -Djava.awt.headless=true -XX:+DisableExplicitGC"
    2. cygwin=false
    3. -Xms2048m:
    4. //Java初始化堆的大小,是分配jvm的最小内存,cpu性能搞,可以值设置高些
    5. -Xmx2048m
    6. //最大Java堆的大小,是分配jvm的最大内存,取决于物理内存有多大。建议和-xms和-xmx的值,设置成一样,推荐是你的物理内存的一半
    7. 目的:Java的垃圾回收机制清理完堆区之后,不需要重新分隔计算堆区的大小。
    8. -Xmn768m
    9. //新生代内存的大小,官方推荐整个堆的3/8
    10. 新生代:Java中每创建一个新的对象,占用的内存就是新生代
    11. 中生代:对象创建完毕之后,占用的内存就是中生代
    12. 老年代:Java垃圾回收机制进行资源回收之后,中生代剩余部分,老是老年代
    13. -XX:ParallelGCThreads=2
    14. //配置并行收集器的线程数,有多少个线程一起进行垃圾回收,官方推荐:与cpu数量相同
    15. -XX:PermSize=1024m
    16. //设置非堆内存的初始值,持久代内存的大小,一般设置为物理内存的1/4;
    17. -XX:MaxPermSize=1024m
    18. //最大非堆内存的大小,持久代内存的最大值,一般设置为物理内存的1/4
    19. -Djava.awt.headless=true
    20. //避免在Linux环境下,网页不能正常显示图片
    21. -XX:+DisableExplicitGC
    22. //禁止调用system.gc(),误调用了gc方法,会导致整个jvm响应速度变慢

    3.操作系统优化(内核优化)

    1. vim /etc/security/limits.conf
    2. # 65535 为Linux系统最大打开文件数
    3. * soft nproc 65535
    4. * hard nproc 65535
    5. * soft nofile 65535
    6. * hard nofile 65535

    其他调试内核参数的查看: sysctl -a

    1. kernel.sysrq = 0: 禁用了内核的SysRq功能,SysRq允许在系统崩溃或出现问题时执行一些调试操作。
    2. kernel.core_uses_pid = 1: 设置核心转储文件名中包含进程ID,有助于标识是哪个进程导致了核心转储。
    3. kernel.msgmnb 和 kernel.msgmax: 增加IPC消息队列的默认和最大大小,用于进程间通信。
    4. kernel.shmmax 和 kernel.shmall: 调整共享内存的最大大小和分配页面数。
    5. net.ipv4.ip_forward = 0: 禁用IP数据包的转发功能,通常用于不充当路由器的系统。
    6. net.ipv4.conf.default.rp_filter 和 net.ipv4.conf.all.rp_filter: 控制反向路径过滤,提高网络安全性。
    7. net.ipv4.icmp_echo_ignore_all: 允许或禁止系统响应ping请求。
    8. net.ipv4.icmp_echo_ignore_broadcasts: 禁止系统对广播和多播地址的ICMP回显和时间戳请求作出响应。
    9. net.ipv4.conf.default.accept_source_route: 不接受源路由,增加网络安全性。
    10. net.ipv4.tcp_syncookies = 1: 启用SYN Cookies,保护系统免受TCP SYN 攻击。
    11. net.ipv4.tcp_max_tw_buckets = 6000: 设置允许的TIME_WAIT套接字最大数量,避免服务器性能下降。
    12. net.ipv4.tcp_sack = 1: 启用有选择的应答(SACK)来提高TCP性能。
    13. net.ipv4.tcp_window_scaling = 1: 启用TCP窗口缩放功能,允许大窗口的TCP传输。
    14. net.ipv4.tcp_rmem, net.ipv4.tcp_wmem: 调整TCP套接字读取和写入缓冲区大小。
    15. net.ipv4.tcp_mem: 设置TCP缓冲区的最小、默认和最大值。
    16. net.core.wmem_default, net.core.rmem_default, net.core.rmem_max, net.core.wmem_max: 调整网络核心
    17. 缓冲区的大小。
    18. net.core.netdev_max_backlog: 控制网络接口接收数据包的排队队列大小。
    19. net.ipv4.tcp_max_orphans: 设置系统允许的孤立TCP连接最大数量。
    20. net.ipv4.tcp_max_syn_backlog: 控制系统允许的三次握手队列长度。
    21. net.ipv4.tcp_synack_retries 和 net.ipv4.tcp_syn_retries: 设置SYN-ACK和SYN请求的重试次数。
    22. net.ipv4.tcp_tw_recycle 和 net.ipv4.tcp_tw_reuse: 启用TIME_WAIT套接字快速回收和重用。
    23. net.ipv4.tcp_fin_timeout: 设置TCP连接FIN(关闭连接)的超时时间。
    24. net.ipv4.tcp_keepalive_time: 设置TCP keepalive探测包发送频率,以检测连接状态。
    25. net.ipv4.ip_local_port_range: 设置本地端口范围,用于分配本地应用程序端口。
    26. net.ipv6.conf.all.disable_ipv6 和 net.ipv6.conf.default.disable_ipv6: 禁用IPv6。
    27. net.netfilter.nf_conntrack_max 和其他 net.netfilter.nf_conntrack_*: 控制连接跟踪和防火墙相关设置。
    28. net.nf_conntrack_max: 设置最大连接跟踪项数。
    29. vm.overcommit_memory = 0: 控制内存超额分配策略,避免OOM killer杀掉进程。
    30. vm.swappiness = 0: 设置内存交换行为,降低内存交换。
    31. fs.file-max = 999999: 设置进程可以同时打开的最大文件句柄数。
    32. net.ipv4.tcp_max_tw_buckets = 6000: 设置操作系统允许的TIME_WAIT套接字最大数量。
    33. net.ipv4.ip_local_port_range = 1024 65000: 设置系统允许的本地端口范围。
    34. net.ipv4.tcp_tw_recycle = 1: 启用TIME_WAIT套接字快速回收。
    35. net.ipv4.tcp_tw_reuse = 1: 允许TIME-WAIT套接字重用。
    36. net.ipv4.tcp_syncookies = 1: 启用SYN Cookies,防止TCP SYN 攻击。
    37. net.core.somaxconn = 40960: 设置最大监听队列长度,用于控制最大并发连接数。
    38. net.core.netdev_max_backlog = 262144: 设置每个网络接口接收数据包队列的最大大小。
    39. net.ipv4.tcp_max_syn_backlog = 262144: 设置接受SYN请求队列的最大长度。
    40. net.ipv4.tcp_rmem, net.ipv4.tcp_wmem: 设置TCP套接字读取和写入缓冲区的最小、默认和最大大小。
    41. net.core.rmem_default, net.core.wmem_default, net.core.rmem_max, net.core.wmem_max: 设置内核套接字接收和
    42. 发送缓冲区大小。
    43. net.ipv4.tcp_syncookies = 1: 设置启用SYN Cookies,用于解决TCP SYN 攻击。

    如何查看tomcat 的server status

    1. cd META-INF
    2. vim context.xml

    1. cd /usr/local/tomcat/conf
    2. vim tomcat-users.xml

    1. ./shutdown.sh
    2. ./startup.up
    3. netstat -antp | grep 8080

    浏览器访问: 20.0.0.10:8080

    即可访问

  • 相关阅读:
    项目部署shell脚本
    Java测试框架:分享常用的Java测试框架,如JUnit, TestNG等,包括单元测试,集成测试,性能测试等
    10、集合类不安全(list不安全解决(CopyOnWriteArrayList))
    数据库应用:CentOS 7离线安装PostgreSQL
    Java数据审计工具:Envers and JaVers比较
    CSS层叠是什么意思?(v1)
    ffmpeg音频重采样
    《玩转Git三剑客》
    网络编程:socket的阻塞模式和非阻塞模式
    尼得科电机的强大性能,将列车门和屏蔽门的开合变得从容而安全
  • 原文地址:https://blog.csdn.net/qq_51506982/article/details/133887270