tomcat

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,服务器资源利用率就高了

  1. 软件准备

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/

  1. 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)
  1. 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/
  1. 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文件
  1. 启动&停止

启动程序

/application/tomcat/bin/startup.sh

关闭程序

/application/tomcat/bin/shutdown.sh
  1. 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 
  1. 查看进程端口
[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   
  1. 访问

http://10.0.0.41:8080/

tomcat日志

tail -f /application/tomcat/logs/catalina.out
  1. 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
  1. 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"
  1. 编辑一个 jsp文件

vim /opt/tomcat1/webapps/ROOT/test.jsp

<%= new java.util.Date() %>
  1. 组件详解
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连接至数据库中查找认证用户。
  1. 配置文件注释
<?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 &quot;%r&quot; %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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wuxingge

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值