Java体系
- Java编程语言
- Java类文件:java类文件为java编译后的文件
- JavaAPI:java类文件库
- JavaVM(JVM)
- class loader:编译和类库文件加载器
- 执行引擎
JRE(Java Runtime Enviroment):
是Java的运行环境。面向Java程序的使用者,而不是开发者。如果你仅下载并安装了JRE,那么你的系统只能运行Java程序。JRE是运行Java程序所必须环境的集合,包含JVM标准实现及 Java核心类库。它包括Java虚拟机、Java平台核心类和支持文件。它不包含开发工具(编译器、调试器等)。
JDK(Java Development Kit):
又称J2SDK(Java2 Software Development Kit),是Java开发工具包,它提供了Java的开发环境(提供了编译器javac等工具,用于将java文件编译为class文件)和运行环境(提 供了JVM和Runtime辅助包,用于解析class文件使其得到运行)。如果你下载并安装了JDK,那么你不仅可以开发Java程序,也同时拥有了运 行Java程序的平台。JDK是整个Java的核心,包括了Java运行环境(JRE),一堆Java工具tools.jar和Java标准类库 (rt.jar)。
运行jsp的web容器
jsp技术将java代码嵌入html文件中,建立了一种动态网页的编写标准,它的技术基础是serverlet技术,当用户请求一个jsp文件时,jsp会将代码转换成serverlet(即标准的java代码),java代码再交由低层的jdk执行。常见的容器有websphere,weblogic,tomcat。
tomcat简介
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。目前Tomcat最新版本为10.0。
tomcat就是中间件之一,tomcat本身是一个容器,专门用来运行java程序,java语言开发的网页.jsp就应该运行于tomcat中。而tomcat本身的运行也依赖于jdk环境。
tomcat应用场景:lnmt
tomcat部署
tomcat官网: http://tomcat.apache.org/
Tomcat目录结构
目录 | 含义 |
---|---|
conf/ | tomcat配置文件 |
.. | server.xml 主配置文件 |
.. | web.xml 补充额外功能 |
.. | tomcat-user.xml tomcat管理端配置文件 用户名 密码 |
logs | 日志 |
.. | catalina.out tomcat最全日志 查看error startup时间 |
.. | catalina.data.log catalina.out切割日志 |
.. | localhost_access_log_data.txt tomcat访问日志 |
webapps | tomcat站点目录 |
配置jdk
[root@localhost ~]# tar -xzvf jdk-8u281-linux-x64.tar.gz -C /usr/local/ [root@localhost ~]# vim /etc/profile ....................... ..................... export JAVA_HOME=/usr/local/jdk1.8.0_281/ export JRE_HOME=/usr/local/jdk1.8.0_281/jre export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib export TOMCAT8080_HOME=/usr/local/tomcat
解压缩tomcat
[root@loclhost ~]# tar -zxvf apache-tomcat-8.5.65.tar.gz -C /usr/local/ [root@localhost ~]# ln -s /usr/local/apache-tomcat-8.5.65 /usr/local/tomcat
放行端口
firewall-cmd --zone=public --add-port=8080/tcp --permanent firewall-cmd --reload
写一个hello world的java测试页面
[root@localhost ~]# mkdir /usr/local/tomcat/webapps/test [root@localhost ~]# vim /usr/local/tomcat/webapps/test/index.jsp <html> <head> <title>test page</title> </head> <body> <% out.println("Hello World"); %> </body> </html>
启动服务
[root@localhost tomcat]# /usr/local/tomcat/bin/startup.sh
测试访问
[root@localhost ~] curl 192.168.248.40:8080/test/ hello world
Tomcat管理端
- 搭建与测试的时候开启管理端 开启管理端
- 生产环境 关闭管理端
开启管理端
# 8.0这样配置就完成了 # 8.5之后管理跟严格了 # 要配置tomcat-user.xml之外 # 还限制只能再本地使访问管理 [root@localhost ~]# cd /usr/local/tomcat/ [root@localhost tomcat]# vim conf/tomcat-users.xml .............. ............. <role rolename="manager-gui"/> <role rolename="admin-gui"/> <user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/> .................
解除本地限制
[root@localhost tomcat]# find -type f -name "*.xml" | xargs grep '127' ./webapps/host-manager/META-INF/context.xml: allow="127.d+.d+.d+|::1|0:0:0:0:0:0:0:1" /> ./webapps/host-manager/WEB-INF/manager.xml: allow="127.d+.d+.d+|::1|0:0:0:0:0:0:0:1" /> ./webapps/manager/META-INF/context.xml: allow="127.d+.d+.d+|::1|0:0:0:0:0:0:0:1" /> [root@localhost tomcat]# sed -i.bak 's#127#\d+#g' ./webapps/host-manager/META-INF/context.xml ./webapps/manager/META-INF/context.xml [root@localhost tomcat]# /usr/local/tomcat/bin/shutdown.sh [root@localhost tomcat]# /usr/local/tomcat/bin/startup.sh
tomcat 多实例
在一台服务器上运行多个tomcat
注意事项: 端口与路径不同
root@localhost ~]# tar xf apache-tomcat-8.5.65.tar.gz [root@localhost ~]# cp -r apache-tomcat-8.5.65 /usr/local/tomcat8081 [root@localhost ~]# cp -r apache-tomcat-8.5.65 /usr/local/tomcat8082 [root@localhost ~]# cd /usr/local/ [root@localhost local]# sed -i.bak 's#8080#8081#g' tomcat8081/conf/server.xml [root@localhost local]# sed -i.bak 's#8005#8006#g' tomcat8081/conf/server.xml [root@localhost local]# sed -i.bak 's#8009#8010#g' tomcat8081/conf/server.xml [root@localhost local]# sed -i.bak 's#8080#8082#g' tomcat8082/conf/server.xml [root@localhost local]# sed -i.bak 's#8005#8007#g' tomcat8082/conf/server.xml [root@localhost local]# sed -i.bak 's#8009#8011#g' tomcat8082/conf/server.xml #启动服务 [root@localhost local]# tomcat8081/bin/startup.sh [root@localhost local]# tomcat8082/bin/startup.sh #检测是否启动 [root@localhost local]# ss -lntup| grep java tcp LISTEN 0 1 [::ffff:127.0.0.1]:8005 [::]:* users:(("java",pid=2193,fd=69)) tcp LISTEN 0 1 [::ffff:127.0.0.1]:8006 [::]:* users:(("java",pid=12271,fd=69)) tcp LISTEN 0 1 [::ffff:127.0.0.1]:8007 [::]:* users:(("java",pid=12311,fd=69)) tcp LISTEN 0 100 [::]:8080 [::]:* users:(("java",pid=2193,fd=55)) tcp LISTEN 0 100 [::]:8081 [::]:* users:(("java",pid=12271,fd=55)) tcp LISTEN 0 100 [::]:8082 [::]:* users:(("java",pid=12311,fd=55)) #防火墙放行 [root@localhost local]# firewall-cmd --zone=public --add-port=8081/tcp --permanent [root@localhost local]# firewall-cmd --zone=public --add-port=8082/tcp --permanent [root@localhost local]# firewall-cmd --reload #网页访问
tomcat 3种工作模式
模式 | header 2 | ||
---|---|---|---|
bio | blocking io | tomcat 7及之前使用,同步模型、阻塞 | 一个线程处理一个进程,缺点:并发高式,线程数较多,浪费资源 |
nio | now ip | tomcat 8及以后,异步非阻塞 | nio1(默认的) nio2可以通过少量的线程处理大量的请求 |
apr | Apache Portable Rutime | tomcat对静态文件的处理性能。 tomcat apr在tomcat上运行高并发应用的首选 |
bio(blocking I/O),阻塞式I/O操作,表示Tomcat使用的是传统的Java I/O操作(即java.io包及其子包),对于每一个请求都要创建一个线程来进行处理,所以开销较大不适合处理高并发的场景。
nio基于缓冲区、并能提供非阻塞I/O操作的Java API实现,比传统的I/O处理方式(bio)有更高的并发运行性能
apr(Apache Portable Runtime/Apache可移植运行库)是Apache HTTP服务器的支持库。从操作系统级别解决异步I/O问题,大幅度提高服务器的并发处理性能,也是Tomcat生产环境运行的首选方式。要tomcat支持apr,必须安装apr和native,这样tomcat才可以利用apache的apr接口,使用操作系统的部分本地操作,从而提升性能。
nio2模式
#配置server.xml文件 <Connector port="8081" protocol="org.apache.coyote.http11.Http11Nio2Protocol" connectionTimeout="20000" redirectPort="8443" /> #apr模式需要一些插件 [root@localhost tomcat8081]# yum -y install apr apr-devel tomcat-native #修改server.xml文件 <Connector port="8081" protocol="org.apache.coyote.http11.Http11AprProtocol" connectionTimeout="20000" redirectPort="8443" /> #centos8中 yum源中没有tomcat-native 需要编译安装,默认在下载的tomcat里的bin目录带的有该项目的tar包
开启tomcat远程监控
#修改 tomcat/bin/catalina.sh #CATALINA_OPTS java内置变量 修改Java启动参数(tomcat) CATALINA_OPTS #java启动参数 CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.mam=nagement.jmxremote #开启tomcat远程监控功能 -Dcom.sun.mam=nagement.jmxremote.port=12345 #指定端口 ,还会生产两个随机端口 -Dcom.sun.mam=nagement.jmxremote.authenticate=false #是否开启认证 -Dcom.sun.mam=nagement.jmxremote.ssl=false #是否开启https -Djava.rmi.server.hostname=192.168.248.20" #服务器IP,生产环境使用内网 [root@localhost tomcat]# sed -n "2p" bin/catalina.sh CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1111 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=192.168.248.40 #重启服务
Tomcat优化
- 安全优化
- 性能优化
- server.xml
- catalina.sh
安全优化
server.xml文件
降权启动(强制)
# 在普通用户下运行和维护tomcat,降权启动/监牢模式 [root@localhost tomcat]# useradd tomcat [root@localhost tomcat]# chown -R tomcat.tomcat /usr/local/tomcat [root@localhost local]# su - tomcat [tomcat@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/jdk1.8.0_281/jre Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar Using CATALINA_OPTS: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1111 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=192.168.248.40 Tomcat started. [tomcat@localhost ~]$ ss -lntup|grep java tcp LISTEN 0 50 [::]:1111 [::]:* users:(("java",pid=2040,fd=21)) tcp LISTEN 0 50 [::]:41783 [::]:* users:(("java",pid=2040,fd=20)) tcp LISTEN 0 50 [::]:35996 [::]:* users:(("java",pid=2040,fd=22)) tcp LISTEN 0 100 [::]:8080 [::]:* users:(("java",pid=2040,fd=59 #通过普通用户自启 vim /etc/rc.local su - 用户 -c "/usr/local/tomcat/bin/startup.sh"
注意事项 1-1024之间是特权端口,只能root使用
文件列表访问控制(强制),默认展示站点目录下所有内容
nginx 网站文件列表功能 autoindex on: tomcat 关闭 conf/web.xml文件中 .......................... <init-param> <param-name>listings</param-name> <param-value>false</param-value> </init-param> ............................
版本信息隐藏
#第一种 cd /usr/local/tomcat/lib unzip catalina.jar vim org/apache/catalina/util/ServerInfo.properties server.info=Apache Tomcat server.number=0.0.0.0 server.built=Nov 7 2018 10:05:27 UTC jar uvf catalina.jar org/apache/catalina/util/ServerInfo.properties cd /usr/local/tomcat/lib/ #第二种,添加报错页面 vim conf/web.xml <error-page> <error-code>403</error-code> <location>/403.jsp</location> </error-page> <error-page> <error-code>404</error-code> <location>/404.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/500.jsp</location> </error-page>
Server header重写
conf/server.xml <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" server="nginx/1.26.1" #添加此行 redirectPort="8443" />
日志访问格式
#User-Agent 用户的浏览器 客户端 #Referer 从什么地方跳转过来 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t %s %b %{Referer}i %{User-Agent}i %D" />
tomcat性能优化
- 调优 参数数值调整方式:
- 参考值(基准) 不设置数值,通过压力参数软件,看看tomcat性能
- 增加优化参数,通用压力测试软件
压力测试工具 | |
---|---|
ab/webbench | http压力测试 |
stress | 压力测试 cpu 内存 swap..... |
jmeter | 压力测试java(tomcat) |
dd/fio | 测试磁盘性能 |
mysqlslap | 压力测试数据库(mysql) |
loadrunner | 专业测试工具 |
优化参数
maxThreads="500" #最大的线程数量 acceptCount="" #当达到最大线程数量的时候 列队长度,一版和maxThreads一致 acceptorThreadCount="2" #分为几对,一般与cpu核心一致默认是1 minSoareTherads="10" #空闲时候最小进程 enableLookups="false" #禁止DNS逆向处理,route -n/apr -n compression="true" #开启tomcat压缩功能,一般是静态资源 compressionMinSize="2048" #压缩文件最小是2048个字节 compressableMimeType="text/html,text/plain,/text/css,application/javascript,application/json,application/x-font-tty,application/x-font-otf" #压缩那些类型的文件 disableUploadTimeout="true" #上传文件的超时时间 redirectPort="8443" maxTherads: 如果操作是纯粹的计算,那么影响系统响应时间的主要限制就是cpu的运算能力,此时maxThreads应该 尽量设小,降低同一时间争抢cpu的线程个数。 如果是操作是纯粹的IO或数据库,那么响应时间的主要限制就变为等待外部资源,此时maxThreads应该尽量设置大,这样才能提高同时处理多个请求的个数
java启动参数优化
# catalina.sh文件中添加 # 设置 jvm初始内存大小和jvm最大内存大小 # -Xms jvm初始内存 # -Xmx jvm最大内存 # 一般 -Xmx是-Xms的两倍 # gc 定期清理jvm内存 #-Xlog 执行gc的日志 JAVA_OPTS='-Xms1024m -Xmx1024m -Xloggc:/var/log/tomcat.gc.log'