jdk简介
JDK的全称是Java Development Kit,是Java语言的软件开发工具包,其中包含Java虚拟机(JVM)。编写好的Java源程序经过编译可形成 Java字节码,只要安装了JDK,就可以利用JVM解释这些字节码文件,从而保证了Java的跨平台性
tomcat简介
https://tomcat.apache.org/tomcat-8.0-doc/index.html
http://www.cnblogs.com/kismetv/p/7228274.html
Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。
Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。
Tomcat和Nginx、Apache(httpd)、lighttpd等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Nginx/Apache服务器。
Java容器还有resin、weblogic等
tomcat 是单进程多线程的服务 所以对生产环境中多个U的服务器来说是非常浪费资源的, 一个进程只使用一个U,所以其他U就会空闲,解决办法是安装多个tomcat 软件(需要改启动,关闭脚本端口,配置文件默认端口),这样多个tomcat就可以跑在不同的U,服务器资源利用率就高了
- 软件准备
JDK下载
https://www.oracle.com/technetwork/java/javase/archive-139210.html
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
Tomcat下载:http://tomcat.apache.org/
https://archive.apache.org/dist/
https://archive.apache.org/
- jdk安装
/etc/profile.d/java.sh
export JAVA_HOME=/opt/jdk
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib
[root@backup application]# java -version
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)
- tomcat安装
http://tomcat.apache.org/tomcat-8.0-doc/index.html
http://tomcat.apache.org/tomcat-8.0-doc/config/
https://archive.apache.org/dist/tomcat
https://blog.csdn.net/u014231646/article/details/79482195
tar xf apache-tomcat-8.0.27.tar.gz -C /application/
ln -s /application/apache-tomcat-8.0.27 /application/tomcat
echo 'export TOMCAT_HOME=/application/tomcat'>>/etc/profile
source /etc/profile
chown -R root.root /application/jdk/ /application/tomcat/
- tomcat说明
[root@tomcat tomcat]# tree -L 1
.
├── bin #→用以启动、关闭Tomcat或者其它功能的脚本(.bat文件和.sh文件)
├── conf #→用以配置Tomcat的XML及DTD文件
├── lib #→存放web应用能访问的JAR包
├── LICENSE
├── logs #→Catalina和其它Web应用程序的日志文件
├── NOTICE
├── RELEASE-NOTES
├── RUNNING.txt
├── temp #→临时文件
├── webapps #→Web应用程序根目录
└── work #→用以产生有JSP编译出的Servlet的.java和.class文件
- 启动&停止
启动程序
/application/tomcat/bin/startup.sh
关闭程序
/application/tomcat/bin/shutdown.sh
- tomcat启动慢问题
主要原因是生成随机数的时候卡住了,导致tomcat启动不了。
是否有足够的熵来用于产生随机数,可以通过如下命令来查看
cat /proc/sys/kernel/random/entropy_avail
7
为了加速/dev/random提供随机数的速度,你可以通过操作设备的外设,让其产生大量的中断(如网络传输数据,按键,移动鼠标,在命令行敲几个不同的命令,俗称聚气。
cat /dev/random 会消耗能量
方法1:
vim $JAVA_HOME/jre/lib/security/java.security
securerandom.source=file:/dev/random
改为
securerandom.source=file:/dev/urandom
方法2:
vim $TOMCAT_HOME/bin/catalina.sh
if [[ "$JAVA_OPTS" != *-Djava.security.egd=* ]]; then
JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/urandom"
fi
这个系统属性egd表示熵收集守护进程(entropy gathering daemon)
方法3:CPU必须Intel
安装rngd服务(熵服务,增大熵池)
yum install rng-tools
启动服务
systemctl start rngd
- 查看进程端口
[root@backup bin]# ps -ef |grep java
root 1588 1 10 10:11 pts/0 00:00:04 /application/jdk/bin/java -Djava.util.logging.config.file=/application/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/application/tomcat/endorsed -classpath /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/application/tomcat -Dcatalina.home=/application/tomcat -Djava.io.tmpdir=/application/tomcat/temp org.apache.catalina.startup.Bootstrap start
root 1614 1413 0 10:11 pts/0 00:00:00 grep java
netstat -lntup |grep java
tcp 0 0 :::8009 :::* LISTEN 4079/java
tcp 0 0 ::ffff:127.0.0.1:8011 :::* LISTEN 4079/java
tcp 0 0 ::ffff:127.0.0.1:8012 :::* LISTEN 4108/java
tcp 0 0 :::8081 :::* LISTEN 4079/java
tcp 0 0 :::8082 :::* LISTEN 4108/java
- 访问
http://10.0.0.41:8080/
tomcat日志
tail -f /application/tomcat/logs/catalina.out
- tomcat配置文件
[root@tomcat conf]# ll -h
total 216K
drwxr-xr-x 3 root root 4.0K Jan 26 06:10 Catalina
-rw------- 1 root root 13K Sep 28 16:19 catalina.policy
-rw------- 1 root root 7.0K Sep 28 16:19 catalina.properties
-rw------- 1 root root 1.6K Sep 28 16:19 context.xml
-rw------- 1 root root 3.4K Sep 28 16:19 logging.properties
-rw------- 1 root root 6.4K Sep 28 16:19 server.xml #→主配置文件
-rw------- 1 root root 1.8K Sep 28 16:19 tomcat-users.xml #→Tomcat管理用户配置文件
-rw------- 1 root root 1.9K Sep 28 16:19 tomcat-users.xsd
-rw------- 1 root root 164K Sep 28 16:19 web.xml
- tomcat管理
vim /application/tomcat/conf/tomcat-users.xml
最后一行之前插入以下三行:
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/>
8.5+ 修改以下两个文件
webapps/host-manager/META-INF/context.xml
webapps/manager/META-INF/context.xml
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1"
改为
allow="\d+\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1"
- 编辑一个 jsp文件
vim /opt/tomcat1/webapps/ROOT/test.jsp
<%= new java.util.Date() %>
- 组件详解
engine:核心容器组件,catalina引擎,负责通过connector接收用户请求,并处理请求,将请求转至对应的虚拟主机host
host:类似于httpd中的虚拟主机,一般而言支持基于FQDN的虚拟主机。
context:定义一个应用程序,是一个最内层的容器类组件(不能再嵌套)。配置context的主要目的指定对应对的webapp的根目录,类似于httpd的alias,其还能为webapp指定额外的属性,如部署方式等。
connector:接收用户请求,类似于httpd的listen配置监听端口的。
service(服务):将connector关联至engine,因此一个service内部可以有多个connector,但只能有一个引擎engine。service内部有两个connector,一个engine。因此,一般情况下一个server内部只有一个service,一个service内部只有一个engine,但一个service内部可以有多个connector。
server:表示一个运行于JVM中的tomcat实例。
Valve:阀门,拦截请求并在将其转至对应的webapp前进行某种处理操作,可以用于任何容器中,比如记录日志(access log valve)、基于IP做访问控制(remote address filter valve)。
logger:日志记录器,用于记录组件内部的状态信息,可以用于除context外的任何容器中。
realm:可以用于任意容器类的组件中,关联一个用户认证库,实现认证和授权。可以关联的认证库有两种:UserDatabaseRealm、MemoryRealm和JDBCRealm。
UserDatabaseRealm:使用JNDI自定义的用户认证库。
MemoryRealm:认证信息定义在tomcat-users.xml中。
JDBCRealm:认证信息定义在数据库中,并通过JDBC连接至数据库中查找认证用户。
- 配置文件注释
<?xml version='1.0' encoding='utf-8'?>
<!--
<Server>元素代表整个容器,是Tomcat实例的顶层元素.由org.apache.catalina.Server接口来定义.它包含一个<Service>元素.并且它不能做为任何元素的子元素.
port指定Tomcat监听shutdown命令端口.终止服务器运行时,必须在Tomcat服务器所在的机器上发出shutdown命令.该属性是必须的.
shutdown指定终止Tomcat服务器运行时,发给Tomcat服务器的shutdown监听端口的字符串.该属性必须设置
-->
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<!--service服务组件-->
<Service name="Catalina">
<!--
connector:接收用户请求,类似于httpd的listen配置监听端口.
port指定服务器端要创建的端口号,并在这个端口监听来自客户端的请求。
address:指定连接器监听的地址,默认为所有地址(即0.0.0.0)
protocol连接器使用的协议,支持HTTP和AJP。AJP(Apache Jserv Protocol)专用于tomcat与apache建立通信的, 在httpd反向代理用户请求至tomcat时使用(可见Nginx反向代理时不可用AJP协议)。
minProcessors服务器启动时创建的处理请求的线程数
maxProcessors最大可以创建的处理请求的线程数
enableLookups如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址
redirectPort指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号
acceptCount指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理
connectionTimeout指定超时的时间数(以毫秒为单位)
-->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<!--engine,核心容器组件,catalina引擎,负责通过connector接收用户请求,并处理请求,将请求转至对应的虚拟主机host
defaultHost指定缺省的处理请求的主机名,它至少与其中的一个host元素的name属性值是一样的
-->
<Engine name="Catalina" defaultHost="localhost">
<!--Realm表示存放用户名,密码及role的数据库-->
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<!--
host表示一个虚拟主机
name指定主机名
appBase应用程序基本目录,即存放应用程序的目录.一般为appBase="webapps" ,相对于CATALINA_HOME而言的,也可以写绝对路径。
unpackWARs如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接从WAR文件中运行应用程序
autoDeploy:在tomcat启动时,是否自动部署。
xmlValidation:是否启动xml的校验功能,一般xmlValidation="false"。
xmlNamespaceAware:检测名称空间,一般xmlNamespaceAware="false"。
-->
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<!--
Context表示一个web应用程序,通常为WAR文件
docBase应用程序的路径或者是WAR文件存放的路径,也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径。
path表示此web应用程序的url的前缀,这样请求的url为http://localhost:8080/path/****
reloadable这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化,自动装载新的应用程序,可以在不重启tomcat的情况下改变应用程序
-->
<Context path="" docBase="" debug=""/>
<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>
</Server>
WEB站点部署
上线的代码有两种方式
第一种方式是直接将程序目录放在webapps目录下面
第二种方式是使用开发工具将程序打包成war包,然后上传到webapps目录下面
站点目录
1、上传程序到 /application/tomcat/webapps 目录(默认目录)
http://10.0.0.41:8080/memtest/meminfo.jsp
2、 自定义目录
/application/tomcat/conf/server.xml
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<!--添加下面这行-->
<Context path="" docBase="/application/tomcat/webapps/memtest" debug="0" reloadable="false" crossContext="true"/>
tomcat多实例集群
mkdir -p /data/www/www/ROOT-v
tomcat复制两份
sed -i '22s#8005#8011#;69s#8080#8081#;123s#appBase=".*"# appBase="/data/www/www"#' /application/tomcat8_1/conf/server.xml
sed -i '22s#8005#8012#;69s#8080#8082#;123s#appBase=".*"# appBase="/data/www/www"#' /application/tomcat8_2/conf/server.xml
http://10.0.0.41:8081/meminfo.jsp
http://10.0.0.41:8082/meminfo.jsp
nginx+tomcat反向代理集群
cat nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream backend {
server 10.0.0.41:8081 weight=1;
server 10.0.0.41:8082 weight=1;
}
server {
listen 80;
server_name www.etiantian.org;
location / {
index index.jsp index.html index.htm;
proxy_pass http://backend;
proxy_set_header Host $host;
}
}
}
JPress
http://www.jpress.io/article/33
https://gitee.com/GalaIO/jpress/blob/master/wars/jpress-web-newest.war
解压war包
jar xf /home/oldboy/tools/jpress-web-newest.war
或
cp jpress-web-newest.war /application/tomcat/webapps/
ln -s /application/tomcat/webapps/jpress-web-newest /application/tomcat/webapps/jpress
create database jpress DEFAULT CHARACTER SET utf8;
grant all on jpress.* to jpress@'localhost' identified by '123456';
http://10.0.0.51:8080/jpress
后台
http://10.0.0.51:8080/jpress/admin
jpress 连接数据库文件
cat WEB-INF/classes/db.properties
#Auto create by JPress
#Wed Mar 20 10:57:50 CST 2019
db_name=jpress
db_host_port=3306
db_tablePrefix=jpress_
db_host=172.16.1.51
db_password=123456
db_user=jpress
tomcat https
#创建证书
openssl genrsa -idea -out server.key 2048
openssl req -days 36500 -x509 -sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt
vim conf/server.xml
...
<Connector port="443" protocol="HTTP/1.1"
connectionTimeout="20000"
maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
SSLCertificateFile="/usr/local/ssl/server.crt"
SSLCertificateKeyFile="/usr/local/ssl/server.key"
SSLVerifyClient="optional" SSLProtocol="TLSv1+TLSv1.1+TLSv1.2"/>
...
tomcat软链接使用
建立软连接的目的是隔离tomcat里目录或文件,主要是隔离webapps里的项目或者静态资源文件,以实现部署和维护的方便。在tomcat里context.xml文件里设置allowLinking="true"就可以打开软连接,根据tomcat版本不同有不同的设置
tomcat567版本:
<Context allowLinking="true" />
tomcat89版本:
<Context>
<Resources allowLinking="true" />
</Context>
tomcat监控
查看java进程
jps -lvm
监控工具
jconsole.exe
vim /application/tomcat8_1/bin/catalina.sh
97行下面添加:
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=172.16.1.41"
host解析
10.0.0.41 backup
windows下 运行jconsole.exe
jvisualvm.exe
监控tomcat
[root@backup ~]# sh show-busy-java-threads.sh
[1] Busy(0.1%) thread(3282/0xcd2) stack of java process(3273) under user(root):
"VM Periodic Task Thread" os_prio=0 tid=0x00007fb31c0b9000 nid=0xcd2 waiting on condition
[2] Busy(0.1%) thread(3279/0xccf) stack of java process(3273) under user(root):
"C2 CompilerThread0" #5 daemon prio=9 os_prio=0 tid=0x00007fb31c0ae000 nid=0xccf waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
[3] Busy(0.1%) thread(3259/0xcbb) stack of java process(3250) under user(root):
"VM Periodic Task Thread" os_prio=0 tid=0x00007f36740b9000 nid=0xcbb waiting on condition
[4] Busy(0.1%) thread(3256/0xcb8) stack of java process(3250) under user(root):
"C2 CompilerThread0" #5 daemon prio=9 os_prio=0 tid=0x00007f36740ae000 nid=0xcb8 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
[5] Busy(0.0%) thread(3441/0xd71) stack of java process(3273) under user(root):
"Attach Listener" #55 daemon prio=9 os_prio=0 tid=0x00007fb2f4047000 nid=0xd71 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
jmap -heap 2588
zabbix监控tomcat
yum install zabbix-java-gateway
说明,局域网中有 一个 zabbix-java-gateway 就可以
vim /etc/zabbix/zabbix_server.conf
添加
JavaGateway=zabbix-java-gateway 所在机器的ip地址
JavaGatewayPort=10052
StartJavaPollers=5
启动zabbix-server
启动zabbix-java-gateway
/etc/init.d/zabbix-java-gateway start
添加主机
Tomcat安全优化和性能优化
安全优化
关闭管理端口保护 8005 SHUTDOWN
ajp连接端口保护 8009 注释
禁用管理端 删除tomcat自带的管理程序
降权启动 降低用户权限启动
修改tomcat版本信息
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
server="nginx/1.16.1"
redirectPort="8443" />
性能优化
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="6000" enableLookups="false" maxThreads="800" acceptCount="800"
redirectPort="8443" />
minSpareThreads="10" #空闲时候最小的线程数量
compression="on" #开启 tomcat压缩功能 静态文本资源 html js css
compressionMinSize="2048" #压缩文件 最小2048字节
compressableMimeType="text/html,text/plain,text/css,application/javascript,application/json,application/x-font-ttf,application/x-font-otf" #压缩哪些类型的文件
Nio2模式
<Connector port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
connectionTimeout="20000"
redirectPort="8443" />
apr模式
yum install apr apr-devel
http://tomcat.apache.org/tomcat-8.5-doc/apr.html
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib
export LD_RUN_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib
jvm调优
Tomcat最吃内存,只要内存足够,这只猫就跑的很快
如果系统资源有限,那就需要进行调优,提高资源使用率
优化catalina.sh配置文件。在catalina.sh配置文件中添加以下代码:
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m"
server:一定要作为第一个参数,在多个CPU时性能佳
-Xms:初始堆内存Heap大小,使用的最小内存,cpu性能高时此值应设的大一些
-Xmx:初始堆内存heap最大值,使用的最大内存
上面两个值是分配JVM的最小和最大内存,取决于硬件物理内存的大小,建议均设为物理内存的一半。
-XX:PermSize:设定内存的永久保存区域
-XX:MaxPermSize:设定最大内存的永久保存区域
-XX:MaxNewSize:
-Xss 15120 这使得JBoss每增加一个线程(thread)就会立即消耗15M内存,而最佳值应该是128K,默认值好像是512k.
+XX:AggressiveHeap 会使得 Xms没有意义。这个参数让jvm忽略Xmx参数,疯狂地吃完一个G物理内存,再吃尽一个G的swap。
-Xss:每个线程的Stack大小
-verbose:gc 现实垃圾收集信息
-Xloggc:gc.log 指定垃圾收集日志文件
-Xmn:young generation的heap大小,一般设置为Xmx的3、4分之一
-XX:+UseParNewGC :缩短minor收集的时间
-XX:+UseConcMarkSweepGC :缩短major收集的时间
http://www.cnblogs.com/xingzc/p/5756119.html
tomcat session共享
https://github.com/ran-jit/tomcat-cluster-redis-session-manager